簡體   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