问题描述
我使用带有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自动选择第一个可用的捕获后端(请参阅此处).可能是它没有自动使用V4L2.
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的设置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!