【问题标题】:Changing codec of webcam is not possible using OpenCV/Python使用 OpenCV/Python 无法更改网络摄像头的编解码器
【发布时间】:2020-10-03 02:16:21
【问题描述】:

我正在使用 Windows 10 和 python 3.7 / OpenCV4 以及 Logitech C922 网络摄像头。虽然使用 windows 相机应用程序似乎可以提供 30 fps 的速度,但使用 OpenCV 时我无法获得超过 5-6 fps 的速度。分辨率设置为 FHD。

cam = cv2.VideoCapture(cv2.CAP_DSHOW+0)
while(1):
    ret,frame = cam.read()
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

在另一篇文章中,我找到了将编解码器更改为 MJPG 的解决方案。但是,相机不接受更改编解码器。我试过了:

cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('m','j','p','g'))
cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M','J','P','G'))
cam.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
cam.set(cv2.CAP_PROP_FOURCC, float(cv2.VideoWriter_fourcc('m','j','p','g'))
cam.set(cv2.CAP_PROP_FOURCC, float(cv2.VideoWriter_fourcc('M','J','P','G'))
cam.set(cv2.CAP_PROP_FOURCC, 1196444237.0)

相机总是返回“844715353.0”

如何获得更高的 fps?

【问题讨论】:

    标签: python opencv webcam video-capture codec


    【解决方案1】:

    看来顺序很重要。据我了解,OpenCv 在后台使用 ffmpeg。在 ffmpeg 中,命令应该是这样的:

    ffmpeg -f dshow -framerate 60 -video_size 1280x720 -input_format mjpeg -i video="my webcam" out.mkv
    

    所以你的 OpenCV 代码应该是这样的

    my_cam_index = 0 
    cap = cv2.VideoCapture(my_cam_index, cv2.CAP_DSHOW)
    cap.set(cv2.CAP_PROP_FPS, 60.0) 
    cap.set(cv2.CAP_PROP_FRAME_WIDTH,1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT,720) 
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('M','J','P','G'))
    

    【讨论】:

      【解决方案2】:

      我使用 Logitech c920 网络摄像头,我在 imutils 模块中测试 WebcamVideoStream 类,这个模块使用线程和队列数据结构来提高 FPS 使用 OpenCV 处理视频流时移动 I/O(即,从相机传感器读取帧)到一个单独的线程,你可以在这个文件webcamvideostream.py上设置你的自定义分辨率。

      您可以使用线程来获得更高的 FPS。也许这个解决方案可以帮助你。

      请查看以下链接:

      https://www.pyimagesearch.com/2015/12/21/increasing-webcam-fps-with-python-and-opencv/

      https://www.pyimagesearch.com/2017/02/06/faster-video-file-fps-with-cv2-videocapture-and-opencv/

      https://github.com/jrosebr1/imutils/blob/master/imutils/video/webcamvideostream.py

      【讨论】:

      • 非常感谢您的帮助。但是,我认为多线程只会增加伪fps。这意味着,我阅读了更多帧,但许多帧只是以前的帧而不是新帧,因为相机的物理帧速率不会改变。只有程序主体执行得更多。如果您使用 FHD 分辨率,您可以达到什么“物理”fps?您使用哪种编解码器?非常感谢
      • 欢迎您,我很久以前使用 c920 相机,我不记得它是什么,但我使用 1920x1080 分辨率,当我使用多线程时,我可以提高我的 fps,我想实时图像无人机机器人处理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2012-06-16
      • 2015-05-26
      • 2017-09-25
      相关资源
      最近更新 更多