Пример #1
0
    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)
Пример #2
0
        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")
Пример #3
0
    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)