-->

OpenCV的:不能设置视频拍摄的分辨率(OpenCV: can't set resolut

2019-09-02 01:20发布

我使用在Ubuntu 12.04 64位的OpenCV 2.4.5。 我希望能够从我的罗技C310网络摄像头设置输入的分辨率。 相机以每秒30帧到1280×960支持了,我能在这个分辨率在guvcview查看视频。 但是OpenCV的总是得到仅为640×480视频。

试图改变与cap.set(CV_CAP_PROP_FRAME_WIDTH,1280)的分辨率和cap.set(CV_CAP_PROP_FRAME_HEIGHT,960)创建VideoCapture帽之后立即没有任何影响; 试图立即将它们得到每一帧导致程序立即崩溃之前。 我不能减少使用这种方法的分辨率无论是。 我也收到错误 “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 
}

正因为如此,这得到如上所述我两个“HIGHGUI ERROR” S和我得到一个640×480的输出。 我知道,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-设置-分辨率的视频捕获装置/

Answer 1:

这是在为v41“版本”(构建)的OpenCV 2.4(包括2.4.12)中的错误,但是错误不在libv4l版本。 对于OpenCV的3.1.0,无论是为v41也不libv4l版本有错误。

(你的错误错误消息HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP表明您拥有为v41版本;该消息是在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

CMake的输出(或version_string.tmp)的libv4l版本包含类似

  Video I/O:
    ...
    V4L/V4L2:   Using libv4l1 (ver 0.8.6) / libv4l2 (ver 0.8.6)

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



Answer 2:

你可以用用v412-CTL设置拍摄的视频的帧大小像下面。

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=1

您可以在此了解更多信息链接



Answer 3:

只是想补充我的CMake的选项,以建立与Java基于乌尔里希对OpenCV的3.2.0全面的答案树莓派3。 做一个/在同一个文件夹中的OpenCV CMakeList.txt建立一个文件夹,并为新的执行这个脚本/ build文件夹:

须藤cmake的-D CMAKE_BUILD_TYPE = RELEASE -D WITH_OPENCL = OFF -D BUILD_PERF_TESTS = OFF -D BUILD_SHARED_LIBS = OFF -D JAVA_INCLUDE_PATH = $ JAVA_HOME /包括-D JAVA_AWT_LIBRARY = $ JAVA_HOME / JRE / LIB /臂/ libawt.so -D JAVA_JVM_LIBRARY = $ JAVA_HOME / JRE / LIB /臂/服务器/ libjvm.so -D CMAKE_INSTALL_PREFIX =的/ usr /本地-D BUILD_TESTS = OFF -D WITH_MATLAB = OFF -D WITH_CUFFT = OFF -D WITH_CUDA = OFF -D WITH_CUBLAS = OFF -D WITH_GTK = OFF -D WITH_WEBP = OFF -D BUILD_opencv_apps = OFF -D BUILD_PACKAGE = OFF -D WITH_LIBV4L = ON ..



Answer 4:

也许你可以试试这个,但我不知道这是否是你想要什么:

#include <X11/Xlib.h>

Display* disp = XOpenDisplay(NULL);
Screen*  scrn = DefaultScreenOfDisplay(disp);
int height = scrn->height;
int width  = scrn->width;

//Create window for the ip cam video
cv::namedWindow("Front", CV_WINDOW_NORMAL);

cvSetWindowProperty( "Front", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );

//Position of the screen where the video is shows
cvMoveWindow("Front", 0, 0);
cvResizeWindow( "Front", width, height );

这样你得到的全屏幕的任何屏幕。



文章来源: OpenCV: can't set resolution of video capture