Mercurial Hosting > traffic-intelligence
changeset 638:852f5de42d01
added functionality to read Aliaksei Tsai camera model data
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Wed, 08 Apr 2015 16:07:15 +0200 |
parents | c9a0b72979fd |
children | 4e7925cb4f8f |
files | python/cvutils.py scripts/compute-homography.py |
diffstat | 2 files changed, 17 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/python/cvutils.py Thu Apr 02 15:53:59 2015 +0200 +++ b/python/cvutils.py Wed Apr 08 16:07:15 2015 +0200 @@ -277,7 +277,7 @@ else: print 'Cannot load file ' + videoFilename - def computeHomographyFromPDTV(cameraFilename, method=0, ransacReprojThreshold=3.0): + def computeHomographyFromPDTV(cameraFilename): '''Returns the homography matrix at ground level from PDTV format https://bitbucket.org/hakanardo/pdtv''' import pdtv @@ -288,7 +288,7 @@ for srcPoint in srcPoints: projected = camera.image_to_world(tuple(srcPoint)) dstPoints.append([projected[0], projected[1]]) - H, mask = cv2.findHomography(array(srcPoints), array(dstPoints), method, ransacReprojThreshold) + H, mask = cv2.findHomography(array(srcPoints), array(dstPoints), method = 0) # No need for different methods for finding homography return H def undistortedCoordinates(map1, map2, x, y, maxDistance = 1.):
--- a/scripts/compute-homography.py Thu Apr 02 15:53:59 2015 +0200 +++ b/scripts/compute-homography.py Wed Apr 08 16:07:15 2015 +0200 @@ -6,8 +6,9 @@ import numpy as np import cv2 -import cvutils -import utils +import cvutils, utils, storage + +# TODO add option to use RANSAC or other robust homography estimation method? parser = argparse.ArgumentParser(description='The program computes the homography matrix from at least 4 non-colinear point correspondences inputed in the same order in a video frame and a aerial photo/ground map, or from the list of corresponding points in the two planes.', epilog = '''The point correspondence file contains at least 4 non-colinear point coordinates with the following format: @@ -20,6 +21,7 @@ in the same order the corresponding points in world and image spaces.''', formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-p', dest = 'pointCorrespondencesFilename', help = 'name of the text file containing the point correspondences') +parser.add_argument('--tsai', dest = 'tsaiCameraFilename', help = 'name of the text file containing the camera parameter following the pinhole camera model (Lund format)') # caution, this is Aliaksei's format parser.add_argument('-i', dest = 'videoFrameFilename', help = 'filename of the video frame') parser.add_argument('-w', dest = 'worldFilename', help = 'filename of the aerial photo/ground map') parser.add_argument('-n', dest = 'nPoints', help = 'number of corresponding points to input', default = 4, type = int) @@ -78,6 +80,16 @@ if args.pointCorrespondencesFilename is not None: worldPts, videoPts = cvutils.loadPointCorrespondences(args.pointCorrespondencesFilename) homography, mask = cv2.findHomography(videoPts, worldPts) # method=0, ransacReprojThreshold=3 +elif args.tsaiCameraFilename is not None: # hack using PDTV + f = storage.openCheck(args.tsaiCameraFilename, quitting = True) + content = storage.getLines(f) + outFilename = '/tmp/camera.yaml' + out = storage.openCheck(outFilename, 'w') + out.write('data_class: TsaiCamera\n') + for l in content: + out.write(l.replace(' f:', 'f:').replace(' k:', 'k:').replace(',','.')+'\n') + out.close() + homography = cvutils.computeHomographyFromPDTV(outFilename) elif args.videoFrameFilename is not None and args.worldFilename is not None: worldImg = plt.imread(args.worldFilename) videoImg = plt.imread(args.videoFrameFilename) @@ -103,7 +115,7 @@ if homography.size>0: np.savetxt('homography.txt',homography) -if args.displayPoints and args.videoFrameFilename is not None and args.worldFilename is not None and homography.size>0: +if args.displayPoints and args.videoFrameFilename is not None and args.worldFilename is not None and homography.size>0 and args.tsaiCameraFilename is None: worldImg = cv2.imread(args.worldFilename) videoImg = cv2.imread(args.videoFrameFilename) if args.undistort: