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