在OpenCV中提高相机拍摄分辨率(Increasing camera capture resolu

2019-07-18 03:05发布

在我的C / C ++程序,我使用OpenCV中捕捉从我的摄像头图像。 相机( 罗技快IM )可以在320×240的分辨率,640×4801280×960捕获。 但是,对于一些奇怪的原因,OpenCV中给了我唯一的320x240分辨率的图像。 呼吁改变使用分辨率cvSetCaptureProperty()与其他分辨率值就是不工作。 如何捕捉图像与可能的其他决议和我的摄像头?

Answer 1:

我使用的OpenCV 1.1pre1 Windows下(videoinput库默认使用的windows下这个版本的OpenCV)。

这些说明,我可以设置相机的分辨率。 请注意,我所说的老cvCreateCameraCapture而不是cvCaptureFromCam。

capture = cvCreateCameraCapture(cameraIndex);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );


videoFrame = cvQueryFrame(capture);

我已经与罗技,信托和飞利浦网络摄像头进行了测试



Answer 2:

似乎没有成为一个解决方案。 分辨率可以利用提高到640×480 这个黑客通过lifebelt77共享。 下面是转载的详细信息:

加入highgui.h:

#define CV_CAP_PROP_DIALOG_DISPLAY 8
#define CV_CAP_PROP_DIALOG_FORMAT 9
#define CV_CAP_PROP_DIALOG_SOURCE 10
#define CV_CAP_PROP_DIALOG_COMPRESSION 11
#define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12

功能icvSetPropertyCAM_VFW加入cvcap.cpp:

static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value )
{
    int result = -1;
    CAPSTATUS capstat;
    CAPTUREPARMS capparam;
    BITMAPINFO btmp;

    switch( property_id )
    {
        case CV_CAP_PROP_DIALOG_DISPLAY:
            result = capDlgVideoDisplay(capture->capWnd);
            //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0);
            break;

        case CV_CAP_PROP_DIALOG_FORMAT:
            result = capDlgVideoFormat(capture->capWnd);
            //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0);
            break;

        case CV_CAP_PROP_DIALOG_SOURCE:
            result = capDlgVideoSource(capture->capWnd);
            //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0);
            break;

        case CV_CAP_PROP_DIALOG_COMPRESSION:
            result = capDlgVideoCompression(capture->capWnd);
            break;

        case CV_CAP_PROP_FRAME_WIDTH_HEIGHT:
            capGetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO));
            btmp.bmiHeader.biWidth = floor(value/1000);
            btmp.bmiHeader.biHeight = value-floor(value/1000)*1000;
            btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight *
            btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes *
            btmp.bmiHeader.biBitCount / 8;
            capSetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO));
            break;

        default:
            break;
    }

    return result;
}

和编辑captureCAM_VFW_vtable如下:

static CvCaptureVTable captureCAM_VFW_vtable =
{
6,
(CvCaptureCloseFunc)icvCloseCAM_VFW,
(CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW,
(CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW,
(CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW,
(CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL
(CvCaptureGetDescriptionFunc)0
};

现在重建highgui.dll。



Answer 3:

我已经做了图像处理之前Linux和跳过的OpenCV的内置摄像头功能,因为它的(如你发现)不完整的。

根据您的操作系统,你可以有更多的运气去直接硬件通过正常渠道,而不是通过OpenCV的。 如果您正在使用Linux,video4linux实现或video4linux2应该给你USB摄像头比较琐碎的访问,你可以使用libavc1394火线。 根据设备和你跟随示例代码的质量上,你应该能够得到与你在一两个小时要的参数运行的设备。

编辑补充:你是你自己的,如果它的Windows。 我想这不是更加困难,但我从来没有做过。



Answer 4:

我强烈建议使用VideoInput的lib ,它支持任何DirectShow的设备(即使是在同一时间多个设备),更可配置。 你会花五几分钟内做出它OpenCV的发挥。



Answer 5:

选中此票出: https://code.ros.org/trac/opencv/ticket/376

“解决的办法是使用较新的基于libv4l-包装。

  1. 安装libv4l-DEV(这是它是如何在Ubuntu的称呼)

  2. 重新运行cmake的,你会看到 “V4L / V4L2:使用libv4l”

  3. 重新运行作。 现在,分辨率可以改。 内置iSight摄像头的MBP进行测试。”

这个固定我使用Ubuntu,并可能藏汉为你工作的。



Answer 6:

代码我终于在Python工作的一次亚伦焕指出我需要使用之前定义一组函数的参数。

#Camera_Get_Set.py
#By Forrest L. Erickson of VRX Company Inc. 8-31-12.
#Opens the camera and reads and reports the settings.
#Then tries to set for higher resolution.
#Workes with Logitech C525 for resolutions 960 by 720 and 1600 by 896


import cv2.cv as cv
import numpy

CV_CAP_PROP_POS_MSEC = 0
CV_CAP_PROP_POS_FRAMES = 1
CV_CAP_PROP_POS_AVI_RATIO = 2
CV_CAP_PROP_FRAME_WIDTH = 3
CV_CAP_PROP_FRAME_HEIGHT = 4
CV_CAP_PROP_FPS = 5
CV_CAP_PROP_POS_FOURCC = 6
CV_CAP_PROP_POS_FRAME_COUNT = 7
CV_CAP_PROP_BRIGHTNESS = 8
CV_CAP_PROP_CONTRAST = 9
CV_CAP_PROP_SATURATION = 10
CV_CAP_PROP_HUE = 11

CV_CAPTURE_PROPERTIES = tuple({
CV_CAP_PROP_POS_MSEC,
CV_CAP_PROP_POS_FRAMES,
CV_CAP_PROP_POS_AVI_RATIO,
CV_CAP_PROP_FRAME_WIDTH,
CV_CAP_PROP_FRAME_HEIGHT,
CV_CAP_PROP_FPS,
CV_CAP_PROP_POS_FOURCC,
CV_CAP_PROP_POS_FRAME_COUNT,
CV_CAP_PROP_BRIGHTNESS,
CV_CAP_PROP_CONTRAST,
CV_CAP_PROP_SATURATION,
CV_CAP_PROP_HUE})

CV_CAPTURE_PROPERTIES_NAMES = [
"CV_CAP_PROP_POS_MSEC",
"CV_CAP_PROP_POS_FRAMES",
"CV_CAP_PROP_POS_AVI_RATIO",
"CV_CAP_PROP_FRAME_WIDTH",
"CV_CAP_PROP_FRAME_HEIGHT",
"CV_CAP_PROP_FPS",
"CV_CAP_PROP_POS_FOURCC",
"CV_CAP_PROP_POS_FRAME_COUNT",
"CV_CAP_PROP_BRIGHTNESS",
"CV_CAP_PROP_CONTRAST",
"CV_CAP_PROP_SATURATION",
"CV_CAP_PROP_HUE"]


capture = cv.CaptureFromCAM(0)

print ("\nCamera properties before query of frame.")
for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)):
#    camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo]
    foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i])
    camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo]
#    print str(camera_values)
    print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo)


print ("\nOpen a window for display of image")
cv.NamedWindow("Camera", 1)
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("Camera", img)
    if cv.WaitKey(10) == 27:
        break
cv.DestroyWindow("Camera")


#cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1024)
#cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 768)
cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1600)
cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 896)


print ("\nCamera properties after query and display of frame.")
for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)):
#    camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo]
    foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i])
    camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo]
#    print str(camera_values)
    print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo)


print ("/nOpen a window for display of image")
cv.NamedWindow("Camera", 1)
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("Camera", img)
    if cv.WaitKey(10) == 27:
        break
cv.DestroyWindow("Camera")


Answer 7:

我使用Debian和Ubuntu,我有同样的问题,我无法使用CV_CAP_PROP_FRAME_WIDTHCV_CAP_PROP_FRAME_HEIGHT改变视频输入的分辨率

我原来认为的原因是缺少库。 我通过突触安装lib4l-dev的重建的OpenCV,问题就解决了!



Answer 8:

我张贴这种以确保没有其他人浪费时间在这的setProperty功能。 我花了这2天,看到什么似乎是工作。 于是我翻出代码(我已经安装了该库的第一次左右)。 这是实际发生的事情 - cvSetCaptureProperty,调用CvCapture类中的setProperty和LO看哪的setProperty什么都不做。 它只是返回false。 相反,我会拿起使用第三方库喂OpenCV中捕获的视频/图像。 我使用的OpenCV 2.2



Answer 9:

cvSetCaptureProperty(捕获,CV_CAP_PROP_FRAME_WIDTH,WIDTH);

cvSetCaptureProperty(捕获,CV_CAP_PROP_FRAME_HEIGHT,HEIGHT);

cvQueryFrame(捕捉);

不会与OpenCV的2.2工作,但如果你使用的OpenCV 2.1它将很好地工作!



Answer 10:

如果你是在Windows平台上,尝试的DirectShow(IAMStreamConfig)。

http://msdn.microsoft.com/en-us/library/dd319784%28v=vs.85%29.aspx



Answer 11:

在Windows尝试使用VideoInput库: http://robocraft.ru/blog/computervision/420.html



Answer 12:

我发现,在Windows(Win98下从WinXP的到SP3),OpenCV中会经常使用微软VFW库摄像头的访问。 这里的问题是,它往往是很慢的(比如说15 FPS帧捕获的最大值)和越野车(所以为什么cvSetCaptureProperty往往不工作)。 幸运的是,你通常可以更改其他软件的分辨率(尤其是“AMCAP”,这是一个容易获得一个演示程序),它会影响该的OpenCV将使用的分辨率。 例如,您可以运行AMCAP将分辨率设置为640 x 480,然后OpenCV的将使用默认情况下从该点向前!

但是,如果你可以使用不同的Windows相机访问库,如“videoInput”库http://muonics.net/school/spring05/videoInput/ ,使用非常有效的DirectShow(DirectX的一部分)访问摄像机。 或者,如果你有一个专业素质的相机,那么往往就会拿出一个定制的API,可以让你访问摄像机,你可以使用与改变的分辨率和许多其他事物的能力的快速访问。



Answer 13:

只是一个信息,那可能是有困难的人更改默认拍摄分辨率(640×480)的宝贵! 我尝试自己这样一个问题的OpenCV的2.4.x和一个罗技摄像头... ...,发现一个解决办法!

余检测的行为是默认格式是设置为初始参数时相机捕获开始时(cvCreateCameraCapture),以及所有请求以改变高度或宽度:

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ... 

要么

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ...

是不可能的算账! 实际上,我加的是V4L2驱动程序返回EBUSY为泰德请求ioctl函数,返回错误发现! 因此,一个解决办法应该是直接在highgui / cap_v4l.cpp改变默认值:

*#define DEFAULT_V4L_WIDTH  1280    // Originally 640* 

*#define DEFAULT_V4L_HEIGHT 720     // Originally 480*

在那之后,我只是重新编译的OpenCV ...抵达获得1280×720,没有任何问题! 当然,更好的修复应停止收购,改变参数,并重启后流,但我没有足够的熟悉OpenCV的做这件事!

希望这将有助于。

米歇尔BEGEY



Answer 14:

试试这个:

capture = cvCreateCameraCapture(-1);
//set resolution
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, frameWidth);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, frameHeight);


Answer 15:

cvQueryFrame(capture);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size);

cvQueryFrame(capture);

应该足以!



文章来源: Increasing camera capture resolution in OpenCV