我有一个摄像头录制应用程序,该应用程序可以捕获摄像头图像,并将摄像头图像输出记录并保存为.avi文件,我可以播放该文件并完成录制后的操作。我想创建一个实时的opencv代码,该代码可以获取正在实时创建的这些.avi文件,将其打开,操作并进行一些实时分类。无论如何,opencv是否在编写这些.avi时打开它们?最好是python但也可以C++实现?这将在Windows10上完成。
编辑:
目前,当我尝试执行通用视频捕获时,将CV2输出为.avi
cap = cv2.VideoCapture('out.avi')
ret, frame = cap.read()
while(True):
ret, frame = cap.read()
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
它给了我错误
Traceback (most recent call last):
File "video_grab.py", line 15, in <module>
cv2.imshow('frame', frame)
cv2.error: OpenCV(4.1.2) C:\projects\opencv-
python\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion
failed) size.width>0 && size.height>0 in function 'cv::imshow'
断言最有可能失败的原因,因为在停止和保存捕获时视频的尺寸为0 x 0。
最佳答案
根据AVI文件的编解码器,以下解决方案可能有效或无效:
ret
的值为True
。 waitKey
中的时间增加到大于1毫秒。 import cv2
cap = cv2.VideoCapture('out.avi')
frame_period = 100 # 100msec - assume frame rate is about 10Hz
while(True):
ret, frame = cap.read()
if ret:
cv2.imshow('frame', frame)
if cv2.waitKey(frame_period) & 0xFF == ord('q'):
break
我使用“Motion JPEG”编解码器对其进行了测试,并且在读取速率比实际帧速率快时,我收到一条警告消息:
[mjpeg @ 000002a22394b0e0] overread 8
。您还可以尝试使用
ret = False
来开始快速阅读并降低阅读速度:frame_period = 1 # Start reading fast (wait only 1msec)
while(True):
ret, frame = cap.read()
if ret:
cv2.imshow('frame', frame)
else:
frame_period = 100 # Reduce the rate to 10Hz when reaching end of file.
if cv2.waitKey(frame_period) & 0xFF == ord('q'):
break
我认为,如果您有迹象表明已捕获新帧,它将更好地工作。
我仅通过使用OpenCV“查询” AVI文件就找不到解决方案。
关于windows - 在opencv中,有没有一种方法可以打开正在实时记录和创建的.avi?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59755542/