在opencv中,有一种方法可以打开正在实时记录和创建的.avi?

问题描述 投票:1回答:1

我有一个摄像头录制应用程序,它可以捕获摄像头图像,并将摄像头图像输出记录并保存为.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。

windows opencv image-processing video avi
1个回答
1
投票

以下解决方案可能行不通,具体取决于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文件就找不到解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.