annotate python/cvutils.py @ 766:6022350f8173 dev

updated to OpenCV 3.1
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 21 Dec 2015 15:15:45 -0500
parents 43ae3a1af290
children dfdb2a3722cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
1 #! /usr/bin/env python
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
2 '''Image/Video utilities'''
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
3
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
4 import utils
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
5
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
6 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
7 import cv2
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
8 opencvAvailable = True
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
9 except ImportError:
501
c81cbd6953fb update to classify speed to remove data at both ends
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
10 print('OpenCV library could not be loaded (video replay functions will not be available)') # TODO change to logging module
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
11 opencvAvailable = False
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
12 try:
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
13 import skimage
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
14 skimageAvailable = True
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
15 except ImportError:
410
91954c76d12c minor changes to error messages when loading libraries
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 406
diff changeset
16 print('Scikit-image library could not be loaded (HoG-based classification methods will not be available)')
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
17 skimageAvailable = False
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
18
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
19 from sys import stdout
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
20 from numpy import dot, array, append, float32
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
21
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
22 #import aggdraw # agg on top of PIL (antialiased drawing)
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
23
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
24
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
25 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
26 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
27 cvBlue = (255,0,0)
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
28 cvCyan = (255, 255, 0)
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
29 cvYellow = (0, 255, 255)
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
30 cvMagenta = (255, 0, 255)
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
31 cvWhite = (255, 255, 255)
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
32 cvBlack = (0,0,0)
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
33 cvColors3 = utils.PlottingPropertyValues([cvRed,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
34 cvGreen,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
35 cvBlue])
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
36 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
37 cvGreen,
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
38 cvBlue,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
39 cvCyan,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
40 cvYellow,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
41 cvMagenta,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
42 cvWhite,
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
43 cvBlack])
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
44
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
45 def quitKey(key):
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
46 return chr(key&255)== 'q' or chr(key&255) == 'Q'
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
47
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
48 def saveKey(key):
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
49 return chr(key&255) == 's'
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
50
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
51 def int2FOURCC(x):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
52 fourcc = ''
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
53 for i in xrange(4):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
54 fourcc += unichr((x >> 8*i)&255)
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
55 return fourcc
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
56
515
727e3c529519 renamed all draw functions to plot for consistency
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 511
diff changeset
57 def plotLines(filename, origins, destinations, w = 1, resultFilename='image.png'):
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
58 '''Draws lines over the image '''
410
91954c76d12c minor changes to error messages when loading libraries
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 406
diff changeset
59 import Image, ImageDraw # PIL
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
60
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
61 img = Image.open(filename)
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
62
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
63 draw = ImageDraw.Draw(img)
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
64 #draw = aggdraw.Draw(img)
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
65 #pen = aggdraw.Pen("red", width)
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
66 for p1, p2 in zip(origins, destinations):
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
67 draw.line([p1.x, p1.y, p2.x, p2.y], width = w, fill = (256,0,0))
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
68 #draw.line([p1.x, p1.y, p2.x, p2.y], pen)
515
727e3c529519 renamed all draw functions to plot for consistency
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 511
diff changeset
69 del draw
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
70
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
71 #out = utils.openCheck(resultFilename)
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
72 img.save(resultFilename)
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
73
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
74 def rgb2gray(rgb):
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
75 return dot(rgb[...,:3], [0.299, 0.587, 0.144])
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
76
159
115f7f90286d updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 156
diff changeset
77 def matlab2PointCorrespondences(filename):
115f7f90286d updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 156
diff changeset
78 '''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
79 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
80 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
81 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
82 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
83 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
84
160
b0719b3ad3db created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 159
diff changeset
85 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
86 '''Loads and returns the corresponding points in world (first 2 lines) and image spaces (last 2 lines)'''
672
5473b7460375 moved and rationalized imports in modules
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
87 from numpy import loadtxt, float32
160
b0719b3ad3db created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 159
diff changeset
88 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
89 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
90
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
91 def cvMatToArray(cvmat):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
92 '''Converts an OpenCV CvMat to numpy array.'''
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
93 print('Deprecated, use new interface')
672
5473b7460375 moved and rationalized imports in modules
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
94 from numpy import zeros
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
95 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
96 for i in xrange(cvmat.rows):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
97 for j in xrange(cvmat.cols):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
98 a[i,j] = cvmat[i,j]
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
99 return a
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
100
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
101 if opencvAvailable:
402
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
102 def computeHomography(srcPoints, dstPoints, method=0, ransacReprojThreshold=3.0):
302
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 266
diff changeset
103 '''Returns the homography matrix mapping from srcPoints to dstPoints (dimension Nx2)'''
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 266
diff changeset
104 H, mask = cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold)
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 266
diff changeset
105 return H
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 266
diff changeset
106
406
37c7b46f6e21 update to OpenCV 2.6
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 402
diff changeset
107 def arrayToCvMat(a, t = cv2.CV_64FC1):
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
108 '''Converts a numpy array to an OpenCV CvMat, with default type CV_64FC1.'''
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
109 print('Deprecated, use new interface')
152
74b1fc68d4df re-organized code to avoid cyclic python module dependencies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 151
diff changeset
110 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
111 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
112 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
113 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
114 return cvmat
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
115
658
6668f541b915 Added **kwargs passthrough to cvPlot()->cv2.line() for greater drawing flexibility.
pstaub
parents: 657
diff changeset
116 def cvPlot(img, positions, color, lastCoordinate = None, **kwargs):
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
117 if lastCoordinate is None:
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
118 last = positions.length()-1
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
119 elif lastCoordinate >=0:
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
120 last = min(positions.length()-1, lastCoordinate)
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
121 for i in range(0, last):
658
6668f541b915 Added **kwargs passthrough to cvPlot()->cv2.line() for greater drawing flexibility.
pstaub
parents: 657
diff changeset
122 cv2.line(img, positions[i].asint().astuple(), positions[i+1].asint().astuple(), color, **kwargs)
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
123
385
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
124 def cvImshow(windowName, img, rescale = 1.0):
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
125 'Rescales the image (in particular if too large)'
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
126 from cv2 import resize
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
127 if rescale != 1.:
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
128 size = (int(round(img.shape[1]*rescale)), int(round(img.shape[0]*rescale)))
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
129 resizedImg = resize(img, size)
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
130 cv2.imshow(windowName, resizedImg)
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
131 else:
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
132 cv2.imshow(windowName, img)
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
133
510
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
134 def computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients):
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
135 from copy import deepcopy
672
5473b7460375 moved and rationalized imports in modules
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
136 from numpy import identity
510
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
137 newImgSize = (int(round(width*undistortedImageMultiplication)), int(round(height*undistortedImageMultiplication)))
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
138 newCameraMatrix = deepcopy(intrinsicCameraMatrix)
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
139 newCameraMatrix[0,2] = newImgSize[0]/2.
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
140 newCameraMatrix[1,2] = newImgSize[1]/2.
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
141 return cv2.initUndistortRectifyMap(intrinsicCameraMatrix, array(distortionCoefficients), identity(3), newCameraMatrix, newImgSize, cv2.CV_32FC1)
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
142
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
143 def playVideo(filename, firstFrameNum = 0, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1., step = 1):
150
404f3cade05f added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 149
diff changeset
144 '''Plays the video'''
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
145 windowName = 'frame'
685
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
146 if rescale == 1.:
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
147 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
148 wait = 5
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
149 if frameRate > 0:
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
150 wait = int(round(1000./frameRate))
381
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
151 if interactive:
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
152 wait = 0
149
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
153 capture = cv2.VideoCapture(filename)
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
154 if capture.isOpened():
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
155 key = -1
227
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
156 ret = True
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
157 frameNum = firstFrameNum
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
158 capture.set(cv2.CAP_PROP_POS_FRAMES, firstFrameNum)
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
159 while ret and not quitKey(key):
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
160 #ret, img = capture.read()
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
161 for i in xrange(step):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
162 ret, img = capture.read()
149
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
163 if ret:
381
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
164 if printFrames:
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
165 print('frame {0}'.format(frameNum))
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
166 frameNum+=step
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 628
diff changeset
167 if text is not None:
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
168 cv2.putText(img, text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed)
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
169 cvImshow(windowName, img, rescale)
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
170 key = cv2.waitKey(wait)
625
9202628a4130 saving image when playing video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 549
diff changeset
171 if saveKey(key):
9202628a4130 saving image when playing video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 549
diff changeset
172 cv2.imwrite('image-{}.png'.format(frameNum), img)
346
5f75d6c23ed5 added opencv function to destroy OpenCV windows (seems to work only on Windows)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 319
diff changeset
173 cv2.destroyAllWindows()
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
174 else:
538
bd1ad468e928 corrected bug and added capability to save undistorted image
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 528
diff changeset
175 print('Video capture for {} failed'.format(filename))
149
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
176
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
177 def infoVideo(filename):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
178 '''Provides all available info on video '''
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
179 cvPropertyNames = {cv2.CAP_PROP_FORMAT: "format",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
180 cv2.CAP_PROP_FOURCC: "codec (fourcc)",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
181 cv2.CAP_PROP_FPS: "fps",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
182 cv2.CAP_PROP_FRAME_COUNT: "number of frames",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
183 cv2.CAP_PROP_FRAME_HEIGHT: "heigh",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
184 cv2.CAP_PROP_FRAME_WIDTH: "width",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
185 cv2.CAP_PROP_RECTIFICATION: "rectification",
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
186 cv2.CAP_PROP_SATURATION: "saturation"}
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
187 capture = cv2.VideoCapture(filename)
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
188 if capture.isOpened():
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
189 for cvprop in [#cv2.CAP_PROP_BRIGHTNESS
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
190 #cv2.CAP_PROP_CONTRAST
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
191 #cv2.CAP_PROP_CONVERT_RGB
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
192 #cv2.CAP_PROP_EXPOSURE
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
193 cv2.CAP_PROP_FORMAT,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
194 cv2.CAP_PROP_FOURCC,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
195 cv2.CAP_PROP_FPS,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
196 cv2.CAP_PROP_FRAME_COUNT,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
197 cv2.CAP_PROP_FRAME_HEIGHT,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
198 cv2.CAP_PROP_FRAME_WIDTH,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
199 #cv2.CAP_PROP_GAIN,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
200 #cv2.CAP_PROP_HUE
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
201 #cv2.CAP_PROP_MODE
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
202 #cv2.CAP_PROP_POS_AVI_RATIO
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
203 #cv2.CAP_PROP_POS_FRAMES
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
204 #cv2.CAP_PROP_POS_MSEC
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
205 #cv2.CAP_PROP_RECTIFICATION,
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
206 #cv2.CAP_PROP_SATURATION
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
207 ]:
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
208 prop = capture.get(cvprop)
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
209 if cvprop == cv2.CAP_PROP_FOURCC and prop > 0:
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
210 prop = int2FOURCC(int(prop))
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
211 print('Video {}: {}'.format(cvPropertyNames[cvprop], prop))
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
212 else:
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
213 print('Video capture for {} failed'.format(filename))
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
214
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
215 def getImagesFromVideo(videoFilename, firstFrameNum = 0, nFrames = 1, saveImage = False, outputPrefix = 'image'):
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
216 '''Returns nFrames images from the video sequence'''
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
217 from math import floor, log10
150
404f3cade05f added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 149
diff changeset
218 images = []
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
219 capture = cv2.VideoCapture(videoFilename)
398
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
220 if capture.isOpened():
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
221 rawCount = capture.get(cv2.CAP_PROP_FRAME_COUNT)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
222 if rawCount < 0:
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
223 rawCount = firstFrameNum+nFrames+1
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
224 nDigits = int(floor(log10(rawCount)))+1
150
404f3cade05f added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 149
diff changeset
225 ret = False
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
226 capture.set(cv2.CAP_PROP_POS_FRAMES, firstFrameNum)
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
227 imgNum = 0
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
228 while imgNum<nFrames:
171
8e7b354666ec corrected bug in to get images from video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 160
diff changeset
229 ret, img = capture.read()
216
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
230 i = 0
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
231 while not ret and i<10:
150
404f3cade05f added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 149
diff changeset
232 ret, img = capture.read()
216
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
233 i += 1
171
8e7b354666ec corrected bug in to get images from video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 160
diff changeset
234 if img.size>0:
216
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
235 if saveImage:
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
236 imgNumStr = format(firstFrameNum+imgNum, '0{}d'.format(nDigits))
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
237 cv2.imwrite(outputPrefix+imgNumStr+'.png', img)
216
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
238 else:
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
239 images.append(img)
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
240 imgNum +=1
398
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
241 capture.release()
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
242 else:
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
243 print('Video capture for {} failed'.format(videoFilename))
150
404f3cade05f added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 149
diff changeset
244 return images
398
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
245
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
246 def getFPS(videoFilename):
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
247 capture = cv2.VideoCapture(videoFilename)
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
248 if capture.isOpened():
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
249 fps = capture.get(cv2.CAP_PROP_FPS)
398
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
250 capture.release()
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
251 return fps
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
252 else:
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
253 print('Video capture for {} failed'.format(videoFilename))
398
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
254 return None
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
255
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
256 def imageBox(img, obj, frameNum, homography, width, height, px = 0.2, py = 0.2, minNPixels = 800):
416
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
257 'Computes the bounding box of object at frameNum'
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
258 x = []
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
259 y = []
661
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 658
diff changeset
260 if obj.hasFeatures():
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 658
diff changeset
261 for f in obj.getFeatures():
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 658
diff changeset
262 if f.existsAtInstant(frameNum):
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 658
diff changeset
263 projectedPosition = f.getPositionAtInstant(frameNum).project(homography)
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 658
diff changeset
264 x.append(projectedPosition.x)
dc70d9e711f5 some method name change and new methods for features in objects (MovingObject) and methods to access indicator values in interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 658
diff changeset
265 y.append(projectedPosition.y)
416
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
266 xmin = min(x)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
267 xmax = max(x)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
268 ymin = min(y)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
269 ymax = max(y)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
270 xMm = px * (xmax - xmin)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
271 yMm = py * (ymax - ymin)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
272 a = max(ymax - ymin + (2 * yMm), xmax - (xmin + 2 * xMm))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
273 yCropMin = int(max(0, .5 * (ymin + ymax - a)))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
274 yCropMax = int(min(height - 1, .5 * (ymin + ymax + a)))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
275 xCropMin = int(max(0, .5 * (xmin + xmax - a)))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
276 xCropMax = int(min(width - 1, .5 * (xmin + xmax + a)))
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
277 if yCropMax != yCropMin and xCropMax != xCropMin and (yCropMax - yCropMin) * (xCropMax - xCropMin) > minNPixels:
520
fd9641cbd24b added function to classify object at instant from SVM
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 515
diff changeset
278 croppedImg = img[yCropMin : yCropMax, xCropMin : xCropMax]
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
279 else:
685
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
280 croppedImg = None
548
e6ab4caf359c corrected bug
MohamedGomaa
parents: 547
diff changeset
281 return croppedImg, yCropMin, yCropMax, xCropMin, xCropMax
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
282
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
283
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
284 def displayTrajectories(videoFilename, objects, boundingBoxes = {}, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1., nFramesStep = 1, saveAllImages = False, undistort = False, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = 1., annotations = [], gtMatches = {}, toMatches = {}):
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
285 '''Displays the objects overlaid frame by frame over the video '''
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
286 from moving import userTypeNames
482
f6415f012640 adding functionalities (save images directly to display trajectories to create movies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 478
diff changeset
287 from math import ceil, log10
509
935430b1d408 corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
288
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
289 capture = cv2.VideoCapture(videoFilename)
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
290 width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
291 height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
509
935430b1d408 corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
292
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
293 windowName = 'frame'
685
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
294 if rescale == 1.:
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
295 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
296
509
935430b1d408 corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
297 if undistort: # setup undistortion
510
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
298 [map1, map2] = computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients)
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
299 if capture.isOpened():
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
300 key = -1
227
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
301 ret = True
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
302 frameNum = firstFrameNum
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
303 capture.set(cv2.CAP_PROP_POS_FRAMES, firstFrameNum)
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 628
diff changeset
304 if lastFrameNumArg is None:
248
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
305 from sys import maxint
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
306 lastFrameNum = maxint
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
307 else:
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
308 lastFrameNum = lastFrameNumArg
482
f6415f012640 adding functionalities (save images directly to display trajectories to create movies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 478
diff changeset
309 nZerosFilename = int(ceil(log10(lastFrameNum)))
725
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
310 objectToDeleteIds = []
628
977407c9f815 corrected bugs in loading interactions (index shifted) and added functionalities to play/plot interactions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 625
diff changeset
311 while ret and not quitKey(key) and frameNum <= lastFrameNum:
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
312 ret, img = capture.read()
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
313 if ret:
509
935430b1d408 corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
314 if undistort:
935430b1d408 corrected mask bug in feature tracking, updated display-trajectories to display on undistorted image
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 491
diff changeset
315 img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR)
381
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
316 if printFrames:
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
317 print('frame {0}'.format(frameNum))
725
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
318 if len(objectToDeleteIds) > 0:
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
319 objects = [o for o in objects if o.getNum() not in objectToDeleteIds]
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
320 objectToDeleteIds = []
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
321 # plot objects
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
322 for obj in objects:
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
323 if obj.existsAtInstant(frameNum):
725
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
324 if obj.getLastInstant() == frameNum:
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
325 objectToDeleteIds.append(obj.getNum())
236
eb4525853030 added script to display trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 235
diff changeset
326 if not hasattr(obj, 'projectedPositions'):
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 628
diff changeset
327 if homography is not None:
218
b5772df11b37 corrected bugs to load objects and display trajectories over videos
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 216
diff changeset
328 obj.projectedPositions = obj.positions.project(homography)
b5772df11b37 corrected bugs to load objects and display trajectories over videos
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 216
diff changeset
329 else:
b5772df11b37 corrected bugs to load objects and display trajectories over videos
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 216
diff changeset
330 obj.projectedPositions = obj.positions
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
331 cvPlot(img, obj.projectedPositions, cvColors[obj.getNum()], frameNum-obj.getFirstInstant())
725
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
332 if frameNum not in boundingBoxes.keys() and obj.hasFeatures():
416
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
333 imgcrop, yCropMin, yCropMax, xCropMin, xCropMax = imageBox(img, obj, frameNum, homography, width, height)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
334 cv2.rectangle(img, (xCropMin, yCropMin), (xCropMax, yCropMax), cvBlue, 1)
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
335 objDescription = '{} '.format(obj.num)
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
336 if userTypeNames[obj.userType] != 'unknown':
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
337 objDescription += userTypeNames[obj.userType][0].upper()
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
338 if len(annotations) > 0: # if we loaded annotations, but there is no match
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
339 if frameNum not in toMatches[obj.getNum()]:
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
340 objDescription += " FA"
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
341 cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, cvColors[obj.getNum()])
725
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
342 # plot object bounding boxes
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
343 if frameNum in boundingBoxes.keys():
35bc5e30a53f slight reorganization of display-trajectories (more efficient filtering of list of objects for long sequences)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 685
diff changeset
344 for rect in boundingBoxes[frameNum]:
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
345 cv2.rectangle(img, rect[0].asint().astuple(), rect[1].asint().astuple(), cvColors[obj.getNum()])
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
346 # plot ground truth
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
347 if len(annotations) > 0:
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
348 for gt in annotations:
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
349 if gt.existsAtInstant(frameNum):
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
350 if frameNum in gtMatches[gt.getNum()]:
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
351 color = cvColors[gtMatches[gt.getNum()][frameNum]] # same color as object
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
352 else:
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
353 color = cvRed
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
354 cv2.putText(img, 'Miss', gt.topLeftPositions[frameNum-gt.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, cvRed)
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
355 cv2.rectangle(img, gt.topLeftPositions[frameNum-gt.getFirstInstant()].asint().astuple(), gt.bottomRightPositions[frameNum-gt.getFirstInstant()].asint().astuple(), color)
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
356 # saving images and going to next
482
f6415f012640 adding functionalities (save images directly to display trajectories to create movies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 478
diff changeset
357 if not saveAllImages:
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
358 cvImshow(windowName, img, rescale)
482
f6415f012640 adding functionalities (save images directly to display trajectories to create movies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 478
diff changeset
359 key = cv2.waitKey()
f6415f012640 adding functionalities (save images directly to display trajectories to create movies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 478
diff changeset
360 if saveAllImages or saveKey(key):
f6415f012640 adding functionalities (save images directly to display trajectories to create movies
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 478
diff changeset
361 cv2.imwrite('image-{{:0{}}}.png'.format(nZerosFilename).format(frameNum), img)
478
d337bffd7283 Display of points in compute homography and step option to replay videos
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 474
diff changeset
362 frameNum += nFramesStep
d337bffd7283 Display of points in compute homography and step option to replay videos
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 474
diff changeset
363 if nFramesStep > 1:
766
6022350f8173 updated to OpenCV 3.1
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 726
diff changeset
364 capture.set(cv2.CAP_PROP_POS_FRAMES, frameNum)
346
5f75d6c23ed5 added opencv function to destroy OpenCV windows (seems to work only on Windows)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 319
diff changeset
365 cv2.destroyAllWindows()
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
366 else:
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
367 print 'Cannot load file ' + videoFilename
402
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
368
639
4e7925cb4f8f modified tsai camera homography computation to avoid using os dependent temporary files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 638
diff changeset
369 def computeHomographyFromPDTV(camera):
4e7925cb4f8f modified tsai camera homography computation to avoid using os dependent temporary files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 638
diff changeset
370 '''Returns the homography matrix at ground level from PDTV camera
402
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
371 https://bitbucket.org/hakanardo/pdtv'''
639
4e7925cb4f8f modified tsai camera homography computation to avoid using os dependent temporary files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 638
diff changeset
372 # camera = pdtv.load(cameraFilename)
402
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
373 srcPoints = [[x,y] for x, y in zip([1.,2.,2.,1.],[1.,1.,2.,2.])] # need floats!!
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
374 dstPoints = []
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
375 for srcPoint in srcPoints:
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
376 projected = camera.image_to_world(tuple(srcPoint))
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
377 dstPoints.append([projected[0], projected[1]])
638
852f5de42d01 added functionality to read Aliaksei Tsai camera model data
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 636
diff changeset
378 H, mask = cv2.findHomography(array(srcPoints), array(dstPoints), method = 0) # No need for different methods for finding homography
402
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
379 return H
f29204e68aab function to generate homography from PDTV Tsai format and script to generate trajectories from sqlite bounding boxes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 398
diff changeset
380
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
381 def undistortedCoordinates(map1, map2, x, y, maxDistance = 1.):
468
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
382 '''Returns the coordinates of a point in undistorted image
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
383 map1 and map2 are the mapping functions from undistorted image
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
384 to distorted (original image)
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
385 map1(x,y) = originalx, originaly'''
672
5473b7460375 moved and rationalized imports in modules
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
386 from numpy import abs, logical_and, unravel_index, sum
468
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
387 from matplotlib.mlab import find
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
388 distx = abs(map1-x)
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
389 disty = abs(map2-y)
472
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
390 indices = logical_and(distx<maxDistance, disty<maxDistance)
468
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
391 closeCoordinates = unravel_index(find(indices), distx.shape) # returns i,j, ie y,x
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
392 xWeights = 1-distx[indices]
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
393 yWeights = 1-disty[indices]
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
394 return dot(xWeights, closeCoordinates[1])/sum(xWeights), dot(yWeights, closeCoordinates[0])/sum(yWeights)
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
395
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
396 def undistortTrajectoryFromCVMapping(map1, map2, t):
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
397 '''test 'perfect' inversion'''
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
398 from moving import Trajectory
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
399 from numpy import isnan
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
400 undistortedTrajectory = Trajectory()
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
401 for i,p in enumerate(t):
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
402 res = undistortedCoordinates(map1, map2, p.x,p.y)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
403 if not isnan(res).any():
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
404 undistortedTrajectory.addPositionXY(res[0], res[1])
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
405 else:
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
406 print i,p,res
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
407 return undistortedTrajectory
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
408
472
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
409 def computeInverseMapping(originalImageSize, map1, map2):
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
410 'Computes inverse mapping from maps provided by cv2.initUndistortRectifyMap'
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
411 from numpy import ones, isnan
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
412 invMap1 = -ones(originalImageSize)
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
413 invMap2 = -ones(originalImageSize)
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
414 for x in range(0,originalImageSize[1]):
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
415 for y in range(0,originalImageSize[0]):
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
416 res = undistortedCoordinates(x,y, map1, map2)
472
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
417 if not isnan(res).any():
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
418 invMap1[y,x] = res[0]
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
419 invMap2[y,x] = res[1]
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
420 return invMap1, invMap2
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
421
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
422 def cameraIntrinsicCalibration(path, checkerBoardSize=[6,7], secondPassSearch=False, display=False):
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
423 ''' Camera calibration searches through all the images (jpg or png) located
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
424 in _path_ for matches to a checkerboard pattern of size checkboardSize.
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
425 These images should all be of the same camera with the same resolution.
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
426
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
427 For best results, use an asymetric board and ensure that the image has
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
428 very high contrast, including the background. Suitable checkerboard:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
429 http://ftp.isr.ist.utl.pt/pub/roswiki/attachments/camera_calibration(2f)Tutorials(2f)StereoCalibration/check-108.png
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
430
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
431 The code below is based off of:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
432 https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
433 Modified by Paul St-Aubin
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
434 '''
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
435 from numpy import zeros, mgrid, float32, savetxt
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
436 import glob, os
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
437
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
438 # termination criteria
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
439 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
440
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
441 # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
442 objp = zeros((checkerBoardSize[0]*checkerBoardSize[1],3), float32)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
443 objp[:,:2] = mgrid[0:checkerBoardSize[1],0:checkerBoardSize[0]].T.reshape(-1,2)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
444
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
445 # Arrays to store object points and image points from all the images.
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
446 objpoints = [] # 3d point in real world space
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
447 imgpoints = [] # 2d points in image plane.
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
448
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
449 ## Loop throuhg all images in _path_
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
450 images = glob.glob(os.path.join(path,'*.[jJ][pP][gG]'))+glob.glob(os.path.join(path,'*.[jJ][pP][eE][gG]'))+glob.glob(os.path.join(path,'*.[pP][nN][gG]'))
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
451 for fname in images:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
452 img = cv2.imread(fname)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
453 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
454
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
455 # Find the chess board corners
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
456 ret, corners = cv2.findChessboardCorners(gray, (checkerBoardSize[1],checkerBoardSize[0]), None)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
457
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
458 # If found, add object points, image points (after refining them)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
459 if ret:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
460 print 'Found pattern in '+fname
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
461
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
462 if(secondPassSearch):
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
463 corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
464
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
465 objpoints.append(objp)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
466 imgpoints.append(corners)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
467
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
468 # Draw and display the corners
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
469 if(display):
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
470 img = cv2.drawChessboardCorners(img, (checkerBoardSize[1],checkerBoardSize[0]), corners, ret)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
471 if(img):
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
472 cv2.imshow('img',img)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
473 cv2.waitKey(0)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
474
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
475 ## Close up image loading and calibrate
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
476 cv2.destroyAllWindows()
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
477 if len(objpoints) == 0 or len(imgpoints) == 0:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
478 return False
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
479 try:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
480 ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
481 except NameError:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
482 return False
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
483 savetxt('intrinsic-camera.txt', camera_matrix)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
484 return camera_matrix, dist_coeffs
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
485
545
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
486 def undistortImage(img, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = 1., interpolation=cv2.INTER_LINEAR):
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
487 '''Undistorts the image passed in argument'''
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
488 width = img.shape[1]
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
489 height = img.shape[0]
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
490 [map1, map2] = computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients)
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
491 return cv2.remap(img, map1, map2, interpolation=interpolation)
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
492
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
493
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
494 def printCvMat(cvmat, out = stdout):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
495 '''Prints the cvmat to out'''
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
496 print('Deprecated, use new interface')
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
497 for i in xrange(cvmat.rows):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
498 for j in xrange(cvmat.cols):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
499 out.write('{0} '.format(cvmat[i,j]))
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
500 out.write('\n')
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
501
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
502 def projectArray(homography, points):
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
503 '''Returns the coordinates of the projected points through homography
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
504 (format: array 2xN points)'''
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
505 if points.shape[0] != 2:
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
506 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
507
636
3058e00887bc removed all issues because of tests with None, using is instead of == or !=
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 628
diff changeset
508 if (homography is not None) and homography.size>0:
639
4e7925cb4f8f modified tsai camera homography computation to avoid using os dependent temporary files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 638
diff changeset
509 #alternatively, on could use cv2.convertpointstohomogeneous and other conversion to/from homogeneous coordinates
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
510 augmentedPoints = append(points,[[1]*points.shape[1]], 0)
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
511 prod = dot(homography, augmentedPoints)
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
512 return prod[0:2]/prod[2]
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
513 else:
547
97c5fef5b2d6 corrected bugs
MohamedGomaa
parents: 538
diff changeset
514 return points
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
515
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
516 def project(homography, p):
319
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 315
diff changeset
517 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1]
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
518 through homography'''
243
e0988a8ace0c started adapting and moving to other modules Mohamed's work
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 236
diff changeset
519 return projectArray(homography, array([[p[0]],[p[1]]]))
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
520
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
521 def projectTrajectory(homography, trajectory):
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
522 '''Projects a series of points in the format
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
523 [[x1, x2, ...],
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
524 [y1, y2, ...]]'''
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
525 return projectArray(homography, array(trajectory))
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
526
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
527 def invertHomography(homography):
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
528 '''Returns an inverted homography
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
529 Unnecessary for reprojection over camera image'''
673
5505f9dbb28e corrected import bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 672
diff changeset
530 from numpy.linalg import inv
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
531 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
532 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
533 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
534
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
535 def undistortTrajectory(invMap1, invMap2, positions):
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
536 from numpy import floor, ceil
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
537 floorPositions = floor(positions)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
538 #ceilPositions = ceil(positions)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
539 undistortedTrajectory = [[],[]]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
540 for i in xrange(len(positions[0])):
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
541 x,y = None, None
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
542 if positions[0][i]+1 < invMap1.shape[1] and positions[1][i]+1 < invMap1.shape[0]:
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
543 floorX = invMap1[floorPositions[1][i], floorPositions[0][i]]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
544 floorY = invMap2[floorPositions[1][i], floorPositions[0][i]]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
545 ceilX = invMap1[floorPositions[1][i]+1, floorPositions[0][i]+1]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
546 ceilY = invMap2[floorPositions[1][i]+1, floorPositions[0][i]+1]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
547 #ceilX = invMap1[ceilPositions[1][i], ceilPositions[0][i]]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
548 #ceilY = invMap2[ceilPositions[1][i], ceilPositions[0][i]]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
549 if floorX >=0 and floorY >=0 and ceilX >=0 and ceilY >=0:
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
550 x = floorX+(positions[0][i]-floorPositions[0][i])*(ceilX-floorX)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
551 y = floorY+(positions[1][i]-floorPositions[1][i])*(ceilY-floorY)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
552 undistortedTrajectory[0].append(x)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
553 undistortedTrajectory[1].append(y)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
554 return undistortedTrajectory
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
555
491
343cfd185ca6 minor changes and reaarrangements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 482
diff changeset
556 def projectGInputPoints(homography, points):
343cfd185ca6 minor changes and reaarrangements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 482
diff changeset
557 return projectTrajectory(homography, array(points+[points[0]]).T)
343cfd185ca6 minor changes and reaarrangements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 482
diff changeset
558
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
559 if opencvAvailable:
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
560 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
561 '''Computes the translation of img2 with respect to img1
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
562 (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
563 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
564
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
565 TODO add diagnostic if data is all over the place, and it most likely is not a translation (eg zoom, other non linear distortion)'''
672
5473b7460375 moved and rationalized imports in modules
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
566 from numpy import median, sum
100
2a3cafcf5faf added function to compute the translation between two images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 99
diff changeset
567
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
568 nextPoints = array([])
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
569 (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
570 # 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
571 delta = []
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
572 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
573 if status[k] == 1:
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
574 dp = p2-p1
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
575 d = sum(dp**2)
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
576 if d < maxTranslation2:
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
577 delta.append(dp)
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
578 if len(delta) >= minNMatches:
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
579 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
580 else:
156
2eef5620c0b3 added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 154
diff changeset
581 print(dp)
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
582 return None
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
583
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
584 if skimageAvailable:
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
585 from skimage.feature import hog
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
586 from skimage import color, transform
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
587
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
588 def HOG(image, rescaleSize = (64, 64), orientations=9, pixelsPerCell=(8, 8), cellsPerBlock=(2, 2), visualize=False, normalize=False):
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
589 bwImg = color.rgb2gray(image)
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
590 inputImg = transform.resize(bwImg, rescaleSize)
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
591 features = hog(inputImg, orientations, pixelsPerCell, cellsPerBlock, visualize, normalize)
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
592 if visualize:
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
593 from matplotlib.pyplot import imshow, figure, subplot
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
594 hogViz = features[1]
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
595 features = features[0]
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
596 figure()
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
597 subplot(1,2,1)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
598 imshow(inputImg)
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
599 subplot(1,2,2)
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
600 imshow(hogViz)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
601 return float32(features)
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
602
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
603 def createHOGTrainingSet(imageDirectory, classLabel, rescaleSize = (64, 64), orientations=9, pixelsPerCell=(8, 8), cellsPerBlock=(2, 2), visualize=False, normalize=False):
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
604 from os import listdir
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
605 from matplotlib.pyplot import imread
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
606
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
607 inputData = []
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
608 for filename in listdir(imageDirectory):
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
609 img = imread(imageDirectory+filename)
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
610 features = HOG(img, rescaleSize, orientations, pixelsPerCell, cellsPerBlock, visualize, normalize)
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
611 inputData.append(features)
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
612
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
613 nImages = len(inputData)
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
614 return array(inputData, dtype = float32), array([classLabel]*nImages, dtype = float32)
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
615
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
616