繁体   English   中英

如何在opencv python中获取视频的前一帧

[英]How to get previous frame of a video in opencv python

我想根据视频中不断增加的大小来检测障碍物。为此,我首先在灰度图像上应用 SIFT 以获得当前帧的特征点。 接下来将当前帧的特征点与前一帧的特征点进行比较,我想应用蛮力算法。 为此,我想在前一帧中获取特征点。 如何在 opencv python 中访问前一帧? 以及当当前帧是视频的第一帧时如何避免访问前一帧?

下面是用python编写的用于获取当前帧特征点的代码。

import cv2
import numpy as np


cap = cv2.VideoCapture('video3.mov')

  while(cap.isOpened()):

  ret, frame = cap.read()

  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

  #detect key feature points
  sift = cv2.xfeatures2d.SIFT_create()
  kp, des = sift.detectAndCompute(gray, None)

 #draw key points detected
 img=cv2.drawKeypoints(gray,kp,gray,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

 cv2.imshow("grayframe",img)

 if cv2.waitKey(100) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

您还可以获取/设置从零开始的帧索引 (CAP_PROP_POS_FRAMES),如果您希望灵活地退回超过一帧、与特定帧进行比较等,这可能很有用。请注意,尽管这会重置位置下一个 read(),所以如果你真的只想要前一帧,将它存储在每个其他答案的变量中可能更好。

next_frame = cap.get(cv2.CAP_PROP_POS_FRAMES)
current_frame = next_frame - 1
previous_frame = current_frame - 1

if previous_frame >= 0:
  cap.set(cv2.CAP_PROP_POS_FRAMES, previous_frame)
  ret, frame = cap.read()

OpenCV 中没有特定的函数来访问前一帧。 您的问题可以通过在进入 while 循环之前调用cap.read()来解决。 在读取新帧之前,使用变量prev_frame存储前一帧。 最后,作为一种好的做法,您应该在对其进行计算之前验证是否正确读取了该帧。 您的代码可能类似于:

import cv2
import numpy as np

cap = cv2.VideoCapture('video3.mov')
ret, frame = cap.read()

while(cap.isOpened()):
    prev_frame=frame[:]
    ret, frame = cap.read()
    if ret:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        #detect key feature points
        sift = cv2.xfeatures2d.SIFT_create()
        kp, des = sift.detectAndCompute(gray, None)

        #some magic with prev_frame

        #draw key points detected
        img=cv2.drawKeypoints(gray,kp,gray, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

        cv2.imshow("grayframe",img)
    else:
        print('Could not read frame')

    if cv2.waitKey(100) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

只需将当前帧保存为下一次迭代中的前一帧。 如果需要 1 个以上,请使用列表。

import cv2
import numpy as np


cap = cv2.VideoCapture('video3.mov')
previousFrame=None

while(cap.isOpened()):

  ret, frame = cap.read()

  if previousFrame is not None:
      #use previous frame here
      pass

  #save current frame
  previousFrame=frame


  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

  #detect key feature points
  sift = cv2.xfeatures2d.SIFT_create()
  kp, des = sift.detectAndCompute(gray, None)

  #draw key points detected
  img=cv2.drawKeypoints(gray,kp,gray,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

  cv2.imshow("grayframe",img)


  if cv2.waitKey(100) & 0xFF == ord('q'):
       break

cap.release()
cv2.destroyAllWindows()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM