当前位置: 首页 > 知识库问答 >
问题:

如何在opencv中显式访问用于视频捕获的mjpeg后端

张华池
2023-03-14

当我执行以下操作时:

availableBackends = [cv2.videoio_registry.getBackendName(b) for b in v2.videoio_registry.getBackends()]
print(availableBackends)

我得到了['FFMPEG','GSTREAMER','INTEL_MFX','V4L2','CV_IMAGES','CV_MJPEG']

如果我现在尝试:

print(cv2.CAP_FFMPEG)
print(cv2.CAP_GSTREAMER)
print(cv2.CAP_INTEL_MFX)
print(cv2.CAP_V4L2)
print(cv2.CAP_IMAGES)
print(cv2.CAP_MJPEG)

除了最后一个AttributeError:module'cv2之外的所有工作。cv2'没有属性“CAP_MJPEG”

如何明确设置cv2。CAP_MJPEG后端(cv2.CAP_CV_MJPEG也不工作)?

共有1个答案

姬实
2023-03-14

你可以在这里看到所有的旗帜。

它看起来像cv2。CAP_OPENCV_MJPEG就是你要找的。

以下测试创建MJPEG合成AVI视频文件,并使用cv2读取视频。CAP_OPENCV_MJPEG后端:

import numpy as np
import cv2

#availableBackends = [cv2.videoio_registry.getBackendName(b) for b in cv2.videoio_registry.getBackends()]
#print(availableBackends)

print('cv2.CAP_OPENCV_MJPEG = ' + str(cv2.CAP_OPENCV_MJPEG))


intput_filename = 'vid.avi'

# Generate synthetic video files to be used as input:
###############################################################################
width, height, n_frames = 640, 480, 100  # 100 frames, resolution 640x480

# Use motion JPEG codec (for testing)
synthetic_out = cv2.VideoWriter(intput_filename, cv2.VideoWriter_fourcc(*'MJPG'), 25, (width, height))

for i in range(n_frames):
    img = np.full((height, width, 3), 60, np.uint8)
    cv2.putText(img, str(i+1), (width//2-100*len(str(i+1)), height//2+100), cv2.FONT_HERSHEY_DUPLEX, 10, (30, 255, 30), 20)  # Green number
    synthetic_out.write(img)

synthetic_out.release()
###############################################################################


# Read the video using CV_MJPEG backend
###############################################################################
cap = cv2.VideoCapture(intput_filename, cv2.CAP_OPENCV_MJPEG)

# Keep iterating break
while True:
    ret, frame = cap.read()  # Read frame from first video

    if ret:
        cv2.imshow('frame', frame)  # Display frame for testing
        cv2.waitKey(100) #Wait 100msec (for debugging)
    else:
        break

cap.release() #Release must be inside the outer loop
###############################################################################
 类似资料:
  • 我尝试用全高清分辨率的罗技C920摄像头捕捉视频。它提供30 fps与此分辨率。 它以30 fps的速度与windows摄像头应用程序配合使用,但无论我如何尝试,我都无法通过opencv videoCapture获得这种fps速度。 注意:我使用windows 10和vs15。我尝试了不同的usb端口,opencv版本和编解码器。结果是相同的,〜5 fps。 我测量fps忽略前10帧。下面是我的计

  • 在OpenCV上使用class VideoCapture时如何旋转摄像头?(Android上的人脸检测示例)。我正在旋转画布: 但摄像机的图像并没有旋转:人脸检测不起作用。 摄像头从以下位置接收流: 我做了以下更新: 但这是行不通的。当我以portret方向运行程序时(在android设备上)——当我以横向方向运行程序时,程序不会启动——程序工作,但当我旋转设备时,程序工作,但显示屏上的图像不会旋

  • 当我使用USB摄像头捕捉实时视频流时,我的C /OpenCV应用程序运行良好。 然而,当我将佳能5Dii与实时视频连接时,它找不到相机。 佳能实用程序可以很好地捕捉视频。 我应该使用VideoCapture帽(1)吗?

  • 硬件: 1.树莓派2 2.树莓派相机 软件: 1。OpenCV 2.4。11 2。用C语言编程 我有以下简单的代码,可以从摄像机捕获视频并在窗口中显示 帧大小始终为640 x 480,尝试更改帧的宽度和高度(如注释行所示)没有帮助,并且保持为640 x 480。 我正在寻找一种方法,将帧的宽度和高度从我的代码(而不是外壳)更改为1920 x 1080 如果可以通过OpenCV或V4l2驱动程序完成

  • 我正试图从ip摄像机捕捉视频,并保存为avi视频文件。同时脚本将包含人脸的帧保存为jpeg文件。当脚本执行这些任务时,cpu使用率约为100%。正因为如此,我只想限制人脸检测的帧率。

  • 我在c920网络摄像头上将分辨率设置为全高清(宽=1920,高=1080),并使用cv2。支持此摄像头的CAP_DSHOW API。 然而,fps非常低。我尝试的下一件事是通过简单地编写 现在我得到了很高的fps,但它不再是16:9格式了,它在图像的左右两侧都有一些黑色的边栏,就像这篇文章:OpenCV捕获带有黑色边栏的imagem 有没有办法: 找出哪个API已被自动检测? 找出正在使用的格式?