Mercurial > hg > nsaunier > traffic-intelligence
comparison python/cvutils.py @ 932:66f382852e61
added new projection functions
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Fri, 14 Jul 2017 00:12:03 -0400 |
| parents | 8148991b1dab |
| children | 8ac7f61c6e4f |
comparison
equal
deleted
inserted
replaced
| 931:8148991b1dab | 932:66f382852e61 |
|---|---|
| 517 for i in xrange(cvmat.rows): | 517 for i in xrange(cvmat.rows): |
| 518 for j in xrange(cvmat.cols): | 518 for j in xrange(cvmat.cols): |
| 519 out.write('{0} '.format(cvmat[i,j])) | 519 out.write('{0} '.format(cvmat[i,j])) |
| 520 out.write('\n') | 520 out.write('\n') |
| 521 | 521 |
| 522 def homographyProject(points, homography, output3D = False): | |
| 523 '''Returns the coordinates of the points (2xN array) projected through homography''' | |
| 524 if points.shape[0] != 2: | |
| 525 raise Exception('points of dimension {}'.format(points.shape)) | |
| 526 | |
| 527 if homography is not None and homography.size>0: | |
| 528 if output3D: | |
| 529 outputDim = 3 | |
| 530 else: | |
| 531 outputDim = 2 | |
| 532 augmentedPoints = append(points,[[1]*points.shape[1]], 0) # 3xN | |
| 533 prod = dot(homography, augmentedPoints) | |
| 534 return prod[:outputDim,:]/prod[2] | |
| 535 elif output3D: | |
| 536 return append(points,[[1]*points.shape[1]], 0) # 3xN | |
| 537 else: | |
| 538 return points | |
| 539 | |
| 540 def imageToWorldProject(points, intrinsicCameraMatrix = None, distortionCoefficients = None, homography = None): | |
| 541 '''Projects points (2xN array) from image (video) space to world space | |
| 542 1. through undistorting if provided by intrinsic camera matrix and distortion coefficients | |
| 543 2. through homograph projection (from ideal point (no camera) to world)''' | |
| 544 if points.shape[0] != 2: | |
| 545 raise Exception('points of dimension {}'.format(points.shape)) | |
| 546 | |
| 547 if intrinsicCameraMatrix is not None and distortionCoefficients is not None: | |
| 548 undistortedPoints = cv2.undistortPoints(points.T.reshape(1,points.shape[1], 2), intrinsicCameraMatrix, distortionCoefficients).reshape(-1,2) | |
| 549 return homographyProject(undistortedPoints.T, homography) | |
| 550 else: | |
| 551 return homographyProject(points, homography) | |
| 552 | |
| 553 def worldToImageProject(points, intrinsicCameraMatrix = None, distortionCoefficients = None, homography = None): | |
| 554 '''Projects points (2xN array) from image (video) space to world space | |
| 555 1. through undistorting if provided by intrinsic camera matrix and distortion coefficients | |
| 556 2. through homograph projection (from ideal point (no camera) to world)''' | |
| 557 if points.shape[0] != 2: | |
| 558 raise Exception('points of dimension {}'.format(points.shape)) | |
| 559 | |
| 560 if intrinsicCameraMatrix is not None and distortionCoefficients is not None: | |
| 561 projected3D = homographyProject(points, homography, True) | |
| 562 projected, jacobian = cv2.projectPoints(projected3D.T, (0.,0.,0.), (0.,0.,0.), intrinsicCameraMatrix, distortionCoefficients) # in: 3xN, out: 2x1xN | |
| 563 return projected.reshape(-1,2).T | |
| 564 else: | |
| 565 return homographyProject(points, homography) | |
| 566 | |
| 567 def newCameraProject(points, newCameraMatrix): | |
| 568 '''Projects points (2xN array) as if seen by camera | |
| 569 (or reverse by inverting the camera matrix)''' | |
| 570 if points.shape[0] != 2: | |
| 571 raise Exception('points of dimension {}'.format(points.shape)) | |
| 572 | |
| 573 if newCameraMatrix is not None: | |
| 574 augmentedPoints = append(points,[[1]*points.shape[1]], 0) # 3xN | |
| 575 projected = dot(newCameraMatrix, augmentedPoints) | |
| 576 return projected[:2,:] | |
| 577 else: | |
| 578 return points | |
| 579 | |
| 522 def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None, newCameraMatrix = None): | 580 def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None, newCameraMatrix = None): |
| 523 '''Returns the coordinates of the projected points through homography | 581 '''Returns the coordinates of the projected points through homography |
| 524 (format: array 2xN points)''' | 582 (format: array 2xN points)''' |
| 525 if points.shape[0] != 2: | 583 if points.shape[0] != 2: |
| 526 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) | 584 raise Exception('points of dimension {}'.format(points.shape)) |
| 527 | 585 |
| 528 augmentedPoints = append(points,[[1]*points.shape[1]], 0) # 3xN | 586 augmentedPoints = append(points,[[1]*points.shape[1]], 0) # 3xN |
| 529 if homography is not None and homography.size>0: | 587 if homography is not None and homography.size>0: |
| 530 prod = dot(homography, augmentedPoints) | 588 prod = dot(homography, augmentedPoints) |
| 531 projected = prod/prod[2] | 589 projected = prod/prod[2] |
