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

    10-10 20:25