带有Python 3 VideoCapture的OpenCV 3.2更改v4l2的设置 [英] OpenCV 3.2 with Python 3 VideoCapture changes settings of v4l2
问题描述
我使用带有Python3和SBC OXU4的OpenCV 3.2.我有一个连接到SBC的真实5MPx网络摄像机.我想从这款相机拍摄2592x1944分辨率的照片.如果我使用奶酪,则可以以此分辨率拍照.我可以使用命令行程序streamer -t 4 -r 4 -s 2592x1944 -o b0.jpeg
保存图片,但是当我使用OpenCV3.2拍照时,如下所示:
I worked with OpenCV 3.2 with Python3 and SBC OXU4. I have a true 5MPx web-camera connected to SBC. I want to take from this camera 2592x1944 resolution picture. If I use Cheese I can take picture with this resolution. I can save pictures with command line program streamer -t 4 -r 4 -s 2592x1944 -o b0.jpeg
But when I take picture with OpenCV3.2 like this:
#!/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
I will see 1920x1080 photo resolution. Also I have inspected 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=YUYV
并与v4l2-ctl --all
一起使用,我看到参数设置为:
In fact I see that we have default settings as MJPG 1920X1080. After that I tried to use v4l2-ctl --set-fmt-video=width=2592,height=1936,pixelformat=YUYV
and with v4l2-ctl --all
I saw that params are sets to:
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这样的最大分辨率?
But when I start my script this params resets and I take 1920x1080 image and see on v4l2-ctl --all
that its MJPG 1920x1080. As I understood cap=cv2.VideoCapture(0)
resets settings of v4l2 device to default before working. How can I tune default settings to YUYV 2952x1944 with which I can take an image? Also why cap.set(cv2.CAP_PROP_FRAME_WIDTH)
doesn't work? Because OpenCV identified max resolution like MJPG 1920?
推荐答案
OpenCV automatically selects the first available capture backend (see here). It can be that it is not using V4L2 automatically.
还要在构建时同时设置-D WITH_V4L=ON
和-D WITH_LIBV4L=ON
.
Also set both -D WITH_V4L=ON
and -D WITH_LIBV4L=ON
when building.
(与问题无关)为了设置要使用的像素格式,请设置捕获的CAP_PROP_FOURCC
属性:
(Unrelated to the question) In order to set the pixel format to be used set the CAP_PROP_FOURCC
property of the capture:
capture = cv2.VideoCapture(cam_id, cv2.CAP_V4L2)
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
这篇关于带有Python 3 VideoCapture的OpenCV 3.2更改v4l2的设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!