Mercurial > hg > nsaunier > traffic-intelligence
comparison python/cvutils.py @ 928:063d1267585d
work in progress
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Wed, 12 Jul 2017 01:24:31 -0400 |
| parents | dbd81710d515 |
| children | be28a3538dc9 |
comparison
equal
deleted
inserted
replaced
| 927:c030f735c594 | 928:063d1267585d |
|---|---|
| 255 return fps | 255 return fps |
| 256 else: | 256 else: |
| 257 print('Video capture for {} failed'.format(videoFilename)) | 257 print('Video capture for {} failed'.format(videoFilename)) |
| 258 return None | 258 return None |
| 259 | 259 |
| 260 def imageBoxSize(obj, frameNum, homography, width, height, px = 0.2, py = 0.2): | 260 def imageBoxSize(obj, frameNum, width, height, px = 0.2, py = 0.2): |
| 261 'Computes the bounding box size of object at frameNum' | 261 'Computes the bounding box size of object at frameNum' |
| 262 x = [] | 262 x = [] |
| 263 y = [] | 263 y = [] |
| 264 if obj.hasFeatures(): | 264 if obj.hasFeatures(): |
| 265 for f in obj.getFeatures(): | 265 for f in obj.getFeatures(): |
| 266 if f.existsAtInstant(frameNum): | 266 if f.existsAtInstant(frameNum): |
| 267 projectedPosition = f.getPositionAtInstant(frameNum).project(homography) | 267 projectedPosition = f.projectPositions[:, frameNum-f.getFirstInstant()] |
| 268 x.append(projectedPosition.x) | 268 x.append(projectedPosition[0]) |
| 269 y.append(projectedPosition.y) | 269 y.append(projectedPosition[1]) |
| 270 xmin = min(x) | 270 xmin = min(x) |
| 271 xmax = max(x) | 271 xmax = max(x) |
| 272 ymin = min(y) | 272 ymin = min(y) |
| 273 ymax = max(y) | 273 ymax = max(y) |
| 274 xMm = px * (xmax - xmin) | 274 xMm = px * (xmax - xmin) |
| 278 yCropMax = int(min(height - 1, .5 * (ymin + ymax + a))) | 278 yCropMax = int(min(height - 1, .5 * (ymin + ymax + a))) |
| 279 xCropMin = int(max(0, .5 * (xmin + xmax - a))) | 279 xCropMin = int(max(0, .5 * (xmin + xmax - a))) |
| 280 xCropMax = int(min(width - 1, .5 * (xmin + xmax + a))) | 280 xCropMax = int(min(width - 1, .5 * (xmin + xmax + a))) |
| 281 return yCropMin, yCropMax, xCropMin, xCropMax | 281 return yCropMin, yCropMax, xCropMin, xCropMax |
| 282 | 282 |
| 283 def imageBox(img, obj, frameNum, homography, width, height, px = 0.2, py = 0.2, minNPixels = 800): | 283 def imageBox(img, obj, frameNum, width, height, px = 0.2, py = 0.2, minNPixels = 800): |
| 284 'Computes the bounding box of object at frameNum' | 284 'Computes the bounding box of object at frameNum' |
| 285 yCropMin, yCropMax, xCropMin, xCropMax = imageBoxSize(obj, frameNum, homography, width, height, px, py) | 285 yCropMin, yCropMax, xCropMin, xCropMax = imageBoxSize(obj, frameNum, width, height, px, py) |
| 286 if yCropMax != yCropMin and xCropMax != xCropMin and (yCropMax - yCropMin) * (xCropMax - xCropMin) > minNPixels: | 286 if yCropMax != yCropMin and xCropMax != xCropMin and (yCropMax - yCropMin) * (xCropMax - xCropMin) > minNPixels: |
| 287 return img[yCropMin : yCropMax, xCropMin : xCropMax] | 287 return img[yCropMin : yCropMax, xCropMin : xCropMax] |
| 288 else: | 288 else: |
| 289 return None | 289 return None |
| 290 | 290 |
| 516 for i in xrange(cvmat.rows): | 516 for i in xrange(cvmat.rows): |
| 517 for j in xrange(cvmat.cols): | 517 for j in xrange(cvmat.cols): |
| 518 out.write('{0} '.format(cvmat[i,j])) | 518 out.write('{0} '.format(cvmat[i,j])) |
| 519 out.write('\n') | 519 out.write('\n') |
| 520 | 520 |
| 521 def projectArray(homography, points): | 521 def projectArray(homography, points, intrinsicCameraMatrix = None, distortionCoefficients = None): |
| 522 '''Returns the coordinates of the projected points through homography | 522 '''Returns the coordinates of the projected points through homography |
| 523 (format: array 2xN points)''' | 523 (format: array 2xN points)''' |
| 524 if points.shape[0] != 2: | 524 if points.shape[0] not in [2, 3]: |
| 525 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) | 525 raise Exception('points of dimension {0} {1}'.format(points.shape[0], points.shape[1])) |
| 526 | 526 |
| 527 if (homography is not None) and homography.size>0: | 527 augmentedPoints = append(points,[[1]*points.shape[1]], 0) |
| 528 #alternatively, on could use cv2.convertpointstohomogeneous and other conversion to/from homogeneous coordinates | 528 if homography is not None and homography.size>0: |
| 529 augmentedPoints = append(points,[[1]*points.shape[1]], 0) | |
| 530 prod = dot(homography, augmentedPoints) | 529 prod = dot(homography, augmentedPoints) |
| 531 return prod[0:2]/prod[2] | 530 projected = prod/prod[2] |
| 531 projected[3,:] = 0 | |
| 532 else: | 532 else: |
| 533 return points | 533 projected = augmentedPoints |
| 534 | |
| 535 if intrinsicCameraMatrix is not None and distortionCoefficients is not None: | |
| 536 projected = cv2.projectPoints(projected, None, None, intrinsicCameraMatrix, distortionCoefficients) | |
| 537 return projected | |
| 534 | 538 |
| 535 def project(homography, p): | 539 def project(homography, p): |
| 536 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1] | 540 '''Returns the coordinates of the projection of the point p with coordinates p[0], p[1] |
| 537 through homography''' | 541 through homography''' |
| 538 return projectArray(homography, array([[p[0]],[p[1]]])) | 542 return projectArray(homography, array([[p[0]],[p[1]]])) |
