Mercurial > hg > nsaunier > traffic-intelligence
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 415:27f14b99f5a8 | 416:8fdbc13dad8b |
|---|---|
| 171 return fps | 171 return fps |
| 172 else: | 172 else: |
| 173 print 'Cannot load file ' + videoFilename | 173 print 'Cannot load file ' + videoFilename |
| 174 return None | 174 return None |
| 175 | 175 |
| 176 def imageBox(img, obj, frameNum, homography, width, height, px=.2, py=.2, PixelThreshold=800): | 176 def imageBox(img, obj, frameNum, homography, width, height, px = 0.2, py = 0.2, pixelThreshold = 800): |
| 177 'Computes the bounding box of object at frameNum' | |
| 177 x = [] | 178 x = [] |
| 178 y = [] | 179 y = [] |
| 179 for f in obj.features: | 180 for f in obj.features: |
| 180 if f.existsAtInstant(frameNum): | 181 if f.existsAtInstant(frameNum): |
| 181 x.append(f.getPositionAtInstant(frameNum).project(homography).x) | 182 projectedPosition = f.getPositionAtInstant(frameNum).project(homography) |
| 182 y.append(f.getPositionAtInstant(frameNum).project(homography).y) | 183 x.append(projectedPosition.x) |
| 183 Xmin = min(x) | 184 y.append(projectedPosition.y) |
| 184 Xmax = max(x) | 185 xmin = min(x) |
| 185 Ymin = min(y) | 186 xmax = max(x) |
| 186 Ymax = max(y) | 187 ymin = min(y) |
| 187 XMm = px * (Xmax - Xmin) | 188 ymax = max(y) |
| 188 YMm = py * (Ymax - Ymin) | 189 xMm = px * (xmax - xmin) |
| 189 a = max(Ymax - Ymin + (2 * YMm), Xmax - (Xmin + 2 * XMm)) | 190 yMm = py * (ymax - ymin) |
| 190 Y_Crop_min = int(max(0, .5 * (Ymin + Ymax - a))) | 191 a = max(ymax - ymin + (2 * yMm), xmax - (xmin + 2 * xMm)) |
| 191 Y_Crop_Max = int(min(height - 1, .5 * (Ymin + Ymax + a))) | 192 yCropMin = int(max(0, .5 * (ymin + ymax - a))) |
| 192 X_Crop_min = int(max(0, .5 * (Xmin + Xmax - a))) | 193 yCropMax = int(min(height - 1, .5 * (ymin + ymax + a))) |
| 193 X_Crop_Max = int(min(width - 1, .5 * (Xmin + Xmax + a))) | 194 xCropMin = int(max(0, .5 * (xmin + xmax - a))) |
| 194 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: | 195 xCropMax = int(min(width - 1, .5 * (xmin + xmax + a))) |
| 195 img_crop = img[Y_Crop_min : Y_Crop_Max, X_Crop_min : X_Crop_Max] | 196 if yCropMax != yCropMin and xCropMax != xCropMin and (yCropMax - yCropMin) * (xCropMax - xCropMin) > pixelThreshold: |
| 196 else: | 197 imgcrop = img[yCropMin : yCropMax, xCropMin : xCropMax] |
| 197 img_crop = [] | 198 else: |
| 198 return img_crop, Y_Crop_min, Y_Crop_Max, X_Crop_min, X_Crop_Max | 199 imgcrop = [] |
| 199 | 200 return imgcrop, yCropMin, yCropMax, xCropMin, xCropMax |
| 200 | 201 |
| 201 def displayTrajectories(videoFilename, objects, boundingBoxes, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1.): | 202 |
| 203 def displayTrajectories(videoFilename, objects, boundingBoxes = {}, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1.): | |
| 202 '''Displays the objects overlaid frame by frame over the video ''' | 204 '''Displays the objects overlaid frame by frame over the video ''' |
| 203 from moving import userTypeNames | 205 from moving import userTypeNames |
| 204 | 206 |
| 205 capture = cv2.VideoCapture(videoFilename) | 207 capture = cv2.VideoCapture(videoFilename) |
| 206 width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)) | 208 width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)) |
| 229 obj.projectedPositions = obj.positions | 231 obj.projectedPositions = obj.positions |
| 230 draw(img, obj.projectedPositions, cvRed, frameNum-obj.getFirstInstant()) | 232 draw(img, obj.projectedPositions, cvRed, frameNum-obj.getFirstInstant()) |
| 231 if frameNum in boundingBoxes.keys(): | 233 if frameNum in boundingBoxes.keys(): |
| 232 for rect in boundingBoxes[frameNum]: | 234 for rect in boundingBoxes[frameNum]: |
| 233 cv2.rectangle(img, rect[0].asint().astuple(), rect[1].asint().astuple(), cvRed) | 235 cv2.rectangle(img, rect[0].asint().astuple(), rect[1].asint().astuple(), cvRed) |
| 236 elif obj.features != None: | |
| 237 imgcrop, yCropMin, yCropMax, xCropMin, xCropMax = imageBox(img, obj, frameNum, homography, width, height) | |
| 238 cv2.rectangle(img, (xCropMin, yCropMin), (xCropMax, yCropMax), cvBlue, 1) | |
| 234 objDescription = '{} '.format(obj.num) | 239 objDescription = '{} '.format(obj.num) |
| 235 if userTypeNames[obj.userType] != 'unknown': | 240 if userTypeNames[obj.userType] != 'unknown': |
| 236 objDescription += userTypeNames[obj.userType][0].upper() | 241 objDescription += userTypeNames[obj.userType][0].upper() |
| 237 cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, cvRed) | 242 cv2.putText(img, objDescription, obj.projectedPositions[frameNum-obj.getFirstInstant()].asint().astuple(), cv2.FONT_HERSHEY_PLAIN, 1, cvRed) |
| 238 if obj.features != None: | |
| 239 img_crop, Y_Crop_min, Y_Crop_Max, X_Crop_min, X_Crop_Max = imageBox(img, obj, frameNum, homography, width, height) | |
| 240 cv2.rectangle(img, (X_Crop_min, Y_Crop_min), (X_Crop_Max, Y_Crop_Max), cvBlue, 1) | |
| 241 cvImshow('frame', img, rescale) | 243 cvImshow('frame', img, rescale) |
| 242 key = cv2.waitKey() | 244 key = cv2.waitKey() |
| 243 if saveKey(key): | 245 if saveKey(key): |
| 244 cv2.imwrite('image.png', img) | 246 cv2.imwrite('image.png', img) |
| 245 frameNum += 1 | 247 frameNum += 1 |
