首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在opencv python中获取视频的前一帧

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

Stack Overflow用户
提问于 2017-12-30 00:44:40
回答 3查看 6.6K关注 0票数 8

我想根据视频中不断增加的size.To来检测障碍物。首先,我对灰度图像应用SIFT,以获得当前帧的特征点。接下来,为了比较当前帧和前一帧的特征点,我想应用Brute-Force算法。为此,我想在前一帧中获得特征点。如何在opencv python中访问上一帧?当当前帧是视频的第一帧时,如何避免访问前一帧?

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

代码语言:javascript
复制
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()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-30 01:29:55

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

代码语言:javascript
复制
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()
票数 5
EN

Stack Overflow用户

发布于 2018-06-08 05:38:55

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

代码语言:javascript
复制
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()
票数 6
EN

Stack Overflow用户

发布于 2017-12-30 00:53:57

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

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48025689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档