comparison scripts/compute-homography.py @ 510:b0dac840c24f

compute homography works with undistortion
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 23 May 2014 17:33:11 -0400
parents d337bffd7283
children bd1ad468e928
comparison
equal deleted inserted replaced
509:935430b1d408 510:b0dac840c24f
23 parser.add_argument('-i', dest = 'videoFrameFilename', help = 'filename of the video frame') 23 parser.add_argument('-i', dest = 'videoFrameFilename', help = 'filename of the video frame')
24 parser.add_argument('-w', dest = 'worldFilename', help = 'filename of the aerial photo/ground map') 24 parser.add_argument('-w', dest = 'worldFilename', help = 'filename of the aerial photo/ground map')
25 parser.add_argument('-n', dest = 'nPoints', help = 'number of corresponding points to input', default = 4, type = int) 25 parser.add_argument('-n', dest = 'nPoints', help = 'number of corresponding points to input', default = 4, type = int)
26 parser.add_argument('-u', dest = 'unitsPerPixel', help = 'number of units per pixel', default = 1., type = float) 26 parser.add_argument('-u', dest = 'unitsPerPixel', help = 'number of units per pixel', default = 1., type = float)
27 parser.add_argument('--display', dest = 'displayPoints', help = 'display original and projected points on both images', action = 'store_true') 27 parser.add_argument('--display', dest = 'displayPoints', help = 'display original and projected points on both images', action = 'store_true')
28 parser.add_argument('--intrinsic', dest = 'intrinsicCameraMatrixFilename', help = 'name of the intrinsic camera file')
29 parser.add_argument('--distortion-coefficients', dest = 'distortionCoefficients', help = 'distortion coefficients', nargs = '*', type = float)
30 parser.add_argument('--undistorted-multiplication', dest = 'undistortedImageMultiplication', help = 'undistorted image multiplication', type = float)
31 parser.add_argument('--undistort', dest = 'undistort', help = 'undistort the video (because features have been extracted that way)', action = 'store_true')
28 32
29 args = parser.parse_args() 33 args = parser.parse_args()
30 34
31 # TODO process camera intrinsic and extrinsic parameters to obtain image to world homography, taking example from Work/src/python/generate-homography.py script 35 # TODO process camera intrinsic and extrinsic parameters to obtain image to world homography, taking example from Work/src/python/generate-homography.py script
32 # cameraMat = load(videoFilenamePrefix+'-camera.txt'); 36 # cameraMat = load(videoFilenamePrefix+'-camera.txt');
74 worldPts, videoPts = cvutils.loadPointCorrespondences(args.pointCorrespondencesFilename) 78 worldPts, videoPts = cvutils.loadPointCorrespondences(args.pointCorrespondencesFilename)
75 homography, mask = cv2.findHomography(videoPts, worldPts) # method=0, ransacReprojThreshold=3 79 homography, mask = cv2.findHomography(videoPts, worldPts) # method=0, ransacReprojThreshold=3
76 elif args.videoFrameFilename != None and args.worldFilename != None: 80 elif args.videoFrameFilename != None and args.worldFilename != None:
77 worldImg = plt.imread(args.worldFilename) 81 worldImg = plt.imread(args.worldFilename)
78 videoImg = plt.imread(args.videoFrameFilename) 82 videoImg = plt.imread(args.videoFrameFilename)
83 if args.undistort:
84 [map1, map2] = cvutils.computeUndistortMaps(videoImg.shape[1], videoImg.shape[0], args.undistortedImageMultiplication, np.loadtxt(args.intrinsicCameraMatrixFilename), args.distortionCoefficients)
85 videoImg = cv2.remap(videoImg, map1, map2, interpolation=cv2.INTER_LINEAR)
79 print('Click on {0} points in the video frame'.format(args.nPoints)) 86 print('Click on {0} points in the video frame'.format(args.nPoints))
80 plt.figure() 87 plt.figure()
81 plt.imshow(videoImg) 88 plt.imshow(videoImg)
82 videoPts = np.array(plt.ginput(args.nPoints, timeout=3000)) 89 videoPts = np.array(plt.ginput(args.nPoints, timeout=3000))
83 print('Click on {0} points in the world image'.format(args.nPoints)) 90 print('Click on {0} points in the world image'.format(args.nPoints))
96 np.savetxt('homography.txt',homography) 103 np.savetxt('homography.txt',homography)
97 104
98 if args.displayPoints and args.videoFrameFilename != None and args.worldFilename != None and homography.size>0: 105 if args.displayPoints and args.videoFrameFilename != None and args.worldFilename != None and homography.size>0:
99 worldImg = cv2.imread(args.worldFilename) 106 worldImg = cv2.imread(args.worldFilename)
100 videoImg = cv2.imread(args.videoFrameFilename) 107 videoImg = cv2.imread(args.videoFrameFilename)
108 if args.undistort:
109 [map1, map2] = cvutils.computeUndistortMaps(videoImg.shape[1], videoImg.shape[0], args.undistortedImageMultiplication, np.loadtxt(args.intrinsicCameraMatrixFilename), args.distortionCoefficients)
110 videoImg = cv2.remap(videoImg, map1, map2, interpolation=cv2.INTER_LINEAR)
101 invHomography = np.linalg.inv(homography) 111 invHomography = np.linalg.inv(homography)
102 projectedWorldPts = cvutils.projectArray(invHomography, worldPts.T).T 112 projectedWorldPts = cvutils.projectArray(invHomography, worldPts.T).T
103 projectedVideoPts = cvutils.projectArray(homography, videoPts.T).T 113 projectedVideoPts = cvutils.projectArray(homography, videoPts.T).T
104 for i in range(worldPts.shape[0]): 114 for i in range(worldPts.shape[0]):
105 # world image 115 # world image