# HG changeset patch # User Nicolas Saunier # Date 1499896853 14400 # Node ID be28a3538dc90fb6d564fb1c7e86a0b0f2563fa9 # Parent 063d1267585d7f2cb2006f1787ae9f4ff460f4d7 work in progress on projection diff -r 063d1267585d -r be28a3538dc9 python/cvutils.py --- a/python/cvutils.py Wed Jul 12 01:24:31 2017 -0400 +++ b/python/cvutils.py Wed Jul 12 18:00:53 2017 -0400 @@ -264,9 +264,9 @@ if obj.hasFeatures(): for f in obj.getFeatures(): if f.existsAtInstant(frameNum): - projectedPosition = f.projectPositions[:, frameNum-f.getFirstInstant()] - x.append(projectedPosition[0]) - y.append(projectedPosition[1]) + p = f.getPositionAtInstant(frameNum) + x.append(p.x) + y.append(p.y) xmin = min(x) xmax = max(x) ymin = min(y) @@ -521,31 +521,32 @@ def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None): '''Returns the coordinates of the projected points through homography (format: array 2xN points)''' - if points.shape[0] not in [2, 3]: + if points.shape[0] != 2: raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) - augmentedPoints = append(points,[[1]*points.shape[1]], 0) + augmentedPoints = append(points,[[1]*points.shape[1]], 0) # 3xN if homography is not None and homography.size>0: prod = dot(homography, augmentedPoints) projected = prod/prod[2] - projected[3,:] = 0 else: projected = augmentedPoints if intrinsicCameraMatrix is not None and distortionCoefficients is not None: - projected = cv2.projectPoints(projected, None, None, intrinsicCameraMatrix, distortionCoefficients) - return projected + #projected[2,:] = 0 + projected, jacobian = cv2.projectPoints(projected.T, (0,0,0), (0,0,0), intrinsicCameraMatrix, distortionCoefficients) # in: 3xN, out: 2x1xN + projected = projected.reshape(-1,2).T + return projected[:2,:] -def project(homography, p): +def project(homography, p, intrinsicCameraMatrix = None, distortionCoefficients = None): '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1] through homography''' - return projectArray(homography, array([[p[0]],[p[1]]])) + return projectArray(homography, array([[p[0]],[p[1]]]), intrinsicCameraMatrix, distortionCoefficients) -def projectTrajectory(homography, trajectory): +def projectTrajectory(homography, trajectory, intrinsicCameraMatrix = None, distortionCoefficients = None): '''Projects a series of points in the format [[x1, x2, ...], [y1, y2, ...]]''' - return projectArray(homography, array(trajectory)) + return projectArray(homography, array(trajectory), intrinsicCameraMatrix, distortionCoefficients) def invertHomography(homography): '''Returns an inverted homography diff -r 063d1267585d -r be28a3538dc9 python/moving.py --- a/python/moving.py Wed Jul 12 01:24:31 2017 -0400 +++ b/python/moving.py Wed Jul 12 18:00:53 2017 -0400 @@ -1578,16 +1578,17 @@ # project feature positions if self.hasFeatures(): for f in self.getFeatures(): - f.projectedPositions = cvutils.projectArray(homography, f.getPositions().asArray(), intrinsicCameraMatrix, distortionCoefficients) + pp = cvutils.projectArray(homography, f.getPositions().asArray(), intrinsicCameraMatrix, array(distortionCoefficients)).tolist() + f.positions = Trajectory(pp) self.userTypes = {} - def classifyUserTypeHoGSVMAtInstant(self, img, instant, homography, width, height, px, py, minNPixels, rescaleSize, orientations, pixelsPerCell, cellsPerBlock, blockNorm): + def classifyUserTypeHoGSVMAtInstant(self, img, instant, width, height, px, py, minNPixels, rescaleSize, orientations, pixelsPerCell, cellsPerBlock, blockNorm): '''Extracts the image box around the object (of square size max(width, height) of the box around the features, with an added px or py for width and height (around the box)) computes HOG on this cropped image (with parameters rescaleSize, orientations, pixelsPerCell, cellsPerBlock) and applies the SVM model on it''' - croppedImg = cvutils.imageBox(img, self, instant, homography, width, height, px, py, minNPixels) + croppedImg = cvutils.imageBox(img, self, instant, width, height, px, py, minNPixels) if croppedImg is not None and len(croppedImg) > 0: hog = cvutils.HOG(croppedImg, rescaleSize, orientations, pixelsPerCell, cellsPerBlock, blockNorm, visualize=False, normalize=False) self.userTypes[instant] = int(self.appearanceClassifier.predict(hog)) diff -r 063d1267585d -r be28a3538dc9 python/tests/cvutils.txt --- a/python/tests/cvutils.txt Wed Jul 12 01:24:31 2017 -0400 +++ b/python/tests/cvutils.txt Wed Jul 12 18:00:53 2017 -0400 @@ -1,10 +1,19 @@ >>> import cv2, cvutils ->>> from numpy import array, round +>>> from numpy import array, round, ones >>> img = cv2.imread("../samples/val-dor-117-111.png") >>> width = img.shape[1] >>> height = img.shape[0] >>> intrinsicCameraMatrix = array([[ 377.42, 0. , 639.12], [ 0. , 378.43, 490.2 ], [ 0. , 0. , 1. ]]) ->>> [map1, map2] = cvutils.computeUndistortMaps(width, height, 1.31, intrinsicCameraMatrix, [-0.11759321, 0.0148536, 0.00030756, -0.00020578, -0.00091816]) +>>> distortionCoefficients = array([-0.11759321, 0.0148536, 0.00030756, -0.00020578, -0.00091816]) +>>> distortionCoefficients = array([-0.11759321, 0., 0., 0., 0.]) +>>> multiplicationFactor = 1.31 +>>> [map1, map2] = cvutils.computeUndistortMaps(width, height, multiplicationFactor, intrinsicCameraMatrix, distortionCoefficients) >>> undistorted = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR) ->>> (undistorted.shape == array([int(round(height*1.31)), int(round(width*1.31)), 3])).all() +>>> (undistorted.shape == array([int(round(height*multiplicationFactor)), int(round(width*multiplicationFactor)), 3])).all() True +>>> imgPoints = array([[[150.,170.],[220.,340.],[340.,440.],[401.,521.]]]) +>>> newCameraMatrix = cv2.getDefaultNewCameraMatrix(intrinsicCameraMatrix, (int(round(width*multiplicationFactor)), int(round(height*multiplicationFactor))), True) +>>> undistortedPoints = cv2.undistortPoints(imgPoints, intrinsicCameraMatrix, distortionCoefficients, P = newCameraMatrix).reshape(-1, 2) +>>> tmp = ones((imgPoints[0].shape[0], 3)) +>>> tmp[:,:2] = undistortedPoints +>>> origPoints = cv2.projectPoints(tmp, (0.,0.,0.), (0.,0.,0.), intrinsicCameraMatrix, distortionCoefficients)[0].reshape(-1,2)