Mercurial > hg > nsaunier > traffic-intelligence
comparison python/cvutils.py @ 930:7db0f2853bfd
corrected projection back to image space
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Thu, 13 Jul 2017 00:31:54 -0400 |
| parents | be28a3538dc9 |
| children | 8148991b1dab |
comparison
equal
deleted
inserted
replaced
| 929:be28a3538dc9 | 930:7db0f2853bfd |
|---|---|
| 20 from os import listdir | 20 from os import listdir |
| 21 from copy import deepcopy | 21 from copy import deepcopy |
| 22 from math import floor, log10, ceil | 22 from math import floor, log10, ceil |
| 23 | 23 |
| 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 | 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 |
| 25 from numpy.linalg import inv | |
| 25 from matplotlib.mlab import find | 26 from matplotlib.mlab import find |
| 26 from matplotlib.pyplot import imread, imsave | 27 from matplotlib.pyplot import imread, imsave |
| 27 | 28 |
| 28 | 29 |
| 29 | 30 |
| 516 for i in xrange(cvmat.rows): | 517 for i in xrange(cvmat.rows): |
| 517 for j in xrange(cvmat.cols): | 518 for j in xrange(cvmat.cols): |
| 518 out.write('{0} '.format(cvmat[i,j])) | 519 out.write('{0} '.format(cvmat[i,j])) |
| 519 out.write('\n') | 520 out.write('\n') |
| 520 | 521 |
| 521 def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None): | 522 def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None, newCameraMatrix = None): |
| 522 '''Returns the coordinates of the projected points through homography | 523 '''Returns the coordinates of the projected points through homography |
| 523 (format: array 2xN points)''' | 524 (format: array 2xN points)''' |
| 524 if points.shape[0] != 2: | 525 if points.shape[0] != 2: |
| 525 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) | 526 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) |
| 526 | 527 |
| 530 projected = prod/prod[2] | 531 projected = prod/prod[2] |
| 531 else: | 532 else: |
| 532 projected = augmentedPoints | 533 projected = augmentedPoints |
| 533 | 534 |
| 534 if intrinsicCameraMatrix is not None and distortionCoefficients is not None: | 535 if intrinsicCameraMatrix is not None and distortionCoefficients is not None: |
| 535 #projected[2,:] = 0 | 536 if newCameraMatrix is not None: |
| 536 projected, jacobian = cv2.projectPoints(projected.T, (0,0,0), (0,0,0), intrinsicCameraMatrix, distortionCoefficients) # in: 3xN, out: 2x1xN | 537 invNewCameraMatrix = inv(newCameraMatrix) |
| 538 reducedPoints = dot(invNewCameraMatrix, projected) | |
| 539 else: | |
| 540 reducedPoints = projected | |
| 541 projected, jacobian = cv2.projectPoints(reducedPoints.T, (0.,0.,0.), (0.,0.,0.), intrinsicCameraMatrix, distortionCoefficients) # in: 3xN, out: 2x1xN | |
| 537 projected = projected.reshape(-1,2).T | 542 projected = projected.reshape(-1,2).T |
| 538 return projected[:2,:] | 543 return projected[:2,:] |
| 539 | 544 |
| 540 def project(homography, p, intrinsicCameraMatrix = None, distortionCoefficients = None): | 545 def project(homography, p, intrinsicCameraMatrix = None, distortionCoefficients = None): |
| 541 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1] | 546 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1] |
| 542 through homography''' | 547 through homography''' |
| 543 return projectArray(homography, array([[p[0]],[p[1]]]), intrinsicCameraMatrix, distortionCoefficients) | 548 return projectArray(homography, array([[p[0]],[p[1]]]), intrinsicCameraMatrix, distortionCoefficients) |
| 549 return projectArray(homography, array(trajectory), intrinsicCameraMatrix, distortionCoefficients) | 554 return projectArray(homography, array(trajectory), intrinsicCameraMatrix, distortionCoefficients) |
| 550 | 555 |
| 551 def invertHomography(homography): | 556 def invertHomography(homography): |
| 552 '''Returns an inverted homography | 557 '''Returns an inverted homography |
| 553 Unnecessary for reprojection over camera image''' | 558 Unnecessary for reprojection over camera image''' |
| 554 from numpy.linalg import inv | |
| 555 invH = inv(homography) | 559 invH = inv(homography) |
| 556 invH /= invH[2,2] | 560 invH /= invH[2,2] |
| 557 return invH | 561 return invH |
| 558 | 562 |
| 559 def undistortTrajectory(invMap1, invMap2, positions): | 563 def undistortTrajectory(invMap1, invMap2, positions): |
