Mercurial Hosting > traffic-intelligence
annotate python/cvutils.py @ 171:8e7b354666ec
corrected bug in to get images from video
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 17 Oct 2011 14:16:50 -0400 |
parents | b0719b3ad3db |
children | e2f31813ade6 |
rev | line source |
---|---|
28 | 1 #! /usr/bin/env python |
2 '''Image/Video utilities''' | |
3 | |
4 import Image, ImageDraw # PIL | |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
5 try: |
151
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
6 import cv2 |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
7 opencvExists = True |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
8 except ImportError: |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
9 print('OpenCV library could not be loaded') |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
10 opencvExists = False |
99
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
11 from sys import stdout |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
12 |
151
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
13 import utils |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
14 |
44
be3ae926e4e8
added simple intersection description, function to load collision points
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
28
diff
changeset
|
15 #import aggdraw # agg on top of PIL (antialiased drawing) |
28 | 16 #import utils |
17 | |
18 __metaclass__ = type | |
19 | |
151
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
20 cvRed = (0,0,255) |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
21 cvGreen = (0,255,0) |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
22 cvBlue = (255,0,0) |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
23 cvColors = utils.PlottingPropertyValues([cvRed, |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
24 cvGreen, |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
25 cvBlue]) |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
26 |
156
2eef5620c0b3
added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
154
diff
changeset
|
27 cvKeyNumbers = {'a':1048673, |
2eef5620c0b3
added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
154
diff
changeset
|
28 'n': 1048686, |
2eef5620c0b3
added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
154
diff
changeset
|
29 'y': 1048697} |
2eef5620c0b3
added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
154
diff
changeset
|
30 |
28 | 31 def drawLines(filename, origins, destinations, w = 1, resultFilename='image.png'): |
32 '''Draws lines over the image ''' | |
33 | |
34 img = Image.open(filename) | |
35 | |
36 draw = ImageDraw.Draw(img) | |
37 #draw = aggdraw.Draw(img) | |
38 #pen = aggdraw.Pen("red", width) | |
39 for p1, p2 in zip(origins, destinations): | |
40 draw.line([p1.x, p1.y, p2.x, p2.y], width = w, fill = (256,0,0)) | |
41 #draw.line([p1.x, p1.y, p2.x, p2.y], pen) | |
42 del draw | |
43 | |
44 #out = utils.openCheck(resultFilename) | |
45 img.save(resultFilename) | |
46 | |
159
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
47 def matlab2PointCorrespondences(filename): |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
48 '''Loads and converts the point correspondences saved |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
49 by the matlab camera calibration tool''' |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
50 from numpy.lib.io import loadtxt, savetxt |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
51 from numpy.lib.function_base import append |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
52 points = loadtxt(filename, delimiter=',') |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
53 savetxt(utils.removeExtension(filename)+'-point-correspondences.txt',append(points[:,:2].T, points[:,3:].T, axis=0)) |
115f7f90286d
updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
156
diff
changeset
|
54 |
160
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
55 def loadPointCorrespondences(filename): |
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
56 '''Loads and returns the corresponding points in world (first 2 lines) and image spaces (last 2 lines)''' |
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
57 from numpy.lib.io import loadtxt |
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
58 from numpy import float32 |
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
59 points = loadtxt(filename, dtype=float32) |
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
60 return (points[:2,:].T, points[2:,:].T) # (world points, image points) |
b0719b3ad3db
created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
159
diff
changeset
|
61 |
99
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
62 def computeHomography(srcPoints, dstPoints, method=0, ransacReprojThreshold=0.0): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
63 '''Returns the homography matrix mapping from srcPoints to dstPoints (dimension Nx2)''' |
151
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
64 #cvSrcPoints = arrayToCvMat(srcPoints); |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
65 #cvDstPoints = arrayToCvMat(dstPoints); |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
66 #H = cv.CreateMat(3, 3, cv.CV_64FC1) |
4af774bb186d
wrote a simple script to compute homography from point correspondences and display the reprojection for visual verification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
150
diff
changeset
|
67 H, mask = cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold) |
99
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
68 return H |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
69 |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
70 def cvMatToArray(cvmat): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
71 '''Converts an OpenCV CvMat to numpy array.''' |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
72 from numpy.core.multiarray import zeros |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
73 a = zeros((cvmat.rows, cvmat.cols))#array([[0.0]*cvmat.width]*cvmat.height) |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
74 for i in xrange(cvmat.rows): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
75 for j in xrange(cvmat.cols): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
76 a[i,j] = cvmat[i,j] |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
77 return a |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
78 |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
79 if opencvExists: |
152
74b1fc68d4df
re-organized code to avoid cyclic python module dependencies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
151
diff
changeset
|
80 def arrayToCvMat(a, t = cv2.cv.CV_64FC1): |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
81 '''Converts a numpy array to an OpenCV CvMat, with default type CV_64FC1.''' |
152
74b1fc68d4df
re-organized code to avoid cyclic python module dependencies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
151
diff
changeset
|
82 cvmat = cv2.cv.CreateMat(a.shape[0], a.shape[1], t) |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
83 for i in range(cvmat.rows): |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
84 for j in range(cvmat.cols): |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
85 cvmat[i,j] = a[i,j] |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
86 return cvmat |
99
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
87 |
149
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
88 def playVideo(filename): |
150
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
89 '''Plays the video''' |
149
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
90 capture = cv2.VideoCapture(filename) |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
91 if capture.isOpened(): |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
92 key = -1 |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
93 while key!= 1048689: # 'q' |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
94 ret, img = capture.read() |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
95 if ret: |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
96 cv2.imshow('frame', img) |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
97 key = cv2.waitKey(5) |
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
98 |
150
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
99 def getImagesFromVideo(filename, nImages = 1): |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
100 '''Returns nImages images from the video sequence''' |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
101 images = [] |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
102 capture = cv2.VideoCapture(filename) |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
103 if capture.isOpened(): |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
104 ret = False |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
105 while len(images)<nImages: |
171
8e7b354666ec
corrected bug in to get images from video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
160
diff
changeset
|
106 ret, img = capture.read() |
150
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
107 while not ret: |
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
108 ret, img = capture.read() |
171
8e7b354666ec
corrected bug in to get images from video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
160
diff
changeset
|
109 if img.size>0: |
8e7b354666ec
corrected bug in to get images from video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
160
diff
changeset
|
110 images.append(img) |
150
404f3cade05f
added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
149
diff
changeset
|
111 return images |
149
0f552c8b1650
added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
112 |
99
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
113 def printCvMat(cvmat, out = stdout): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
114 '''Prints the cvmat to out''' |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
115 for i in xrange(cvmat.rows): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
116 for j in xrange(cvmat.cols): |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
117 out.write('{0} '.format(cvmat[i,j])) |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
118 out.write('\n') |
e7dc5a780f09
added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
98
diff
changeset
|
119 |
98
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
120 def projectArray(homography, points): |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
121 '''Returns the coordinates of the projected points (format 2xN points) |
28 | 122 through homography''' |
123 from numpy.core._dotblas import dot | |
124 from numpy.core.multiarray import array | |
98
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
125 from numpy.lib.function_base import append |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
126 |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
127 if points.shape[0] != 2: |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
128 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
129 |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
130 if (homography!=None) and homography.size>0: |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
131 augmentedPoints = append(points,[[1]*points.shape[1]], 0) |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
132 prod = dot(homography, augmentedPoints) |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
133 return prod[0:2]/prod[2] |
28 | 134 else: |
135 return p | |
136 | |
98
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
137 def project(homography, p): |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
138 '''Returns the coordinates of the projection of the point p |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
139 through homography''' |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
140 from numpy.core.multiarray import array |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
141 return projectArray(homography, array([[p[0]],p[1]])) |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
142 |
28 | 143 def projectTrajectory(homography, trajectory): |
144 '''Projects a series of points in the format | |
145 [[x1, x2, ...], | |
98
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
146 [y1, y2, ...]]''' |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
147 from numpy.core.multiarray import array |
b85912ab4064
refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
63
diff
changeset
|
148 return projectArray(homography, array(trajectory)) |
28 | 149 |
48
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
150 def invertHomography(homography): |
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
151 'Returns an inverted homography' |
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
152 from numpy.linalg.linalg import inv |
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
153 invH = inv(homography) |
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
154 invH /= invH[2,2] |
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
155 return invH |
8aed225f71d8
rearranged code for function readline and getlines (and characters), moved invertHomography to cvutils
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
44
diff
changeset
|
156 |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
157 if opencvExists: |
154
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
158 def computeTranslation(img1, img2, img1Points, maxTranslation2, minNMatches, windowSize = (5,5), level = 5, criteria = (cv2.TERM_CRITERIA_EPS, 0, 0.01)): |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
159 '''Computes the translation of img2 with respect to img1 |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
160 (loaded using OpenCV as numpy arrays) |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
161 img1Points are used to compute the translation |
100
2a3cafcf5faf
added function to compute the translation between two images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
99
diff
changeset
|
162 |
154
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
163 TODO add diagnostic if data is all over the place, and it most likely is not a translation (eg zoom, other non linear distortion)''' |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
164 from numpy.core.multiarray import array |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
165 from numpy.lib.function_base import median |
154
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
166 from numpy.core.fromnumeric import sum |
100
2a3cafcf5faf
added function to compute the translation between two images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
99
diff
changeset
|
167 |
154
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
168 nextPoints = array([]) |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
169 (img2Points, status, track_error) = cv2.calcOpticalFlowPyrLK(img1, img2, img1Points, nextPoints, winSize=windowSize, maxLevel=level, criteria=criteria) |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
170 # calcOpticalFlowPyrLK(prevImg, nextImg, prevPts[, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, derivLambda[, flags]]]]]]]]) -> nextPts, status, err |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
171 delta = [] |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
172 for (k, (p1,p2)) in enumerate(zip(img1Points, img2Points)): |
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
173 if status[k] == 1: |
154
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
174 dp = p2-p1 |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
175 d = sum(dp**2) |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
176 if d < maxTranslation2: |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
177 delta.append(dp) |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
178 if len(delta) >= minNMatches: |
668710d4c773
updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
152
diff
changeset
|
179 return median(delta, axis=0) |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
180 else: |
156
2eef5620c0b3
added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
154
diff
changeset
|
181 print(dp) |
112
67555e968b5e
added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
102
diff
changeset
|
182 return None |