def lucas_kanade(self): vid = cv.CaptureFromFile(self.path) first_frame = cv_compat.get_gray_frame(vid) velx = cv.CreateImage(cv.GetSize(first_frame), cv.IPL_DEPTH_32F, 1) vely = cv.CreateImage(cv.GetSize(first_frame), cv.IPL_DEPTH_32F, 1) for prev_frame, curr_frame, curr_frame_color in self._iter_frames(vid): cv.CalcOpticalFlowLK(prev_frame, curr_frame, (15, 15), velx, vely) flow = np.dstack( (np.asarray(cv.GetMat(velx)), np.asarray(cv.GetMat(vely)))) yield Flow(flow, curr_frame, prev_frame, curr_frame_color)
cv.Line(desImageHS, (i, j), (i + dx, j + dy), (0, 0, 255), 1, cv.CV_AA, 0) f.writelines( [str(i), ' ', str(j), ' ', str(i + dx), ' ', str(j + dy), '\n']) # count+=1 # print count f.close() cv.SetZero(velx) cv.SetZero(vely) #包含了实现CalcOpticalFlowLK的方法 cv.CalcOpticalFlowLK(inputImageFirst, inputImageSecond, (15, 15), velx, vely) for i in range(0, cols, FLOWSKIP): for j in range(0, rows, FLOWSKIP): dx = int(cv.GetReal2D(velx, j, i)) dy = int(cv.GetReal2D(vely, j, i)) cv.Line(desImageLK, (i, j), (i + dx, j + dy), (0, 0, 255), 1, cv.CV_AA, 0) cv.SaveImage("resultHS.png", desImageHS) cv.SaveImage("resultLK.png", desImageLK) cv.NamedWindow("Optical flow HS") cv.ShowImage("Optical flow HS", desImageHS) cv.NamedWindow("Optical flow LK")
def calcOpticalFlow(self, curImageGray, method="BlockMatching"): if curImageGray.channels != 1: raise Exception("Only able to process gray-scale images") if self.lastImageGray == None: lastImageGray = curImageGray else: lastImageGray = self.lastImageGray # Create storage for the optical flow storageWidth = self.calcOpticalFlowWidth(lastImageGray.width) storageHeight = self.calcOpticalFlowHeight(lastImageGray.height) if method == "BlockMatching": opticalFlowArrayX = np.ndarray(shape=(storageHeight, storageWidth), dtype=np.float32) opticalFlowArrayY = np.ndarray(shape=(storageHeight, storageWidth), dtype=np.float32) cv.CalcOpticalFlowBM( lastImageGray, curImageGray, (self.opticalFlowBlockWidth, self.opticalFlowBlockHeight), (self.opticalFlowBlockWidth, self.opticalFlowBlockHeight), (self.opticalFlowRangeWidth, self.opticalFlowRangeHeight), 0, cv.fromarray(opticalFlowArrayX), cv.fromarray(opticalFlowArrayY)) elif method == "LucasKanade": largeOpticalFlowArrayX = np.ndarray(shape=(lastImageGray.height, lastImageGray.width), dtype=np.float32) largeOpticalFlowArrayY = np.ndarray(shape=(lastImageGray.height, lastImageGray.width), dtype=np.float32) cv.CalcOpticalFlowLK( lastImageGray, curImageGray, ( 15, 15 ), #( self.opticalFlowBlockWidth, self.opticalFlowBlockHeight ), cv.fromarray(largeOpticalFlowArrayX), cv.fromarray(largeOpticalFlowArrayY)) indexGrid = np.mgrid[0:storageHeight, 0:storageWidth] indexGrid[0] = indexGrid[ 0] * self.opticalFlowBlockHeight + self.opticalFlowBlockHeight / 2 indexGrid[1] = indexGrid[ 1] * self.opticalFlowRangeWidth + self.opticalFlowRangeWidth / 2 opticalFlowArrayX = largeOpticalFlowArrayX[indexGrid[0], indexGrid[1]] opticalFlowArrayY = largeOpticalFlowArrayY[indexGrid[0], indexGrid[1]] elif method == "HornSchunck": largeOpticalFlowArrayX = np.ndarray(shape=(lastImageGray.height, lastImageGray.width), dtype=np.float32) largeOpticalFlowArrayY = np.ndarray(shape=(lastImageGray.height, lastImageGray.width), dtype=np.float32) cv.CalcOpticalFlowHS( lastImageGray, curImageGray, 0, cv.fromarray(largeOpticalFlowArrayX), cv.fromarray(largeOpticalFlowArrayY), 1.0, (cv.CV_TERMCRIT_ITER | cv.CV_TERMCRIT_EPS, 10, 0.01)) indexGrid = np.mgrid[0:storageHeight, 0:storageWidth] indexGrid[0] = indexGrid[ 0] * self.opticalFlowBlockHeight + self.opticalFlowBlockHeight / 2 indexGrid[1] = indexGrid[ 1] * self.opticalFlowRangeWidth + self.opticalFlowRangeWidth / 2 opticalFlowArrayX = largeOpticalFlowArrayX[indexGrid[0], indexGrid[1]] opticalFlowArrayY = largeOpticalFlowArrayY[indexGrid[0], indexGrid[1]] else: raise Exception("Unhandled method") # Save the current image self.lastImageGray = curImageGray return (opticalFlowArrayX, opticalFlowArrayY)