Как получить предыдущий кадр видео в 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()

3 ответа

Решение

В OpenCV нет специальной функции для доступа к предыдущему кадру. Ваша проблема может быть решена по телефону cap.read() перед входом в цикл while. Используйте переменную 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()

Вы также можете получить / установить индекс кадра, начинающийся с нуля (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()

Просто сохраните текущий кадр, чтобы быть предыдущим кадром в следующей итерации. Используйте список, если вам нужно больше, чем 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()
Другие вопросы по тегам