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)