Mercurial Hosting > 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 |