Mercurial > hg > nsaunier > traffic-intelligence
comparison python/cvutils.py @ 544:749672171789
added function to calibrate a camera intrinsic parameters
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 08 Jul 2014 15:32:47 -0400 |
| parents | bd1ad468e928 |
| children | 9816fab353f3 |
comparison
equal
deleted
inserted
replaced
| 543:cb213269d330 | 544:749672171789 |
|---|---|
| 119 newCameraMatrix[1,2] = newImgSize[1]/2. | 119 newCameraMatrix[1,2] = newImgSize[1]/2. |
| 120 return cv2.initUndistortRectifyMap(intrinsicCameraMatrix, array(distortionCoefficients), identity(3), newCameraMatrix, newImgSize, cv2.CV_32FC1) | 120 return cv2.initUndistortRectifyMap(intrinsicCameraMatrix, array(distortionCoefficients), identity(3), newCameraMatrix, newImgSize, cv2.CV_32FC1) |
| 121 | 121 |
| 122 def playVideo(filename, firstFrameNum = 0, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1.): | 122 def playVideo(filename, firstFrameNum = 0, frameRate = -1, interactive = False, printFrames = True, text = None, rescale = 1.): |
| 123 '''Plays the video''' | 123 '''Plays the video''' |
| 124 windowName = 'frame' | |
| 125 cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) | |
| 124 wait = 5 | 126 wait = 5 |
| 125 if frameRate > 0: | 127 if frameRate > 0: |
| 126 wait = int(round(1000./frameRate)) | 128 wait = int(round(1000./frameRate)) |
| 127 if interactive: | 129 if interactive: |
| 128 wait = 0 | 130 wait = 0 |
| 138 if printFrames: | 140 if printFrames: |
| 139 print('frame {0}'.format(frameNum)) | 141 print('frame {0}'.format(frameNum)) |
| 140 frameNum+=1 | 142 frameNum+=1 |
| 141 if text != None: | 143 if text != None: |
| 142 cv2.putText(img, text, (10,50), cv2.cv.CV_FONT_HERSHEY_PLAIN, 1, cvRed) | 144 cv2.putText(img, text, (10,50), cv2.cv.CV_FONT_HERSHEY_PLAIN, 1, cvRed) |
| 143 cvImshow('frame', img, rescale) | 145 cvImshow(windowName, img, rescale) |
| 144 key = cv2.waitKey(wait) | 146 key = cv2.waitKey(wait) |
| 145 cv2.destroyAllWindows() | 147 cv2.destroyAllWindows() |
| 146 else: | 148 else: |
| 147 print('Video capture for {} failed'.format(filename)) | 149 print('Video capture for {} failed'.format(filename)) |
| 148 | 150 |
| 217 from math import ceil, log10 | 219 from math import ceil, log10 |
| 218 | 220 |
| 219 capture = cv2.VideoCapture(videoFilename) | 221 capture = cv2.VideoCapture(videoFilename) |
| 220 width = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) | 222 width = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)) |
| 221 height = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)) | 223 height = int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)) |
| 224 | |
| 225 windowName = 'frame' | |
| 226 #cv2.namedWindow(windowName, cv2.WINDOW_NORMAL) | |
| 222 | 227 |
| 223 if undistort: # setup undistortion | 228 if undistort: # setup undistortion |
| 224 [map1, map2] = computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients) | 229 [map1, map2] = computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients) |
| 225 if capture.isOpened(): | 230 if capture.isOpened(): |
| 226 key = -1 | 231 key = -1 |
| 257 objDescription = '{} '.format(obj.num) | 262 objDescription = '{} '.format(obj.num) |
| 258 if userTypeNames[obj.userType] != 'unknown': | 263 if userTypeNames[obj.userType] != 'unknown': |
| 259 objDescription += userTypeNames[obj.userType][0].upper() | 264 objDescription += userTypeNames[obj.userType][0].upper() |
| 260 cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.cv.CV_FONT_HERSHEY_PLAIN, 1, cvRed) | 265 cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.cv.CV_FONT_HERSHEY_PLAIN, 1, cvRed) |
| 261 if not saveAllImages: | 266 if not saveAllImages: |
| 262 cvImshow('frame', img, rescale) | 267 cvImshow(windowName, img, rescale) |
| 263 key = cv2.waitKey() | 268 key = cv2.waitKey() |
| 264 if saveAllImages or saveKey(key): | 269 if saveAllImages or saveKey(key): |
| 265 cv2.imwrite('image-{{:0{}}}.png'.format(nZerosFilename).format(frameNum), img) | 270 cv2.imwrite('image-{{:0{}}}.png'.format(nZerosFilename).format(frameNum), img) |
| 266 frameNum += nFramesStep | 271 frameNum += nFramesStep |
| 267 if nFramesStep > 1: | 272 if nFramesStep > 1: |
| 322 res = undistortedCoordinates(x,y, map1, map2) | 327 res = undistortedCoordinates(x,y, map1, map2) |
| 323 if not isnan(res).any(): | 328 if not isnan(res).any(): |
| 324 invMap1[y,x] = res[0] | 329 invMap1[y,x] = res[0] |
| 325 invMap2[y,x] = res[1] | 330 invMap2[y,x] = res[1] |
| 326 return invMap1, invMap2 | 331 return invMap1, invMap2 |
| 332 | |
| 333 def cameraIntrinsicCalibration(path, checkerBoardSize=[6,7], secondPassSearch=False, display=False): | |
| 334 ''' Camera calibration searches through all the images (jpg or png) located | |
| 335 in _path_ for matches to a checkerboard pattern of size checkboardSize. | |
| 336 These images should all be of the same camera with the same resolution. | |
| 337 | |
| 338 For best results, use an asymetric board and ensure that the image has | |
| 339 very high contrast, including the background. Suitable checkerboard: | |
| 340 http://ftp.isr.ist.utl.pt/pub/roswiki/attachments/camera_calibration(2f)Tutorials(2f)StereoCalibration/check-108.png | |
| 341 | |
| 342 The code below is based off of: | |
| 343 https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html | |
| 344 Modified by Paul St-Aubin | |
| 345 ''' | |
| 346 from numpy import zeros, mgrid, float32, savetxt | |
| 347 import glob, os | |
| 348 | |
| 349 # termination criteria | |
| 350 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) | |
| 351 | |
| 352 # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) | |
| 353 objp = zeros((checkerBoardSize[0]*checkerBoardSize[1],3), float32) | |
| 354 objp[:,:2] = mgrid[0:checkerBoardSize[1],0:checkerBoardSize[0]].T.reshape(-1,2) | |
| 355 | |
| 356 # Arrays to store object points and image points from all the images. | |
| 357 objpoints = [] # 3d point in real world space | |
| 358 imgpoints = [] # 2d points in image plane. | |
| 359 | |
| 360 ## Loop throuhg all images in _path_ | |
| 361 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]')) | |
| 362 for fname in images: | |
| 363 img = cv2.imread(fname) | |
| 364 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) | |
| 365 | |
| 366 # Find the chess board corners | |
| 367 ret, corners = cv2.findChessboardCorners(gray, (checkerBoardSize[1],checkerBoardSize[0]), None) | |
| 368 | |
| 369 # If found, add object points, image points (after refining them) | |
| 370 if ret: | |
| 371 print 'Found pattern in '+fname | |
| 372 | |
| 373 if(secondPassSearch): | |
| 374 corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria) | |
| 375 | |
| 376 objpoints.append(objp) | |
| 377 imgpoints.append(corners) | |
| 378 | |
| 379 # Draw and display the corners | |
| 380 if(display): | |
| 381 img = cv2.drawChessboardCorners(img, (checkerBoardSize[1],checkerBoardSize[0]), corners, ret) | |
| 382 if(img): | |
| 383 cv2.imshow('img',img) | |
| 384 cv2.waitKey(0) | |
| 385 | |
| 386 ## Close up image loading and calibrate | |
| 387 cv2.destroyAllWindows() | |
| 388 if len(objpoints) == 0 or len(imgpoints) == 0: | |
| 389 return False | |
| 390 try: | |
| 391 ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) | |
| 392 except NameError: | |
| 393 return False | |
| 394 savetxt('intrinsic-camera.txt', camera_matrix) | |
| 395 return camera_matrix, dist_coeffs | |
| 327 | 396 |
| 328 def printCvMat(cvmat, out = stdout): | 397 def printCvMat(cvmat, out = stdout): |
| 329 '''Prints the cvmat to out''' | 398 '''Prints the cvmat to out''' |
| 330 print('Deprecated, use new interface') | 399 print('Deprecated, use new interface') |
| 331 for i in xrange(cvmat.rows): | 400 for i in xrange(cvmat.rows): |
