annotate python/cvutils.py @ 928:063d1267585d

work in progress
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 12 Jul 2017 01:24:31 -0400
parents dbd81710d515
children be28a3538dc9
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
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
4 import utils, moving
665
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
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
19 from sys import stdout, maxint
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
20 from os import listdir
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
21 from copy import deepcopy
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
22 from math import floor, log10, ceil
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
23
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
24 from numpy import dot, array, append, float32, loadtxt, savetxt, append, zeros, ones, identity, abs as npabs, logical_and, unravel_index, sum as npsum, isnan, mgrid, median, floor as npfloor, ceil as npceil
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
25 from matplotlib.mlab import find
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
26 from matplotlib.pyplot import imread, imsave
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
27
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
28
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
29
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 661
diff changeset
30 #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
31
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
32
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
33 cvRed = {'default': (0,0,255),
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
34 'colorblind': (0,114,178)}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
35 cvGreen = {'default': (0,255,0),
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
36 'colorblind': (0,158,115)}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
37 cvBlue = {'default': (255,0,0),
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
38 'colorblind': (213,94,0)}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
39 cvCyan = {'default': (255, 255, 0),
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
40 'colorblind': (240,228,66)}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
41 cvYellow = {'default': (0, 255, 255),
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
42 'colorblind': (86,180,233)}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
43 cvMagenta = {'default': (255, 0, 255),
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
44 'colorblind': (204,121,167)}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
45 cvWhite = {k: (255, 255, 255) for k in ['default', 'colorblind']}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
46 cvBlack = {k: (0,0,0) for k in ['default', 'colorblind']}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
47
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
48 cvColors3 = {k: utils.PlottingPropertyValues([cvRed[k], cvGreen[k], cvBlue[k]]) for k in ['default', 'colorblind']}
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
49 cvColors = {k: utils.PlottingPropertyValues([cvRed[k], cvGreen[k], cvBlue[k], cvCyan[k], cvYellow[k], cvMagenta[k], cvWhite[k], cvBlack[k]]) for k in ['default', 'colorblind']}
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
50
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
51 def quitKey(key):
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
52 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
53
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
54 def saveKey(key):
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
55 return chr(key&255) == 's'
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
56
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
57 def int2FOURCC(x):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
58 fourcc = ''
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
59 for i in xrange(4):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
60 fourcc += unichr((x >> 8*i)&255)
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
61 return fourcc
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
62
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
63 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
64 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
65
159
115f7f90286d updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 156
diff changeset
66 def matlab2PointCorrespondences(filename):
115f7f90286d updated calibration-translation and added function to convert point correspondences
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 156
diff changeset
67 '''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
68 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
69 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
70 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
71
160
b0719b3ad3db created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 159
diff changeset
72 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
73 '''Loads and returns the corresponding points in world (first 2 lines) and image spaces (last 2 lines)'''
b0719b3ad3db created function to load point correspondences and updates scripts that use it
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 159
diff changeset
74 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
75 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
76
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
77 def cvMatToArray(cvmat):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
78 '''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
79 print('Deprecated, use new interface')
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
80 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
81 for i in xrange(cvmat.rows):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
82 for j in xrange(cvmat.cols):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
83 a[i,j] = cvmat[i,j]
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
84 return a
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
85
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
86 def createWhiteImage(height, width, filename):
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
87 img = ones((height, width, 3), uint8)*255
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
88 imsave(filename, img)
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
89
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
90 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
91 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
92 '''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
93 H, mask = cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold)
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 266
diff changeset
94 return H
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 266
diff changeset
95
406
37c7b46f6e21 update to OpenCV 2.6
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 402
diff changeset
96 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
97 '''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
98 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
99 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
100 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
101 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
102 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
103 return cvmat
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
104
658
6668f541b915 Added **kwargs passthrough to cvPlot()->cv2.line() for greater drawing flexibility.
pstaub
parents: 657
diff changeset
105 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
106 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
107 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
108 elif lastCoordinate >=0:
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
109 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
110 for i in range(0, last):
658
6668f541b915 Added **kwargs passthrough to cvPlot()->cv2.line() for greater drawing flexibility.
pstaub
parents: 657
diff changeset
111 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
112
385
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
113 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
114 '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
115 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
116 if rescale != 1.:
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
117 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
118 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
119 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
120 else:
1917db662aa7 added rescaling options to scripts play-video and display-trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 384
diff changeset
121 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
122
510
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
123 def computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients):
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
124 newImgSize = (int(round(width*undistortedImageMultiplication)), int(round(height*undistortedImageMultiplication)))
924
a71455bd8367 work in progress on undistortion acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 904
diff changeset
125 newCameraMatrix = cv2.getDefaultNewCameraMatrix(intrinsicCameraMatrix, newImgSize, True)
a71455bd8367 work in progress on undistortion acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 904
diff changeset
126 return cv2.initUndistortRectifyMap(intrinsicCameraMatrix, array(distortionCoefficients), None, newCameraMatrix, newImgSize, cv2.CV_32FC1)
510
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
127
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
128 def playVideo(filenames, windowNames = None, firstFrameNums = None, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1., step = 1, colorBlind = False):
820
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
129 '''Plays the video(s)'''
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
130 if colorBlind:
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
131 colorType = 'colorblind'
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
132 else:
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
133 colorType = 'default'
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
134 if len(filenames) == 0:
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
135 print('Empty filename list')
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
136 return
820
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
137 if windowNames is None:
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
138 windowNames = ['frame{}'.format(i) for i in xrange(len(filenames))]
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
139 wait = 5
685
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
140 if rescale == 1.:
820
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
141 for windowName in windowNames:
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
142 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL)
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
143 if frameRate > 0:
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
144 wait = int(round(1000./frameRate))
381
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
145 if interactive:
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
146 wait = 0
820
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
147 captures = [cv2.VideoCapture(fn) for fn in filenames]
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
148 if array([cap.isOpened() for cap in captures]).all():
149
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
149 key = -1
227
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
150 ret = True
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
151 nFramesShown = 0
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
152 if firstFrameNums is not None:
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
153 for i in xrange(len(captures)):
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
154 captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i])
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
155 while ret and not quitKey(key):
820
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
156 rets = []
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
157 images = []
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
158 for cap in captures:
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
159 ret, img = cap.read()
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
160 rets.append(ret)
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
161 images.append(img)
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
162 if array(rets).all():
381
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
163 if printFrames:
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
164 print('frame shown {0}'.format(nFramesShown))
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
165 for i in xrange(len(filenames)):
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
166 if text is not None:
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
167 cv2.putText(images[i], text, (10,50), cv2.FONT_HERSHEY_PLAIN, 1, cvRed[colorType])
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
168 cvImshow(windowNames[i], images[i], rescale) # cv2.imshow('frame', img)
305
ca9131968bce added sample to replay video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 303
diff changeset
169 key = cv2.waitKey(wait)
625
9202628a4130 saving image when playing video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 549
diff changeset
170 if saveKey(key):
9202628a4130 saving image when playing video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 549
diff changeset
171 cv2.imwrite('image-{}.png'.format(frameNum), img)
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
172 nFramesShown += step
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
173 if step > 1:
821
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
174 for i in xrange(len(captures)):
26daf35180ad finished modification and demo script to replay synchronized video (with same frame rate)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 820
diff changeset
175 captures.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i]+nFramesShown)
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
176 cv2.destroyAllWindows()
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
177 else:
820
e73e7b644428 generalized play-video for several files (already synchronized
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 807
diff changeset
178 print('Video captures for {} failed'.format(filenames))
149
0f552c8b1650 added python function to play video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 116
diff changeset
179
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
180 def infoVideo(filename):
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
181 '''Provides all available info on video '''
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
182 cvPropertyNames = {cv2.cv.CV_CAP_PROP_FORMAT: "format",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
183 cv2.cv.CV_CAP_PROP_FOURCC: "codec (fourcc)",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
184 cv2.cv.CV_CAP_PROP_FPS: "fps",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
185 cv2.cv.CV_CAP_PROP_FRAME_COUNT: "number of frames",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
186 cv2.cv.CV_CAP_PROP_FRAME_HEIGHT: "heigh",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
187 cv2.cv.CV_CAP_PROP_FRAME_WIDTH: "width",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
188 cv2.cv.CV_CAP_PROP_RECTIFICATION: "rectification",
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
189 cv2.cv.CV_CAP_PROP_SATURATION: "saturation"}
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
190 capture = cv2.VideoCapture(filename)
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
191 if capture.isOpened():
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
192 for cvprop in [#cv2.cv.CV_CAP_PROP_BRIGHTNESS
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
193 #cv2.cv.CV_CAP_PROP_CONTRAST
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
194 #cv2.cv.CV_CAP_PROP_CONVERT_RGB
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
195 #cv2.cv.CV_CAP_PROP_EXPOSURE
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
196 cv2.cv.CV_CAP_PROP_FORMAT,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
197 cv2.cv.CV_CAP_PROP_FOURCC,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
198 cv2.cv.CV_CAP_PROP_FPS,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
199 cv2.cv.CV_CAP_PROP_FRAME_COUNT,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
200 cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
201 cv2.cv.CV_CAP_PROP_FRAME_WIDTH,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
202 #cv2.cv.CV_CAP_PROP_GAIN,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
203 #cv2.cv.CV_CAP_PROP_HUE
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
204 #cv2.cv.CV_CAP_PROP_MODE
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
205 #cv2.cv.CV_CAP_PROP_POS_AVI_RATIO
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
206 #cv2.cv.CV_CAP_PROP_POS_FRAMES
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
207 #cv2.cv.CV_CAP_PROP_POS_MSEC
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
208 #cv2.cv.CV_CAP_PROP_RECTIFICATION,
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
209 #cv2.cv.CV_CAP_PROP_SATURATION
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
210 ]:
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
211 prop = capture.get(cvprop)
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
212 if cvprop == cv2.cv.CV_CAP_PROP_FOURCC and prop > 0:
657
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
213 prop = int2FOURCC(int(prop))
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
214 print('Video {}: {}'.format(cvPropertyNames[cvprop], prop))
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
215 else:
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
216 print('Video capture for {} failed'.format(filename))
51269511229b added script printing video info
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 639
diff changeset
217
798
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
218 def getImagesFromVideo(videoFilename, firstFrameNum = 0, lastFrameNum = 1, step = 1, saveImage = False, outputPrefix = 'image'):
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
219 '''Returns nFrames images from the video sequence'''
150
404f3cade05f added python function to get image frames from video filenames
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 149
diff changeset
220 images = []
396
167f6ec44ec5 cleaned function to save images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 393
diff changeset
221 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
222 if capture.isOpened():
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
223 rawCount = capture.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
224 if rawCount < 0:
798
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
225 rawCount = lastFrameNum+1
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
226 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
227 ret = False
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
228 capture.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNum)
798
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
229 frameNum = firstFrameNum
858
2faabcbde2c4 minor improvements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 821
diff changeset
230 while frameNum<lastFrameNum and frameNum<rawCount:
171
8e7b354666ec corrected bug in to get images from video
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 160
diff changeset
231 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
232 i = 0
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
233 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
234 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
235 i += 1
799
0662c87a61c9 minor modification
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 798
diff changeset
236 if img is not None and 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
237 if saveImage:
798
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
238 frameNumStr = format(frameNum, '0{}d'.format(nDigits))
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
239 cv2.imwrite(outputPrefix+frameNumStr+'.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
240 else:
51acf43e421a modified the function to read and save images from a movie
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 204
diff changeset
241 images.append(img)
798
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
242 frameNum +=step
5b99b676265e modified to get images very time step
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 788
diff changeset
243 if step > 1:
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
244 capture.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, frameNum)
398
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
245 capture.release()
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
246 else:
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
247 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
248 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
249
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
250 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
251 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
252 if capture.isOpened():
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
253 fps = capture.get(cv2.cv.CV_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
254 capture.release()
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
255 return fps
3399bd48cb40 Ajout d'une méthode pour obtenir le nombre de FPS
Jean-Philippe Jodoin <jpjodoin@gmail.com>
parents: 396
diff changeset
256 else:
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
257 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
258 return None
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
259
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
260 def imageBoxSize(obj, frameNum, width, height, px = 0.2, py = 0.2):
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
261 'Computes the bounding box size 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
262 x = []
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
263 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
264 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
265 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
266 if f.existsAtInstant(frameNum):
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
267 projectedPosition = f.projectPositions[:, frameNum-f.getFirstInstant()]
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
268 x.append(projectedPosition[0])
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
269 y.append(projectedPosition[1])
416
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
270 xmin = min(x)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
271 xmax = max(x)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
272 ymin = min(y)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
273 ymax = max(y)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
274 xMm = px * (xmax - xmin)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
275 yMm = py * (ymax - ymin)
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
276 a = max(ymax - ymin + (2 * yMm), xmax - (xmin + 2 * xMm))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
277 yCropMin = int(max(0, .5 * (ymin + ymax - a)))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
278 yCropMax = int(min(height - 1, .5 * (ymin + ymax + a)))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
279 xCropMin = int(max(0, .5 * (xmin + xmax - a)))
8fdbc13dad8b cleaned imagebox code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 411
diff changeset
280 xCropMax = int(min(width - 1, .5 * (xmin + xmax + a)))
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
281 return yCropMin, yCropMax, xCropMin, xCropMax
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
282
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
283 def imageBox(img, obj, frameNum, width, height, px = 0.2, py = 0.2, minNPixels = 800):
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
284 'Computes the bounding box of object at frameNum'
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
285 yCropMin, yCropMax, xCropMin, xCropMax = imageBoxSize(obj, frameNum, width, height, px, py)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
286 if yCropMax != yCropMin and xCropMax != xCropMin and (yCropMax - yCropMin) * (xCropMax - xCropMin) > minNPixels:
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
287 return 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
288 else:
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
289 return None
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
290
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
291 def displayTrajectories(videoFilename, objects, boundingBoxes = {}, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1., nFramesStep = 1, saveAllImages = False, nZerosFilenameArg = None, undistort = False, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = 1., annotations = [], gtMatches = {}, toMatches = {}, colorBlind = False):
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
292 '''Displays the objects overlaid frame by frame over the video '''
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
293 if colorBlind:
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
294 colorType = 'colorblind'
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
295 else:
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
296 colorType = 'default'
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
297
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
298 capture = cv2.VideoCapture(videoFilename)
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
299 width = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
300 height = int(capture.get(cv2.cv.CV_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
301
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
302 windowName = 'frame'
685
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
303 if rescale == 1.:
94b291a5f933 several updates for display
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 680
diff changeset
304 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
305
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
306 if undistort: # setup undistortion
510
b0dac840c24f compute homography works with undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 509
diff changeset
307 [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
308 if capture.isOpened():
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
309 key = -1
227
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
310 ret = True
b7612c6d5702 cleaned the code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 226
diff changeset
311 frameNum = firstFrameNum
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
312 capture.set(cv2.cv.CV_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
313 if lastFrameNumArg is None:
248
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
314 lastFrameNum = maxint
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
315 else:
571ba5ed22e2 added utils for bus processing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 243
diff changeset
316 lastFrameNum = lastFrameNumArg
864
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 858
diff changeset
317 if nZerosFilenameArg is None:
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 858
diff changeset
318 nZerosFilename = int(ceil(log10(lastFrameNum)))
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 858
diff changeset
319 else:
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 858
diff changeset
320 nZerosFilename = nZerosFilenameArg
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
321 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
322 ret, img = capture.read()
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
323 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
324 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
325 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
326 if printFrames:
387cc0142211 script to replay event annotations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 365
diff changeset
327 print('frame {0}'.format(frameNum))
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
328 # plot objects
203
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
329 for obj in objects:
e2f31813ade6 added code to display trajectories on videa
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 171
diff changeset
330 if obj.existsAtInstant(frameNum):
236
eb4525853030 added script to display trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 235
diff changeset
331 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
332 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
333 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
334 else:
b5772df11b37 corrected bugs to load objects and display trajectories over videos
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 216
diff changeset
335 obj.projectedPositions = obj.positions
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
336 cvPlot(img, obj.projectedPositions, cvColors[colorType][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
337 if frameNum not in boundingBoxes.keys() and obj.hasFeatures():
904
8f60ecfc2f06 work in progress, almost ready
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 903
diff changeset
338 yCropMin, yCropMax, xCropMin, xCropMax = imageBoxSize(obj, frameNum, homography, width, height)
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
339 cv2.rectangle(img, (xCropMin, yCropMin), (xCropMax, yCropMax), cvBlue[colorType], 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
340 objDescription = '{} '.format(obj.num)
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
341 if moving.userTypeNames[obj.userType] != 'unknown':
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
342 objDescription += moving.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
343 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
344 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
345 objDescription += " FA"
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
346 cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, cvColors[colorType][obj.getNum()])
903
81ee5aaf213d changed workflow of display trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 897
diff changeset
347 if obj.getLastInstant() == frameNum:
81ee5aaf213d changed workflow of display trajectories
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 897
diff changeset
348 objects.remove(obj)
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
349 # 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
350 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
351 for rect in boundingBoxes[frameNum]:
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
352 cv2.rectangle(img, rect[0].asint().astuple(), rect[1].asint().astuple(), cvColors[colorType][obj.getNum()])
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
353 # 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
354 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
355 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
356 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
357 if frameNum in gtMatches[gt.getNum()]:
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
358 color = cvColors[colorType][gtMatches[gt.getNum()][frameNum]] # same color as object
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
359 else:
868
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
360 color = cvRed[colorType]
1fdafa9f6bf4 added colors more friendly for color blind people (thanks Ryan Louie!)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 864
diff changeset
361 cv2.putText(img, 'Miss', gt.topLeftPositions[frameNum-gt.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, color)
726
43ae3a1af290 added functionality to display matchings between ground truth and tracked objects
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 725
diff changeset
362 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
363 # 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
364 if not saveAllImages:
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
365 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
366 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
367 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
368 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
369 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
370 if nFramesStep > 1:
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
371 capture.set(cv2.cv.CV_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
372 cv2.destroyAllWindows()
435
17185fe77316 added error messages if video not opened
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 429
diff changeset
373 else:
774
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 772
diff changeset
374 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
375
639
4e7925cb4f8f modified tsai camera homography computation to avoid using os dependent temporary files
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 638
diff changeset
376 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
377 '''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
378 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
379 # 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
380 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
381 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
382 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
383 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
384 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
385 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
386 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
387
895
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
388 def getIntrinsicCameraMatrix(cameraData):
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
389 return array([[cameraData['f']*cameraData['Sx']/cameraData['dx'], 0, cameraData['Cx']],
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
390 [0, cameraData['f']/cameraData['dy'], cameraData['Cy']],
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
391 [0, 0, 1.]])
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
392
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
393 def getDistortionCoefficients(cameraData):
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
394 return array([cameraData['k']]+4*[0])
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
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 undistortedCoordinates(map1, map2, x, y, maxDistance = 1.):
468
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
397 '''Returns the coordinates of a point in undistorted image
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
398 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
399 to distorted (original image)
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
400 map1(x,y) = originalx, originaly'''
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
401 distx = npabs(map1-x)
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
402 disty = npabs(map2-y)
472
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
403 indices = logical_and(distx<maxDistance, disty<maxDistance)
468
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
404 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
405 xWeights = 1-distx[indices]
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
406 yWeights = 1-disty[indices]
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
407 return dot(xWeights, closeCoordinates[1])/npsum(xWeights), dot(yWeights, closeCoordinates[0])/npsum(yWeights)
468
5304299e53a5 added coordinate undistortion function
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 435
diff changeset
408
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
409 def undistortTrajectoryFromCVMapping(map1, map2, t):
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
410 '''test 'perfect' inversion'''
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
411 undistortedTrajectory = moving.Trajectory()
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
412 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
413 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
414 if not isnan(res).any():
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
415 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
416 else:
774
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 772
diff changeset
417 print('{} {} {}'.format(i,p,res))
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
418 return undistortedTrajectory
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
419
472
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
420 def computeInverseMapping(originalImageSize, map1, map2):
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
421 '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
422 invMap1 = -ones(originalImageSize)
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
423 invMap2 = -ones(originalImageSize)
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
424 for x in range(0,originalImageSize[1]):
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
425 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
426 res = undistortedCoordinates(x,y, map1, map2)
472
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
427 if not isnan(res).any():
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
428 invMap1[y,x] = res[0]
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
429 invMap2[y,x] = res[1]
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
430 return invMap1, invMap2
a50c026fdf14 functions to compute inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 468
diff changeset
431
926
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
432 def intrinsicCameraCalibration(path, checkerBoardSize=[6,7], secondPassSearch=False, display=False, fixK2 = True, fixK3 = True, zeroTangent = True):
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
433 ''' Camera calibration searches through all the images (jpg or png) located
897
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
434 in _path_ for matches to a checkerboard pattern of size checkboardSize.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
435 These images should all be of the same camera with the same resolution.
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
436
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
437 For best results, use an asymetric board and ensure that the image has
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
438 very high contrast, including the background.
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
439
897
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
440 cherckerBoardSize is the number of internal corners (7x10 squares have 6x9 internal corners)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
441
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
442 The code below is based off of:
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
443 https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
444 Modified by Paul St-Aubin
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 895
diff changeset
445 '''
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
446 import glob, os
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
447
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
448 # termination criteria
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
449 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
450
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
451 # 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
452 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
453 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
454
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
455 # 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
456 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
457 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
458
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
459 ## 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
460 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
461 for fname in images:
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
462 img = cv2.imread(fname)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
463 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
464
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
465 # Find the chess board corners
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
466 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
467
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
468 # 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
469 if ret:
774
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 772
diff changeset
470 print('Found pattern in '+fname)
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
471
772
e92a96f2bdd3 minor bug corrections
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 769
diff changeset
472 if secondPassSearch:
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
473 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
474
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
475 objpoints.append(objp)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
476 imgpoints.append(corners)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
477
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
478 # Draw and display the corners
772
e92a96f2bdd3 minor bug corrections
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 769
diff changeset
479 if display:
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
480 img = cv2.drawChessboardCorners(img, (checkerBoardSize[1],checkerBoardSize[0]), corners, ret)
772
e92a96f2bdd3 minor bug corrections
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 769
diff changeset
481 if img is not None:
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
482 cv2.imshow('img',img)
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
483 cv2.waitKey(0)
774
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 772
diff changeset
484 else:
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 772
diff changeset
485 print('Pattern not found in '+fname)
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
486 ## 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
487 cv2.destroyAllWindows()
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
488 if len(objpoints) == 0 or len(imgpoints) == 0:
895
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
489 return None
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
490 try:
926
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
491 flags = 0
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
492 if fixK2:
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
493 flags += cv2.cv.CV_CALIB_FIX_K2
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
494 if fixK3:
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
495 flags += cv2.cv.CV_CALIB_FIX_K3
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
496 if zeroTangent:
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
497 flags += cv2.cv.CV_CALIB_ZERO_TANGENT_DIST
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
498 ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None, flags = flags)
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
499 except NameError:
895
739acd338cc0 added script to extract camera info from tacal file by Lund University (T analyst)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 894
diff changeset
500 return None
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
501 savetxt('intrinsic-camera.txt', camera_matrix)
926
dbd81710d515 new feature tracking in image space with point undistortion
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 924
diff changeset
502 print 'error: {}'.format(ret)
544
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
503 return camera_matrix, dist_coeffs
749672171789 added function to calibrate a camera intrinsic parameters
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 538
diff changeset
504
545
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
505 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
506 '''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
507 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
508 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
509 [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
510 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
511
9816fab353f3 added function to undistort image, mostly for checking camera calibration results
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 544
diff changeset
512
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
513 def printCvMat(cvmat, out = stdout):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
514 '''Prints the cvmat to out'''
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
515 print('Deprecated, use new interface')
99
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
516 for i in xrange(cvmat.rows):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
517 for j in xrange(cvmat.cols):
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
518 out.write('{0} '.format(cvmat[i,j]))
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
519 out.write('\n')
e7dc5a780f09 added conversion functions and homography computation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 98
diff changeset
520
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
521 def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None):
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
522 '''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
523 (format: array 2xN points)'''
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
524 if points.shape[0] not in [2, 3]:
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
525 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
526
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
527 augmentedPoints = append(points,[[1]*points.shape[1]], 0)
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
528 if homography is not None and homography.size>0:
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
529 prod = dot(homography, augmentedPoints)
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
530 projected = prod/prod[2]
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
531 projected[3,:] = 0
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
532 else:
928
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
533 projected = augmentedPoints
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
534
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
535 if intrinsicCameraMatrix is not None and distortionCoefficients is not None:
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
536 projected = cv2.projectPoints(projected, None, None, intrinsicCameraMatrix, distortionCoefficients)
063d1267585d work in progress
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 926
diff changeset
537 return projected
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
538
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
539 def project(homography, p):
319
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 315
diff changeset
540 '''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
541 through homography'''
243
e0988a8ace0c started adapting and moving to other modules Mohamed's work
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 236
diff changeset
542 return projectArray(homography, array([[p[0]],[p[1]]]))
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
543
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
544 def projectTrajectory(homography, trajectory):
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
545 '''Projects a series of points in the format
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
546 [[x1, x2, ...],
98
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
547 [y1, y2, ...]]'''
b85912ab4064 refactored projection functions
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 63
diff changeset
548 return projectArray(homography, array(trajectory))
28
9ae709a2e8d0 rearranged code
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
549
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
550 def invertHomography(homography):
384
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
551 '''Returns an inverted homography
6da9cf5609aa adding deprecated messages if old cvmat format
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 381
diff changeset
552 Unnecessary for reprojection over camera image'''
673
5505f9dbb28e corrected import bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 672
diff changeset
553 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
554 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
555 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
556 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
557
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
558 def undistortTrajectory(invMap1, invMap2, positions):
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
559 floorPositions = npfloor(positions)
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
560 #ceilPositions = npceil(positions)
474
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
561 undistortedTrajectory = [[],[]]
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
562 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
563 x,y = None, None
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
564 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
565 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
566 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
567 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
568 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
569 #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
570 #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
571 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
572 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
573 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
574 undistortedTrajectory[0].append(x)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
575 undistortedTrajectory[1].append(y)
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
576 return undistortedTrajectory
59903d14d244 added functions to undistort trajectories from inverse mapping
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 473
diff changeset
577
491
343cfd185ca6 minor changes and reaarrangements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 482
diff changeset
578 def projectGInputPoints(homography, points):
343cfd185ca6 minor changes and reaarrangements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 482
diff changeset
579 return projectTrajectory(homography, array(points+[points[0]]).T)
343cfd185ca6 minor changes and reaarrangements
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 482
diff changeset
580
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
581 if opencvAvailable:
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
582 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
583 '''Computes the translation of img2 with respect to img1
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
584 (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
585 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
586
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
587 TODO add diagnostic if data is all over the place, and it most likely is not a translation (eg zoom, other non linear distortion)'''
100
2a3cafcf5faf added function to compute the translation between two images
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 99
diff changeset
588
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
589 nextPoints = array([])
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
590 (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
591 # 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
592 delta = []
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
593 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
594 if status[k] == 1:
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
595 dp = p2-p1
769
dfdb2a3722cc moved import statements together
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 766
diff changeset
596 d = npsum(dp**2)
154
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
597 if d < maxTranslation2:
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
598 delta.append(dp)
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
599 if len(delta) >= minNMatches:
668710d4c773 updated computeTranslation with cv2
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 152
diff changeset
600 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
601 else:
156
2eef5620c0b3 added key values for opencv
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 154
diff changeset
602 print(dp)
112
67555e968b5e added tests if OpenCV python libraries are not available
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 102
diff changeset
603 return None
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
604
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
605 if skimageAvailable:
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
606 from skimage.feature import hog
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
607 from skimage import color, transform
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
608
893
ff92801e5c54 updated hog to scikit-image 0.13 (needed to add a block_norm attribute in classifier.cfg)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 868
diff changeset
609 def HOG(image, rescaleSize = (64, 64), orientations=9, pixelsPerCell=(8,8), cellsPerBlock=(2,2), blockNorm='L1', visualize=False, normalize=False):
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 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
611 inputImg = transform.resize(bwImg, rescaleSize)
893
ff92801e5c54 updated hog to scikit-image 0.13 (needed to add a block_norm attribute in classifier.cfg)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 868
diff changeset
612 features = hog(inputImg, orientations, pixelsPerCell, cellsPerBlock, blockNorm, visualize, normalize)
411
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
613 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
614 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
615 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
616 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
617 figure()
31604ef1cad4 added hog functions and the display of road user types if known
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 410
diff changeset
618 subplot(1,2,1)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
619 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
620 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
621 imshow(hogViz)
680
da1352b89d02 classification is working
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 673
diff changeset
622 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
623
893
ff92801e5c54 updated hog to scikit-image 0.13 (needed to add a block_norm attribute in classifier.cfg)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 868
diff changeset
624 def createHOGTrainingSet(imageDirectory, classLabel, rescaleSize = (64,64), orientations=9, pixelsPerCell=(8,8), blockNorm='L1', cellsPerBlock=(2, 2), visualize=False, normalize=False):
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
625 inputData = []
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
626 for filename in listdir(imageDirectory):
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
627 img = imread(imageDirectory+filename)
893
ff92801e5c54 updated hog to scikit-image 0.13 (needed to add a block_norm attribute in classifier.cfg)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 868
diff changeset
628 features = HOG(img, rescaleSize, orientations, pixelsPerCell, cellsPerBlock, blockNorm, visualize, normalize)
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
629 inputData.append(features)
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
630
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
631 nImages = len(inputData)
788
5b970a5bc233 updated classifying code to OpenCV 3.x (bug in function to load classification models)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 774
diff changeset
632 return array(inputData, dtype = float32), array([classLabel]*nImages)
365
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
633
22ddb8f85495 added function to create HOG training set
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 346
diff changeset
634
807
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
635 #########################
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
636 # running tests
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
637 #########################
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
638
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
639 if __name__ == "__main__":
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
640 import doctest
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
641 import unittest
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
642 suite = doctest.DocFileSuite('tests/cvutils.txt')
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
643 #suite = doctest.DocTestSuite()
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
644 unittest.TextTestRunner().run(suite)
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
645 #doctest.testmod()
52aa03260f03 reversed all code to OpenCV 2.4.13
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 799
diff changeset
646 #doctest.testfile("example.txt")