当前位置: 首页 > 知识库问答 >
问题:

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

翟京
2023-03-14

我在Ubuntu 12.04 64位上使用OpenCV 2.4.5。我希望能够设置我的罗技C310网络摄像头输入的分辨率。相机支持高达1280x960在30fps,我能够在guvcview在这个分辨率查看视频。但是OpenCV总是以640x480的速度获取视频。

试图用cap更改分辨率。设置(CV\U CAP\U PROP\U FRAME\U WITH,1280)和CAP。创建视频捕获封盖后立即设置(CV_CAP_PROP_FRAME_HEIGHT,960)无效;在获取每个帧之前尝试立即设置它们会导致程序立即崩溃。我也不能用这种方法降低分辨率。我还收到了错误“HIGHGUI错误:V4L/V4L2:VIDIOC\u S\u CROP”。我认为这可能是相关的,因为它在创建视频捕获时出现一次,在我尝试设置宽度和高度时出现一次(但奇怪的是,如果我尝试只设置其中一个,则不会出现)。

我知道我不是第一个遇到这个问题的人,但在互联网上搜索搜索了很多SO和其他地方之后,我还没有找到一个解决方案(在我已经尝试过的许多事情中,没有找到一个解决这个问题的答案:增加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错误”,我得到了一个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-setting-resolution-of-video-capture-device/

共有3个答案

方梓
2023-03-14

您可以使用v4l2 ctl设置捕获视频的帧大小,如下所示。

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

您可以在此链接中找到更多信息

霍襦宗
2023-03-14

只是想添加我的CMAKE选项,以基于Ulrich针对OpenCV 3.2的全面回答,在Raspberry Pi 3上使用Java构建。0.在与OpenCV CMakeList相同的文件夹中创建/生成文件夹a。txt并为新建/生成文件夹执行此脚本:

sudo cmake-D cmake\u BUILD\u TYPE=RELEASE-D WITH\u OPENCL=OFF-D BUILD\u PERF\u TESTS=OFF-D BUILD\u SHARED\u LIBS=OFF-D JAVA\u INCLUDE\u PATH=$JAVA\u HOME/INCLUDE-D JAVA\u AWT\u LIBRARY=$JAVA\u HOME/jre/lib/arm/libawt。so-D JAVA_JVM_LIBRARY=$JAVA_HOME/jre/lib/arm/server/libjvm。因此-D CMAKE_INSTALL_PREFIX=/usr/local-D BUILD_TESTS=OFF-D WITH_MATLAB=OFF-D WITH_cupt=OFF-D WITH_cubda=OFF-D WITH_CUBLAS=OFF-D WITH_GTK=OFF-D WITH_WEBP=OFF-D BUILD\u opencv\u apps=OFF-D BUILD\u PACKAGE=OFF-D WITH_LIBV4L=ON。。

毋树
2023-03-14

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

(您的错误消息HIGHGUI错误:V4L/V4L2:VIDIOC_S_CROP表示您有V4L版本;消息在cap_V4L.cpp中,请参阅代码,但不在cap_libv4l.cpp中。)

要使OpenCV 2.4的v4l版本以640x480以外的固定分辨率工作,一个解决方法是在modules/highgui/src/cap\u v4l中更改DEFAULT\u v4l\u WIDTHDEFAULT\u v4l\u HEIGHT的值。cpp和重建OpenCV,这一答案令人赞叹。

如果您想构建libv4l版本,那么您可能只需要安装libv4l-dev并重新构建OpenCV<默认情况下,已为我启用代码>WITH_LIBV4L。如果不是,则cmake命令应包含

-D WITH_LIBV4L=ON

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

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

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

 类似资料:
  • 我遇到的问题是,我无法更改OpenCV视频捕获的分辨率。不管怎样,分辨率总是640x480。我使用的代码是用C编写的,我使用的是opencv 3.4.8。我已经创建了一个超级简单的程序来做这件事,不管我怎么尝试,它似乎都不起作用。 以下是完整的代码: 当我运行上述代码时,帧总是640x480。 我已尝试使用

  • 我正在OpenCV(2.4.8)中创建一个程序,可以读取视频文件并对其进行计算。对于这些计算,我不需要高分辨率的帧,我可以用640*360作为分辨率。 在早期的测试中,我连接了网络摄像头,我使用了: 它完美地调整了图像的大小。现在,我要进入下一步,我想用我的程序来存储视频,而不是一个实时提要(我用来测试)。当我用源文件路径(字符串)更改“0”时,将加载文件,但分辨率仍为1920*1080。 我做错

  • 我尝试用全高清分辨率的罗技C920摄像头捕捉视频。它提供30 fps与此分辨率。 它以30 fps的速度与windows摄像头应用程序配合使用,但无论我如何尝试,我都无法通过opencv videoCapture获得这种fps速度。 注意:我使用windows 10和vs15。我尝试了不同的usb端口,opencv版本和编解码器。结果是相同的,〜5 fps。 我测量fps忽略前10帧。下面是我的计

  • 我想用我的相机拍摄1920x1080视频,但我遇到了两个问题 初始化视频捕获时,它会将宽度/高度更改为640/480 当我试图在cv2中更改宽度/高度时,图像变得混乱 当在cv2中设置1920x1080时,图像变成蓝色,底部有一个故障条 根据v4l2-ctl,事情是这样的。蓝色图像似乎不是像素格式变化的结果(例如。RGB至BGR) 最后,这里是一个以640x480拍摄的具有正确颜色的图像示例。代码

  • 在OpenCV上使用class VideoCapture时如何旋转摄像头?(Android上的人脸检测示例)。我正在旋转画布: 但摄像机的图像并没有旋转:人脸检测不起作用。 摄像头从以下位置接收流: 我做了以下更新: 但这是行不通的。当我以portret方向运行程序时(在android设备上)——当我以横向方向运行程序时,程序不会启动——程序工作,但当我旋转设备时,程序工作,但显示屏上的图像不会旋

  • 我正试图从ip摄像机捕捉视频,并保存为avi视频文件。同时脚本将包含人脸的帧保存为jpeg文件。当脚本执行这些任务时,cpu使用率约为100%。正因为如此,我只想限制人脸检测的帧率。