Mercurial > hg > nsaunier > traffic-intelligence
comparison python/cvutils.py @ 993:e8eabef7857c
update to OpenCV3 for python
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Wed, 16 May 2018 21:06:52 -0400 |
| parents | 132d84ce9f0c |
| children | 933670761a57 |
comparison
equal
deleted
inserted
replaced
| 992:2cd1ce245024 | 993:e8eabef7857c |
|---|---|
| 91 if opencvAvailable: | 91 if opencvAvailable: |
| 92 def computeHomography(srcPoints, dstPoints, method=0, ransacReprojThreshold=3.0): | 92 def computeHomography(srcPoints, dstPoints, method=0, ransacReprojThreshold=3.0): |
| 93 '''Returns the homography matrix mapping from srcPoints to dstPoints (dimension Nx2)''' | 93 '''Returns the homography matrix mapping from srcPoints to dstPoints (dimension Nx2)''' |
| 94 H, mask = cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold) | 94 H, mask = cv2.findHomography(srcPoints, dstPoints, method, ransacReprojThreshold) |
| 95 return H | 95 return H |
| 96 | |
| 97 def arrayToCvMat(a, t = cv2.CV_64FC1): | |
| 98 '''Converts a numpy array to an OpenCV CvMat, with default type CV_64FC1.''' | |
| 99 print('Deprecated, use new interface') | |
| 100 cvmat = cv2.cv.CreateMat(a.shape[0], a.shape[1], t) | |
| 101 for i in range(cvmat.rows): | |
| 102 for j in range(cvmat.cols): | |
| 103 cvmat[i,j] = a[i,j] | |
| 104 return cvmat | |
| 105 | 96 |
| 106 def cvPlot(img, positions, color, lastCoordinate = None, **kwargs): | 97 def cvPlot(img, positions, color, lastCoordinate = None, **kwargs): |
| 107 if lastCoordinate is None: | 98 if lastCoordinate is None: |
| 108 last = positions.length()-1 | 99 last = positions.length()-1 |
| 109 elif lastCoordinate >=0: | 100 elif lastCoordinate >=0: |
| 150 key = -1 | 141 key = -1 |
| 151 ret = True | 142 ret = True |
| 152 nFramesShown = 0 | 143 nFramesShown = 0 |
| 153 if firstFrameNums is not None: | 144 if firstFrameNums is not None: |
| 154 for i in xrange(len(captures)): | 145 for i in xrange(len(captures)): |
| 155 captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i]) | 146 captures[i].set(cv2.PROP_POS_FRAMES, firstFrameNums[i]) |
| 156 while ret and not quitKey(key): | 147 while ret and not quitKey(key): |
| 157 rets = [] | 148 rets = [] |
| 158 images = [] | 149 images = [] |
| 159 for cap in captures: | 150 for cap in captures: |
| 160 ret, img = cap.read() | 151 ret, img = cap.read() |
| 172 if saveKey(key): | 163 if saveKey(key): |
| 173 cv2.imwrite('image-{}.png'.format(frameNum), img) | 164 cv2.imwrite('image-{}.png'.format(frameNum), img) |
| 174 nFramesShown += step | 165 nFramesShown += step |
| 175 if step > 1: | 166 if step > 1: |
| 176 for i in xrange(len(captures)): | 167 for i in xrange(len(captures)): |
| 177 captures[i].set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNums[i]+nFramesShown) | 168 captures[i].set(cv2.CAP_PROP_POS_FRAMES, firstFrameNums[i]+nFramesShown) |
| 178 cv2.destroyAllWindows() | 169 cv2.destroyAllWindows() |
| 179 else: | 170 else: |
| 180 print('Video captures for {} failed'.format(filenames)) | 171 print('Video captures for {} failed'.format(filenames)) |
| 181 | 172 |
| 182 def infoVideo(filename): | 173 def infoVideo(filename): |
| 183 '''Provides all available info on video ''' | 174 '''Provides all available info on video ''' |
| 184 cvPropertyNames = {cv2.cv.CV_CAP_PROP_FORMAT: "format", | 175 cvPropertyNames = {cv2.CAP_PROP_FORMAT: "format", |
| 185 cv2.cv.CV_CAP_PROP_FOURCC: "codec (fourcc)", | 176 cv2.CAP_PROP_FOURCC: "codec (fourcc)", |
| 186 cv2.cv.CV_CAP_PROP_FPS: "fps", | 177 cv2.CAP_PROP_FPS: "fps", |
| 187 cv2.cv.CV_CAP_PROP_FRAME_COUNT: "number of frames", | 178 cv2.CAP_PROP_FRAME_COUNT: "number of frames", |
| 188 cv2.cv.CV_CAP_PROP_FRAME_HEIGHT: "heigh", | 179 cv2.CAP_PROP_FRAME_HEIGHT: "heigh", |
| 189 cv2.cv.CV_CAP_PROP_FRAME_WIDTH: "width", | 180 cv2.CAP_PROP_FRAME_WIDTH: "width", |
| 190 cv2.cv.CV_CAP_PROP_RECTIFICATION: "rectification", | 181 cv2.CAP_PROP_RECTIFICATION: "rectification", |
| 191 cv2.cv.CV_CAP_PROP_SATURATION: "saturation"} | 182 cv2.CAP_PROP_SATURATION: "saturation"} |
| 192 capture = cv2.VideoCapture(filename) | 183 capture = cv2.VideoCapture(filename) |
| 193 videoProperties = {} | 184 videoProperties = {} |
| 194 if capture.isOpened(): | 185 if capture.isOpened(): |
| 195 for cvprop in [#cv2.cv.CV_CAP_PROP_BRIGHTNESS | 186 for cvprop in [#cv2.CAP_PROP_BRIGHTNESS |
| 196 #cv2.cv.CV_CAP_PROP_CONTRAST | 187 #cv2.CAP_PROP_CONTRAST |
| 197 #cv2.cv.CV_CAP_PROP_CONVERT_RGB | 188 #cv2.CAP_PROP_CONVERT_RGB |
| 198 #cv2.cv.CV_CAP_PROP_EXPOSURE | 189 #cv2.CAP_PROP_EXPOSURE |
| 199 cv2.cv.CV_CAP_PROP_FORMAT, | 190 cv2.CAP_PROP_FORMAT, |
| 200 cv2.cv.CV_CAP_PROP_FOURCC, | 191 cv2.CAP_PROP_FOURCC, |
| 201 cv2.cv.CV_CAP_PROP_FPS, | 192 cv2.CAP_PROP_FPS, |
| 202 cv2.cv.CV_CAP_PROP_FRAME_COUNT, | 193 cv2.CAP_PROP_FRAME_COUNT, |
| 203 cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, | 194 cv2.CAP_PROP_FRAME_HEIGHT, |
| 204 cv2.cv.CV_CAP_PROP_FRAME_WIDTH, | 195 cv2.CAP_PROP_FRAME_WIDTH, |
| 205 #cv2.cv.CV_CAP_PROP_GAIN, | 196 #cv2.CAP_PROP_GAIN, |
| 206 #cv2.cv.CV_CAP_PROP_HUE | 197 #cv2.CAP_PROP_HUE |
| 207 #cv2.cv.CV_CAP_PROP_MODE | 198 #cv2.CAP_PROP_MODE |
| 208 #cv2.cv.CV_CAP_PROP_POS_AVI_RATIO | 199 #cv2.CAP_PROP_POS_AVI_RATIO |
| 209 #cv2.cv.CV_CAP_PROP_POS_FRAMES | 200 #cv2.CAP_PROP_POS_FRAMES |
| 210 #cv2.cv.CV_CAP_PROP_POS_MSEC | 201 #cv2.CAP_PROP_POS_MSEC |
| 211 #cv2.cv.CV_CAP_PROP_RECTIFICATION, | 202 #cv2.CAP_PROP_RECTIFICATION, |
| 212 #cv2.cv.CV_CAP_PROP_SATURATION | 203 #cv2.CAP_PROP_SATURATION |
| 213 ]: | 204 ]: |
| 214 prop = capture.get(cvprop) | 205 prop = capture.get(cvprop) |
| 215 if cvprop == cv2.cv.CV_CAP_PROP_FOURCC and prop > 0: | 206 if cvprop == cv2.CAP_PROP_FOURCC and prop > 0: |
| 216 prop = int2FOURCC(int(prop)) | 207 prop = int2FOURCC(int(prop)) |
| 217 videoProperties[cvPropertyNames[cvprop]] = prop | 208 videoProperties[cvPropertyNames[cvprop]] = prop |
| 218 else: | 209 else: |
| 219 print('Video capture for {} failed'.format(filename)) | 210 print('Video capture for {} failed'.format(filename)) |
| 220 return videoProperties | 211 return videoProperties |
| 222 def getImagesFromVideo(videoFilename, firstFrameNum = 0, lastFrameNum = 1, step = 1, saveImage = False, outputPrefix = 'image'): | 213 def getImagesFromVideo(videoFilename, firstFrameNum = 0, lastFrameNum = 1, step = 1, saveImage = False, outputPrefix = 'image'): |
| 223 '''Returns nFrames images from the video sequence''' | 214 '''Returns nFrames images from the video sequence''' |
| 224 images = [] | 215 images = [] |
| 225 capture = cv2.VideoCapture(videoFilename) | 216 capture = cv2.VideoCapture(videoFilename) |
| 226 if capture.isOpened(): | 217 if capture.isOpened(): |
| 227 rawCount = capture.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT) | 218 rawCount = capture.get(cv2.CAP_PROP_FRAME_COUNT) |
| 228 if rawCount < 0: | 219 if rawCount < 0: |
| 229 rawCount = lastFrameNum+1 | 220 rawCount = lastFrameNum+1 |
| 230 nDigits = int(floor(log10(rawCount)))+1 | 221 nDigits = int(floor(log10(rawCount)))+1 |
| 231 ret = False | 222 ret = False |
| 232 capture.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNum) | 223 capture.set(cv2.CAP_PROP_POS_FRAMES, firstFrameNum) |
| 233 frameNum = firstFrameNum | 224 frameNum = firstFrameNum |
| 234 while frameNum<lastFrameNum and frameNum<rawCount: | 225 while frameNum<lastFrameNum and frameNum<rawCount: |
| 235 ret, img = capture.read() | 226 ret, img = capture.read() |
| 236 i = 0 | 227 i = 0 |
| 237 while not ret and i<10: | 228 while not ret and i<10: |
| 243 cv2.imwrite(outputPrefix+frameNumStr+'.png', img) | 234 cv2.imwrite(outputPrefix+frameNumStr+'.png', img) |
| 244 else: | 235 else: |
| 245 images.append(img) | 236 images.append(img) |
| 246 frameNum +=step | 237 frameNum +=step |
| 247 if step > 1: | 238 if step > 1: |
| 248 capture.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, frameNum) | 239 capture.set(cv2.CAP_PROP_POS_FRAMES, frameNum) |
| 249 capture.release() | 240 capture.release() |
| 250 else: | 241 else: |
| 251 print('Video capture for {} failed'.format(videoFilename)) | 242 print('Video capture for {} failed'.format(videoFilename)) |
| 252 return images | 243 return images |
| 253 | 244 |
| 254 def getFPS(videoFilename): | 245 def getFPS(videoFilename): |
| 255 capture = cv2.VideoCapture(videoFilename) | 246 capture = cv2.VideoCapture(videoFilename) |
| 256 if capture.isOpened(): | 247 if capture.isOpened(): |
| 257 fps = capture.get(cv2.cv.CV_CAP_PROP_FPS) | 248 fps = capture.get(cv2.CAP_PROP_FPS) |
| 258 capture.release() | 249 capture.release() |
| 259 return fps | 250 return fps |
| 260 else: | 251 else: |
| 261 print('Video capture for {} failed'.format(videoFilename)) | 252 print('Video capture for {} failed'.format(videoFilename)) |
| 262 return None | 253 return None |
| 298 colorType = 'colorblind' | 289 colorType = 'colorblind' |
| 299 else: | 290 else: |
| 300 colorType = 'default' | 291 colorType = 'default' |
| 301 | 292 |
| 302 capture = cv2.VideoCapture(videoFilename) | 293 capture = cv2.VideoCapture(videoFilename) |
| 303 width = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) | 294 width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)) |
| 304 height = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)) | 295 height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
| 305 | 296 |
| 306 windowName = 'frame' | 297 windowName = 'frame' |
| 307 if rescale == 1.: | 298 if rescale == 1.: |
| 308 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) | 299 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) |
| 309 | 300 |
| 311 [map1, map2], newCameraMatrix = computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients) | 302 [map1, map2], newCameraMatrix = computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients) |
| 312 if capture.isOpened(): | 303 if capture.isOpened(): |
| 313 key = -1 | 304 key = -1 |
| 314 ret = True | 305 ret = True |
| 315 frameNum = firstFrameNum | 306 frameNum = firstFrameNum |
| 316 capture.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, firstFrameNum) | 307 capture.set(cv2.CAP_PROP_POS_FRAMES, firstFrameNum) |
| 317 if lastFrameNumArg is None: | 308 if lastFrameNumArg is None: |
| 318 lastFrameNum = float("inf") | 309 lastFrameNum = float("inf") |
| 319 else: | 310 else: |
| 320 lastFrameNum = lastFrameNumArg | 311 lastFrameNum = lastFrameNumArg |
| 321 if nZerosFilenameArg is None: | 312 if nZerosFilenameArg is None: |
| 372 key = cv2.waitKey() | 363 key = cv2.waitKey() |
| 373 if saveAllImages or saveKey(key): | 364 if saveAllImages or saveKey(key): |
| 374 cv2.imwrite('image-{{:0{}}}.png'.format(nZerosFilename).format(frameNum), img) | 365 cv2.imwrite('image-{{:0{}}}.png'.format(nZerosFilename).format(frameNum), img) |
| 375 frameNum += nFramesStep | 366 frameNum += nFramesStep |
| 376 if nFramesStep > 1: | 367 if nFramesStep > 1: |
| 377 capture.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, frameNum) | 368 capture.set(cv2.CAP_PROP_POS_FRAMES, frameNum) |
| 378 cv2.destroyAllWindows() | 369 cv2.destroyAllWindows() |
| 379 else: | 370 else: |
| 380 print('Cannot load file ' + videoFilename) | 371 print('Cannot load file ' + videoFilename) |
| 381 | 372 |
| 382 def computeHomographyFromPDTV(camera): | 373 def computeHomographyFromPDTV(camera): |
| 494 if len(objpoints) == 0 or len(imgpoints) == 0: | 485 if len(objpoints) == 0 or len(imgpoints) == 0: |
| 495 return None | 486 return None |
| 496 try: | 487 try: |
| 497 flags = 0 | 488 flags = 0 |
| 498 if fixK2: | 489 if fixK2: |
| 499 flags += cv2.cv.CV_CALIB_FIX_K2 | 490 flags += cv2.CALIB_FIX_K2 |
| 500 if fixK3: | 491 if fixK3: |
| 501 flags += cv2.cv.CV_CALIB_FIX_K3 | 492 flags += cv2.CALIB_FIX_K3 |
| 502 if zeroTangent: | 493 if zeroTangent: |
| 503 flags += cv2.cv.CV_CALIB_ZERO_TANGENT_DIST | 494 flags += cv2.CALIB_ZERO_TANGENT_DIST |
| 504 ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None, flags = flags) | 495 ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None, flags = flags) |
| 505 except NameError: | 496 except NameError: |
| 506 return None | 497 return None |
| 507 savetxt('intrinsic-camera.txt', camera_matrix) | 498 savetxt('intrinsic-camera.txt', camera_matrix) |
| 508 print('error: {}'.format(ret)) | 499 print('error: {}'.format(ret)) |
