diff python/cvutils.py @ 416:8fdbc13dad8b

cleaned imagebox code
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 25 Sep 2013 16:13:27 -0400
parents 31604ef1cad4
children 2be846d36dec
line wrap: on
line diff
--- a/python/cvutils.py	Wed Sep 25 14:49:30 2013 -0400
+++ b/python/cvutils.py	Wed Sep 25 16:13:27 2013 -0400
@@ -173,32 +173,34 @@
             print 'Cannot load file ' + videoFilename
             return None
 
-    def imageBox(img, obj, frameNum, homography, width, height, px=.2, py=.2, PixelThreshold=800):
+    def imageBox(img, obj, frameNum, homography, width, height, px = 0.2, py = 0.2, pixelThreshold = 800):
+        'Computes the bounding box of object at frameNum'
         x = []
         y = []
         for f in obj.features:
             if f.existsAtInstant(frameNum):
-                x.append(f.getPositionAtInstant(frameNum).project(homography).x)
-                y.append(f.getPositionAtInstant(frameNum).project(homography).y)
-        Xmin = min(x)
-        Xmax = max(x)
-        Ymin = min(y)
-        Ymax = max(y)
-        XMm = px * (Xmax - Xmin)
-        YMm = py * (Ymax - Ymin)
-        a = max(Ymax - Ymin + (2 * YMm), Xmax - (Xmin + 2 * XMm))
-        Y_Crop_min = int(max(0, .5 * (Ymin + Ymax - a)))
-        Y_Crop_Max = int(min(height - 1, .5 * (Ymin + Ymax + a)))
-        X_Crop_min = int(max(0, .5 * (Xmin + Xmax - a)))
-        X_Crop_Max = int(min(width - 1, .5 * (Xmin + Xmax + a)))
-        if Y_Crop_Max != Y_Crop_min and X_Crop_Max != X_Crop_min and (Y_Crop_Max - Y_Crop_min) * (X_Crop_Max - X_Crop_min) > PixelThreshold:
-            img_crop = img[Y_Crop_min : Y_Crop_Max, X_Crop_min : X_Crop_Max]
+                projectedPosition = f.getPositionAtInstant(frameNum).project(homography)
+                x.append(projectedPosition.x)
+                y.append(projectedPosition.y)
+        xmin = min(x)
+        xmax = max(x)
+        ymin = min(y)
+        ymax = max(y)
+        xMm = px * (xmax - xmin)
+        yMm = py * (ymax - ymin)
+        a = max(ymax - ymin + (2 * yMm), xmax - (xmin + 2 * xMm))
+        yCropMin = int(max(0, .5 * (ymin + ymax - a)))
+        yCropMax = int(min(height - 1, .5 * (ymin + ymax + a)))
+        xCropMin = int(max(0, .5 * (xmin + xmax - a)))
+        xCropMax = int(min(width - 1, .5 * (xmin + xmax + a)))
+        if yCropMax != yCropMin and xCropMax != xCropMin and (yCropMax - yCropMin) * (xCropMax - xCropMin) > pixelThreshold:
+            imgcrop = img[yCropMin : yCropMax, xCropMin : xCropMax]
         else:
-            img_crop = []
-        return img_crop, Y_Crop_min, Y_Crop_Max, X_Crop_min, X_Crop_Max
+            imgcrop = []
+        return imgcrop, yCropMin, yCropMax, xCropMin, xCropMax
 
 
-    def displayTrajectories(videoFilename, objects, boundingBoxes, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1.):
+    def displayTrajectories(videoFilename, objects, boundingBoxes = {}, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1.):
         '''Displays the objects overlaid frame by frame over the video '''
         from moving import userTypeNames
 
@@ -231,13 +233,13 @@
                             if frameNum in boundingBoxes.keys():
                                 for rect in boundingBoxes[frameNum]:
                                     cv2.rectangle(img, rect[0].asint().astuple(), rect[1].asint().astuple(), cvRed)
+                            elif obj.features != None:
+                                imgcrop, yCropMin, yCropMax, xCropMin, xCropMax = imageBox(img, obj, frameNum, homography, width, height)
+                                cv2.rectangle(img, (xCropMin, yCropMin), (xCropMax, yCropMax), cvBlue, 1)
                             objDescription = '{} '.format(obj.num)
                             if userTypeNames[obj.userType] != 'unknown':
                                 objDescription += userTypeNames[obj.userType][0].upper()
                             cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, cvRed)
-                            if obj.features != None:
-                                img_crop, Y_Crop_min, Y_Crop_Max, X_Crop_min, X_Crop_Max = imageBox(img, obj, frameNum, homography, width, height)
-                                cv2.rectangle(img, (X_Crop_min, Y_Crop_min), (X_Crop_Max, Y_Crop_Max), cvBlue, 1)
                     cvImshow('frame', img, rescale)
                     key = cv2.waitKey()
                     if saveKey(key):