Mercurial Hosting > traffic-intelligence
changeset 895:739acd338cc0
added script to extract camera info from tacal file by Lund University (T analyst)
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Thu, 01 Jun 2017 14:54:11 -0400 |
parents | 0c1fed9e8862 |
children | 6624484c0d55 |
files | python/cvutils.py python/storage.py scripts/compute-homography.py scripts/extract-camera-parameters.py |
diffstat | 4 files changed, 46 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/python/cvutils.py Thu Jun 01 10:33:07 2017 -0400 +++ b/python/cvutils.py Thu Jun 01 14:54:11 2017 -0400 @@ -388,6 +388,14 @@ H, mask = cv2.findHomography(array(srcPoints), array(dstPoints), method = 0) # No need for different methods for finding homography return H + def getIntrinsicCameraMatrix(cameraData): + return array([[cameraData['f']*cameraData['Sx']/cameraData['dx'], 0, cameraData['Cx']], + [0, cameraData['f']/cameraData['dy'], cameraData['Cy']], + [0, 0, 1.]]) + + def getDistortionCoefficients(cameraData): + return array([cameraData['k']]+4*[0]) + def undistortedCoordinates(map1, map2, x, y, maxDistance = 1.): '''Returns the coordinates of a point in undistorted image map1 and map2 are the mapping functions from undistorted image @@ -480,11 +488,11 @@ ## Close up image loading and calibrate cv2.destroyAllWindows() if len(objpoints) == 0 or len(imgpoints) == 0: - return False + return None try: ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) except NameError: - return False + return None savetxt('intrinsic-camera.txt', camera_matrix) return camera_matrix, dist_coeffs
--- a/python/storage.py Thu Jun 01 10:33:07 2017 -0400 +++ b/python/storage.py Thu Jun 01 14:54:11 2017 -0400 @@ -1209,6 +1209,22 @@ out.close() +def loadPinholeCameraModel(filename, tanalystFormat = True): + '''Loads the data from a file containing the camera parameters + (pinhole camera model, http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html) + and returns a dictionary''' + if tanalystFormat: + f = openCheck(filename, quitting = True) + content = getLines(f) + cameraData = {} + for l in content: + tmp = l.split(':') + cameraData[tmp[0]] = float(tmp[1].strip().replace(',','.')) + return cameraData + else: + print('Unknown camera model (not tanalyst format') + return None + def savePositionsToCsv(f, obj): timeInterval = obj.getTimeInterval() positions = obj.getPositions()
--- a/scripts/compute-homography.py Thu Jun 01 10:33:07 2017 -0400 +++ b/scripts/compute-homography.py Thu Jun 01 14:54:11 2017 -0400 @@ -83,12 +83,7 @@ homography, mask = cv2.findHomography(videoPts, worldPts) # method=0, ransacReprojThreshold=3 elif args.tsaiCameraFilename is not None: # hack using PDTV from pdtv import TsaiCamera - f = storage.openCheck(args.tsaiCameraFilename, quitting = True) - content = storage.getLines(f) - cameraData = {} - for l in content: - tmp = l.split(':') - cameraData[tmp[0]] = float(tmp[1].strip().replace(',','.')) + cameraData = storage.loadPinholeCameraModel(args.tsaiCameraFilename) camera = TsaiCamera(Cx=cameraData['Cx'], Cy=cameraData['Cy'], Sx=cameraData['Sx'], Tx=cameraData['Tx'], Ty=cameraData['Ty'], Tz=cameraData['Tz'], dx=cameraData['dx'], dy=cameraData['dy'], f=cameraData['f'], k=cameraData['k'], r1=cameraData['r1'], r2=cameraData['r2'], r3=cameraData['r3'], r4=cameraData['r4'], r5=cameraData['r5'], r6=cameraData['r6'], r7=cameraData['r7'], r8=cameraData['r8'], r9=cameraData['r9']) homography = cvutils.computeHomographyFromPDTV(camera) elif args.videoFrameFilename is not None and args.worldFilename is not None:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/extract-camera-parameters.py Thu Jun 01 14:54:11 2017 -0400 @@ -0,0 +1,19 @@ +#! /usr/bin/env python + +import argparse + +import storage, cvutils + +parser = argparse.ArgumentParser(description='The program extracts the intrinsic camera from the tacal camera calibration file used by T-Analyst (http://www.tft.lth.se/en/research/video-analysis/co-operation/software/t-analyst/).') +parser.add_argument('-i', dest = 'filename', help = 'filename of the camera calibration (.tacal)', required = True) +parser.add_argument('-o', dest = 'outputIntrinsicFilename', help = 'filename of the intrinsic camera matrix', default = 'intrinsic-camera.txt') + +args = parser.parse_args() + +cameraData = storage.loadPinholeCameraModel(args.filename, True) +if cameraData is not None: + from numpy import savetxt + intrinsicCameraMatrix = cvutils.getIntrinsicCameraMatrix(cameraData) + distortionCoefficients = cvutils.getDistortionCoefficients(cameraData) + savetxt(args.outputIntrinsicFilename, intrinsicCameraMatrix) + print(distortionCoefficients)