【问题标题】:3. 2 with Python 3 VideoCapture changes settings of带有 Python 3 VideoCapture 的 OpenCV 3.2 更改了 v4l2 的设置
【发布时间】:2018-11-01 09:27:12
【问题描述】:

我使用 Python3 和 SBC OXU4 使用 OpenCV 3.2。我有一个连接到 SBC 的真正的 5MPx 网络摄像头。我想从这台相机拍摄 2592x1944 分辨率的照片。如果我使用 Cheese,我可以用这个分辨率拍照。我可以用命令行程序streamer -t 4 -r 4 -s 2592x1944 -o b0.jpeg保存图片但是当我像这样用OpenCV3.2拍照时:

#!/usr/bin/env python3
 import cv2
 import os
 import time
 capture1 = cv2.VideoCapture(2)
 if capture1.isOpened():
   capture1.set(3, 2592)
   capture1.set(4, 1944)
   s, img = capture1.read()
   if not img.all():
    cv2.imwrite('test1.jpg', img)
    print('image done!')
else:
 print('cant open camera')

我会看到 1920x1080 的照片分辨率。 我也检查了 v4l2-ctls

 v4l2-ctl --list-formats-ext
 ioctl: VIDIOC_ENUM_FMT
Index       : 0
Type        : Video Capture
Pixel Format: 'YUYV'
Name        : YUYV 4:2:2
    Size: Discrete 2592x1944
        Interval: Discrete 0.267s (3.750 fps)
    Size: Discrete 1920x1080
        Interval: Discrete 0.133s (7.500 fps)
    Size: Discrete 1280x960
        Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 1280x720
        Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 640x480
        Interval: Discrete 0.017s (60.000 fps)
        Interval: Discrete 0.033s (30.000 fps)
    Size: Discrete 320x240
        Interval: Discrete 0.008s (120.000 fps)
        Interval: Discrete 0.011s (90.000 fps)
        Interval: Discrete 0.017s (60.000 fps)
        Interval: Discrete 0.033s (30.000 fps)

Index       : 1
Type        : Video Capture
Pixel Format: 'MJPG' (compressed)
Name        : Motion-JPEG
    Size: Discrete 1920x1080
        Interval: Discrete 0.033s (30.000 fps)
        Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 1280x720
        Interval: Discrete 0.022s (45.000 fps)
        Interval: Discrete 0.033s (30.000 fps)
        Interval: Discrete 0.067s (15.000 fps)
    Size: Discrete 640x480
        Interval: Discrete 0.033s (30.000 fps)
        Interval: Discrete 0.067s (15.000 fps)

有效的相机设置

v4l2-ctl --all
Driver Info (not using libv4l2):
Driver name   : uvcvideo
Card type     : oCam
Bus info      : usb-12110000.usb-1
Driver version: 4.14.37
Capabilities  : 0x84200001
    Video Capture
    Streaming
    Extended Pix Format
    Device Capabilities
Device Caps   : 0x04200001
    Video Capture
    Streaming
    Extended Pix Format
 Priority: 2
 Video input : 0 (Camera 1: ok)
 Format Video Capture:
Width/Height      : 1920/1080
Pixel Format      : 'MJPG'
Field             : None
Bytes per Line    : 0
Size Image        : 10077696
Colorspace        : Default
Transfer Function : Default (maps to Rec. 709)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization      : Default (maps to Full Range)
Flags             : 
Crop Capability Video Capture:
Bounds      : Left 0, Top 0, Width 1920, Height 1080
Default     : Left 0, Top 0, Width 1920, Height 1080
Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
Streaming Parameters Video Capture:
Capabilities     : timeperframe
Frames per second: 30.000 (30/1)
Read buffers     : 0

事实上,我看到我们的默认设置为 MJPG 1920X1080。之后我尝试使用v4l2-ctl --set-fmt-video=width=2592,height=1936,pixelformat=YUYVv4l2-ctl --all 我看到参数设置为:

Driver name   : uvcvideo
Card type     : oCam
Bus info      : usb-12110000.usb-1
Driver version: 4.14.37
Capabilities  : 0x84200001
    Video Capture
    Streaming
    Extended Pix Format
    Device Capabilities
Device Caps   : 0x04200001
    Video Capture
    Streaming
    Extended Pix Format
    Priority: 2
    Video input : 0 (Camera 1: ok)
    Format Video Capture:
Width/Height      : 2592/1944
Pixel Format      : 'YUYV'
Field             : None
Bytes per Line    : 5184
Size Image        : 10077696
Colorspace        : Default
Transfer Function : Default (maps to Rec. 709)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization      : Default (maps to Limited Range)
Flags    

但是当我启动我的脚本时,这个参数会重置,我拍摄 1920x1080 的图像并在 v4l2-ctl --all 上看到它的 MJPG 1920x1080。据我了解cap=cv2.VideoCapture(0) 在工作前将 v4l2 设备的设置重置为默认值。如何将默认设置调整为可以拍摄图像的 YUYV 2952x1944?还有为什么cap.set(cv2.CAP_PROP_FRAME_WIDTH) 不起作用?因为 OpenCV 识别出像 MJPG 1920 这样的最大分辨率?

【问题讨论】:

  • 问题已解决。我从存储库中删除了预编译的 opencv,然后使用 -D WITH_V4L=ON \ 从源代码重建它

标签: python-3.x opencv video-capture v4l2 high-resolution


【解决方案1】:

OpenCV 自动选择第一个可用的捕获后端(see here)。可能是它没有自动使用 V4L2。

在构建时同时设置-D WITH_V4L=ON-D WITH_LIBV4L=ON

(与问题无关)为了设置要使用的像素格式,请设置捕获的CAP_PROP_FOURCC 属性:

capture = cv2.VideoCapture(cam_id, cv2.CAP_V4L2)
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 2017-09-23
    • 2019-04-28
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多