comparison python/cvutils.py @ 672:5473b7460375

moved and rationalized imports in modules
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 26 May 2015 13:53:40 +0200
parents 15e244d2a1b5
children 5505f9dbb28e
comparison
equal deleted inserted replaced
671:849f5f8bf4b9 672:5473b7460375
15 except ImportError: 15 except ImportError:
16 print('Scikit-image library could not be loaded (HoG-based classification methods will not be available)') 16 print('Scikit-image library could not be loaded (HoG-based classification methods will not be available)')
17 skimageAvailable = False 17 skimageAvailable = False
18 18
19 from sys import stdout 19 from sys import stdout
20 from numpy import dot, array, append
20 21
21 #import aggdraw # agg on top of PIL (antialiased drawing) 22 #import aggdraw # agg on top of PIL (antialiased drawing)
22 23
23 24
24 cvRed = (0,0,255) 25 cvRed = (0,0,255)
65 points = loadtxt(filename, delimiter=',') 66 points = loadtxt(filename, delimiter=',')
66 savetxt(utils.removeExtension(filename)+'-point-correspondences.txt',append(points[:,:2].T, points[:,3:].T, axis=0)) 67 savetxt(utils.removeExtension(filename)+'-point-correspondences.txt',append(points[:,:2].T, points[:,3:].T, axis=0))
67 68
68 def loadPointCorrespondences(filename): 69 def loadPointCorrespondences(filename):
69 '''Loads and returns the corresponding points in world (first 2 lines) and image spaces (last 2 lines)''' 70 '''Loads and returns the corresponding points in world (first 2 lines) and image spaces (last 2 lines)'''
70 from numpy.lib.npyio import loadtxt 71 from numpy import loadtxt, float32
71 from numpy import float32
72 points = loadtxt(filename, dtype=float32) 72 points = loadtxt(filename, dtype=float32)
73 return (points[:2,:].T, points[2:,:].T) # (world points, image points) 73 return (points[:2,:].T, points[2:,:].T) # (world points, image points)
74 74
75 def cvMatToArray(cvmat): 75 def cvMatToArray(cvmat):
76 '''Converts an OpenCV CvMat to numpy array.''' 76 '''Converts an OpenCV CvMat to numpy array.'''
77 print('Deprecated, use new interface') 77 print('Deprecated, use new interface')
78 from numpy.core.multiarray import zeros 78 from numpy import zeros
79 a = zeros((cvmat.rows, cvmat.cols))#array([[0.0]*cvmat.width]*cvmat.height) 79 a = zeros((cvmat.rows, cvmat.cols))#array([[0.0]*cvmat.width]*cvmat.height)
80 for i in xrange(cvmat.rows): 80 for i in xrange(cvmat.rows):
81 for j in xrange(cvmat.cols): 81 for j in xrange(cvmat.cols):
82 a[i,j] = cvmat[i,j] 82 a[i,j] = cvmat[i,j]
83 return a 83 return a
114 else: 114 else:
115 cv2.imshow(windowName, img) 115 cv2.imshow(windowName, img)
116 116
117 def computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients): 117 def computeUndistortMaps(width, height, undistortedImageMultiplication, intrinsicCameraMatrix, distortionCoefficients):
118 from copy import deepcopy 118 from copy import deepcopy
119 from numpy import identity, array 119 from numpy import identity
120 newImgSize = (int(round(width*undistortedImageMultiplication)), int(round(height*undistortedImageMultiplication))) 120 newImgSize = (int(round(width*undistortedImageMultiplication)), int(round(height*undistortedImageMultiplication)))
121 newCameraMatrix = deepcopy(intrinsicCameraMatrix) 121 newCameraMatrix = deepcopy(intrinsicCameraMatrix)
122 newCameraMatrix[0,2] = newImgSize[0]/2. 122 newCameraMatrix[0,2] = newImgSize[0]/2.
123 newCameraMatrix[1,2] = newImgSize[1]/2. 123 newCameraMatrix[1,2] = newImgSize[1]/2.
124 return cv2.initUndistortRectifyMap(intrinsicCameraMatrix, array(distortionCoefficients), identity(3), newCameraMatrix, newImgSize, cv2.CV_32FC1) 124 return cv2.initUndistortRectifyMap(intrinsicCameraMatrix, array(distortionCoefficients), identity(3), newCameraMatrix, newImgSize, cv2.CV_32FC1)
323 print 'Cannot load file ' + videoFilename 323 print 'Cannot load file ' + videoFilename
324 324
325 def computeHomographyFromPDTV(camera): 325 def computeHomographyFromPDTV(camera):
326 '''Returns the homography matrix at ground level from PDTV camera 326 '''Returns the homography matrix at ground level from PDTV camera
327 https://bitbucket.org/hakanardo/pdtv''' 327 https://bitbucket.org/hakanardo/pdtv'''
328 from numpy import array
329 # camera = pdtv.load(cameraFilename) 328 # camera = pdtv.load(cameraFilename)
330 srcPoints = [[x,y] for x, y in zip([1.,2.,2.,1.],[1.,1.,2.,2.])] # need floats!! 329 srcPoints = [[x,y] for x, y in zip([1.,2.,2.,1.],[1.,1.,2.,2.])] # need floats!!
331 dstPoints = [] 330 dstPoints = []
332 for srcPoint in srcPoints: 331 for srcPoint in srcPoints:
333 projected = camera.image_to_world(tuple(srcPoint)) 332 projected = camera.image_to_world(tuple(srcPoint))
338 def undistortedCoordinates(map1, map2, x, y, maxDistance = 1.): 337 def undistortedCoordinates(map1, map2, x, y, maxDistance = 1.):
339 '''Returns the coordinates of a point in undistorted image 338 '''Returns the coordinates of a point in undistorted image
340 map1 and map2 are the mapping functions from undistorted image 339 map1 and map2 are the mapping functions from undistorted image
341 to distorted (original image) 340 to distorted (original image)
342 map1(x,y) = originalx, originaly''' 341 map1(x,y) = originalx, originaly'''
343 from numpy import abs, logical_and, unravel_index, dot, sum 342 from numpy import abs, logical_and, unravel_index, sum
344 from matplotlib.mlab import find 343 from matplotlib.mlab import find
345 distx = abs(map1-x) 344 distx = abs(map1-x)
346 disty = abs(map2-y) 345 disty = abs(map2-y)
347 indices = logical_and(distx<maxDistance, disty<maxDistance) 346 indices = logical_and(distx<maxDistance, disty<maxDistance)
348 closeCoordinates = unravel_index(find(indices), distx.shape) # returns i,j, ie y,x 347 closeCoordinates = unravel_index(find(indices), distx.shape) # returns i,j, ie y,x
457 out.write('\n') 456 out.write('\n')
458 457
459 def projectArray(homography, points): 458 def projectArray(homography, points):
460 '''Returns the coordinates of the projected points through homography 459 '''Returns the coordinates of the projected points through homography
461 (format: array 2xN points)''' 460 (format: array 2xN points)'''
462 from numpy.core import dot
463 from numpy.core.multiarray import array
464 from numpy.lib.function_base import append
465
466 if points.shape[0] != 2: 461 if points.shape[0] != 2:
467 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) 462 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1]))
468 463
469 if (homography is not None) and homography.size>0: 464 if (homography is not None) and homography.size>0:
470 #alternatively, on could use cv2.convertpointstohomogeneous and other conversion to/from homogeneous coordinates 465 #alternatively, on could use cv2.convertpointstohomogeneous and other conversion to/from homogeneous coordinates
475 return points 470 return points
476 471
477 def project(homography, p): 472 def project(homography, p):
478 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1] 473 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1]
479 through homography''' 474 through homography'''
480 from numpy import array
481 return projectArray(homography, array([[p[0]],[p[1]]])) 475 return projectArray(homography, array([[p[0]],[p[1]]]))
482 476
483 def projectTrajectory(homography, trajectory): 477 def projectTrajectory(homography, trajectory):
484 '''Projects a series of points in the format 478 '''Projects a series of points in the format
485 [[x1, x2, ...], 479 [[x1, x2, ...],
486 [y1, y2, ...]]''' 480 [y1, y2, ...]]'''
487 from numpy.core.multiarray import array
488 return projectArray(homography, array(trajectory)) 481 return projectArray(homography, array(trajectory))
489 482
490 def invertHomography(homography): 483 def invertHomography(homography):
491 '''Returns an inverted homography 484 '''Returns an inverted homography
492 Unnecessary for reprojection over camera image''' 485 Unnecessary for reprojection over camera image'''
493 from numpy.linalg.linalg import inv 486 from numpy import inv
494 invH = inv(homography) 487 invH = inv(homography)
495 invH /= invH[2,2] 488 invH /= invH[2,2]
496 return invH 489 return invH
497 490
498 def undistortTrajectory(invMap1, invMap2, positions): 491 def undistortTrajectory(invMap1, invMap2, positions):
515 undistortedTrajectory[0].append(x) 508 undistortedTrajectory[0].append(x)
516 undistortedTrajectory[1].append(y) 509 undistortedTrajectory[1].append(y)
517 return undistortedTrajectory 510 return undistortedTrajectory
518 511
519 def projectGInputPoints(homography, points): 512 def projectGInputPoints(homography, points):
520 from numpy import array
521 return projectTrajectory(homography, array(points+[points[0]]).T) 513 return projectTrajectory(homography, array(points+[points[0]]).T)
522 514
523 if opencvAvailable: 515 if opencvAvailable:
524 def computeTranslation(img1, img2, img1Points, maxTranslation2, minNMatches, windowSize = (5,5), level = 5, criteria = (cv2.TERM_CRITERIA_EPS, 0, 0.01)): 516 def computeTranslation(img1, img2, img1Points, maxTranslation2, minNMatches, windowSize = (5,5), level = 5, criteria = (cv2.TERM_CRITERIA_EPS, 0, 0.01)):
525 '''Computes the translation of img2 with respect to img1 517 '''Computes the translation of img2 with respect to img1
526 (loaded using OpenCV as numpy arrays) 518 (loaded using OpenCV as numpy arrays)
527 img1Points are used to compute the translation 519 img1Points are used to compute the translation
528 520
529 TODO add diagnostic if data is all over the place, and it most likely is not a translation (eg zoom, other non linear distortion)''' 521 TODO add diagnostic if data is all over the place, and it most likely is not a translation (eg zoom, other non linear distortion)'''
530 from numpy.core.multiarray import array 522 from numpy import median, sum
531 from numpy.lib.function_base import median
532 from numpy.core.fromnumeric import sum
533 523
534 nextPoints = array([]) 524 nextPoints = array([])
535 (img2Points, status, track_error) = cv2.calcOpticalFlowPyrLK(img1, img2, img1Points, nextPoints, winSize=windowSize, maxLevel=level, criteria=criteria) 525 (img2Points, status, track_error) = cv2.calcOpticalFlowPyrLK(img1, img2, img1Points, nextPoints, winSize=windowSize, maxLevel=level, criteria=criteria)
536 # calcOpticalFlowPyrLK(prevImg, nextImg, prevPts[, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, derivLambda[, flags]]]]]]]]) -> nextPts, status, err 526 # calcOpticalFlowPyrLK(prevImg, nextImg, prevPts[, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, derivLambda[, flags]]]]]]]]) -> nextPts, status, err
537 delta = [] 527 delta = []
566 imshow(hogViz) 556 imshow(hogViz)
567 return features 557 return features
568 558
569 def createHOGTrainingSet(imageDirectory, classLabel, rescaleSize = (64, 64), orientations=9, pixelsPerCell=(8, 8), cellsPerBlock=(2, 2), visualize=False, normalize=False): 559 def createHOGTrainingSet(imageDirectory, classLabel, rescaleSize = (64, 64), orientations=9, pixelsPerCell=(8, 8), cellsPerBlock=(2, 2), visualize=False, normalize=False):
570 from os import listdir 560 from os import listdir
571 from numpy import array, float32 561 from numpy import float32
572 from matplotlib.pyplot import imread 562 from matplotlib.pyplot import imread
573 563
574 inputData = [] 564 inputData = []
575 for filename in listdir(imageDirectory): 565 for filename in listdir(imageDirectory):
576 img = imread(imageDirectory+filename) 566 img = imread(imageDirectory+filename)