我在python上使用opencv,并且遇到cv2.VideoCapture.read()
函数卡住的问题。这是一些原型代码:
requirements.txt
opencv-contrib-python==4.1.1.26
application.py
import cv2
def run_analysis(path_to_video):
vs = cv2.VideoCapture(path_to_video)
while True:
frame = vs.read()
if frame is None:
break
do_stuff_with_frame(frame)
vs.release()
此代码一直在我的Mac上运行。仅当我将其作为Flask应用程序部署到Elastic Beanstalk(在Red Hat Linux上运行)时,它才第一次起作用。 我已经在github问题中看到了一些东西,这些东西可能暗示vs.release()无法释放文件指针,或者存在内存泄漏,但是我不太了解这些概念。
即使我无法获得答案,我也对采用强力方式使其工作感到满意。
答案 0 :(得分:2)
您可以添加防护以确保cv2.VideoCapture()
处理程序对象对isOpened()
有效。另外,您可以检查status
的{{1}}返回值,以确保该帧有效。另外,请确保提供给处理程序的路径有效。
read()
答案 1 :(得分:1)
根据openCV
web site
如果没有抓取任何帧(相机已断开连接,或者视频文件中没有其他帧),则方法返回false,函数返回NULL指针。
在测试“无”后,您可以测试以查看“ frame”是否为假。 如有疑问,请使用“ print(frame)”
编辑:
我刚刚意识到您跳过了打开文件的最重要步骤。
需要检查它是否使用isOpened()打开
vs = cv2.VideoCapture(path_to_video)
if not vs.isOpened():
print("Error: Could not open file: %s" % (path_to_video))
return
........
编辑:
试试这个代码。通过扩展vs.read()
,可以更清楚地知道返回的内容。
import cv2
def do_stuff_with_frame(image):
pass
def run_analysis(path_to_video):
vs = cv2.VideoCapture(path_to_video)
if not vs.isOpened():
print("Error: Could not open file: %s" % (path_to_video))
return
while True:
retval, image = vs.read()
if not retval:
print("Video file finished. Total Frames: %d" % (vs.get(cv2.CAP_PROP_FRAME_COUNT)))
break
do_stuff_with_frame(image)
vs.release()
# START OF PROGRAM
if __name__ == "__main__":
run_analysis("test.mov")