微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我尝试使用 openCV python 将网络摄像头视频录制到文件中,我无法使用任何视频播放器打开文件,这是我的代码

如何解决我尝试使用 openCV python 将网络摄像头视频录制到文件中,我无法使用任何视频播放器打开文件,这是我的代码

`import cv2
 import numpy as np

cam = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')`

即使我使用以下格式,视频文件也无法打开:'WMV1、'WMV2'、'MJPG'、'DIVX'、'XVID'和'H264'

`rec = cv2.VideoWriter("output.avi",fourcc,17,(640,480))
flag = False
font = cv2.FONT_HERShey_SIMPLEX

while 1:
    b,img = cam.read()
    if b:
         cv2.putText(img,"c-Capture  s-Save  q- Quit",(100,50),cv2.FONT_HERShey_PLAIN,fontScale=2,color=(100,100,100),thickness=3)

    key = cv2.waitKey(1) & 0XFF
    if key == ord('c'):
          flag = True`

按 c 时程序开始捕获视频

    `if flag:
          cv2.putText(img,"Recording",(50,100))
          rec.write(img)

    if key == ord('s'):
          flag = False`

用 s 保存视频

   ` if not flag:
          rec.release()

    if key == ord('q'):
          rec.release()
          break
    cv2.imshow("ViewPort",img)

cv2.destroyAllWindows()`

即使我笔记本电脑上的所有视频播放器都没有打开文件有什么帮助吗?

解决方法

为了主要问题是你在开始时给 False 标记。在这种情况下,rec.release() 在开始时调用,这将关闭空的视频文件。要解决它,您可以将 flag = False 替换为 flag = None,然后必须使用以下内容修复 'if not flag:':'elif flag == False:'。 接下来,我确定您不需要保存视频中的文本。为此,您需要从视频帧中复制一份。一个用于显示,一个用于保存。

代码如下:

import cv2
import numpy as np


cap = cv2.VideoCapture(0)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc,fps,(int(width),int(height)))
flag = None

while(cap.isOpened()):
    ret,frame = cap.read()
    frame_out = frame.copy()
    key = cv2.waitKey(1)

    if key == ord('c'):
        flag = True
    
    elif key == ord('s'):
        flag = False

    if ret == True:
        cv2.putText(frame,'c-Capture  s-Save  q- Quit',(100,50),cv2.FONT_HERSHEY_PLAIN,2,100,100),3)
    
        if flag == True:
            cv2.putText(frame,'Recording',(50,100))
            out.write(frame_out)
        
        elif flag == False:
            out.release()
            flag = None

        cv2.imshow('frame',frame)
        if key == ord('q'):
            break

    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。