首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在OpenCV中提高摄像头捕获分辨率

在OpenCV中提高摄像头捕获分辨率
EN

Stack Overflow用户
提问于 2008-08-18 07:45:33
回答 15查看 77.7K关注 0票数 52

在我的C/C++程序中,我使用OpenCV从我的网络摄像头捕捉图像。相机(Logitech QuickCam IM)可以在320x240640x4801280x960的分辨率下拍摄。但是,出于某种奇怪的原因,OpenCV只给我提供了分辨率为320x240的图像。使用cvSetCaptureProperty()与其他分辨率值一起更改分辨率的调用不起作用。如何使用网络摄像头以其他可能的分辨率捕获图像?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2008-08-18 07:46:15

似乎没有一个解决方案。使用lifebelt77共享的this hack可以将分辨率提高到640x480。以下是复制的详细信息:

添加到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.

票数 17
EN

Stack Overflow用户

发布于 2009-04-03 12:40:21

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

有了这些指令,我就可以设置相机分辨率了。请注意,我调用的是旧的cvCreateCameraCapture而不是cvCaptureFromCam。

capture = cvCreateCameraCapture(cameraIndex);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );


videoFrame = cvQueryFrame(capture);

我已经用罗技、Trust和飞利浦的网络摄像头进行了测试

票数 43
EN

Stack Overflow用户

发布于 2008-08-19 00:20:02

我以前在linux上做过图像处理,跳过了OpenCV的内置摄像头功能,因为它(正如你所发现的)不完整。

根据您的操作系统的不同,您可能会更幸运地通过正常渠道直接访问硬件,而不是通过openCV。如果你使用Linux,video4linux或video4linux2应该可以让你相对简单地访问USB网络摄像头,你可以使用libavc1394进行火线。根据设备和您遵循的示例代码的质量,您应该能够在一两个小时内使用您想要的参数运行设备。

编辑后的补充内容:如果是Windows系统,则只能靠自己。我想这并不是很难,但我从来没有做过。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档