如何在 opencv 中获取视频的前一帧 python
How to get previous frame of a video in opencv python
我想根据视频中不断增加的障碍物检测障碍物 size.To 首先我在灰度图像上应用 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()
只需将当前帧保存为下一次迭代的前一帧。如果需要超过 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()
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()
您还可以 get/set 从零开始的帧索引 (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()
我想根据视频中不断增加的障碍物检测障碍物 size.To 首先我在灰度图像上应用 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()
只需将当前帧保存为下一次迭代的前一帧。如果需要超过 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()
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()
您还可以 get/set 从零开始的帧索引 (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()