OpenCV:无法设置视频捕获的分辨率

ero*_*rtc 12 opencv v4l v4l2 logitech

我在Ubuntu 12.04 64位上使用OpenCV 2.4.5.我希望能够设置Logitech C310网络摄像头的输入分辨率.相机支持最高1280x960(30fps),我可以在guvcview中以此分辨率观看视频.但OpenCV总是以640x480的速度获取视频.

在创建VideoCapture上限后立即尝试使用cap.set(CV_CAP_PROP_FRAME_WIDTH,1280)和cap.set(CV_CAP_PROP_FRAME_HEIGHT,960)更改分辨率无效; 在获取每个帧之前尝试立即设置它们会导致程序立即崩溃.我也不能用这种方法降低分辨率.我也收到错误"HIGHGUI ERROR:V4L/V4L2:VIDIOC_S_CROP".我认为这可能是相关的,因为它在创建VideoCapture时出现一次,并且当我尝试设置宽度和高度时出现一次(但奇怪的是,如果我尝试仅设置其中一个,则不会).

我知道我不是第一个遇到这个问题的人,但我还没有找到一个解决方案,经过谷歌搜索和搜索SO以及互联网上的其他地方(在我已经尝试过的许多事情中,无法获得的答案是这个StackOverflow问题:提高OpenCV中的摄像头捕获分辨率.这是OpenCV中的错误吗?如果是这样,这是一个相当明显的.

以下是展示问题的代码示例(只是OpenCV视频显示代码的修改版本):

#include <cv.h>
#include <highgui.h>
using namespace cv;

int main(int argc, char** argv)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
            return -1;

    cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);

    Mat image;
    namedWindow("Video", CV_WINDOW_AUTOSIZE);

    while(1)
    {
            // cap.set(CV_CAP_PROP_FRAME_WIDTH, 160);
            // cap.set(CV_CAP_PROP_FRAME_HEIGHT, 120);
            cap >> image;

            imshow("Video", image);

            if(waitKey(10) == 99 ) break;
    }
    return 
}
Run Code Online (Sandbox Code Playgroud)

实际上,如上所述,我得到两个"HIGHGUI ERROR",我得到一个640x480输出.我知道160x120是我的相机支持的分辨率v4l2-ctl --list-formats-ext.如果我取消注释while循环中两个注释掉的行,程序会立即崩溃.

这些可能是相关的或有可能的解决方案:http://answers.opencv.org/question/11427/decreasing-capture-resolution-of-webcam/,http://answers.opencv.org/question/30062/error-设置-分辨率的视频捕获装置/

Ulr*_*ern 5

这是OpenCV 2.4(包括2.4.12)的v4l “版本”(内部版本)中的错误,但该错误不在libv4l版本中。对于OpenCV 3.1.0,v4l和libv4l版本都没有错误。

(您的错误错误消息HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP表明您具有v4l版本;该消息位于cap_v4l.cpp中,请参见代码,但不在cap_libv4l.cpp中。)

一个解决方法获得的OpenCV 2.4的版本为v41工作在一个固定的比640×480分辨率等正在改变值DEFAULT_V4L_WIDTHDEFAULT_V4L_HEIGHT模块/ highgui / src目录/ cap_v4l.cpp和重新建设的OpenCV,荣誉给这个 答案

如果您要构建libv4l版本,则可能需要做的就是安装libv4l-dev并重建OpenCV。WITH_LIBV4L已默认为我启用。如果不是,则您的cmake命令应包含

-D WITH_LIBV4L=ON
Run Code Online (Sandbox Code Playgroud)

libv4l构建的cmake输出(或version_string.tmp)包含以下内容

  Video I/O:
    ...
    V4L/V4L2:   Using libv4l1 (ver 0.8.6) / libv4l2 (ver 0.8.6)
Run Code Online (Sandbox Code Playgroud)

(对于v4l构建,它只是V4L/V4L2: NO/YES。)