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

推荐答案

似乎没有解决办法.使用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个.

C++相关问答推荐

海湾合作委员会是否保证大小匹配的访问?

无效使用未定义类型'structsquare'?

以c格式打印时间戳

为什么写入系统调用打印的字符数不正确?

使用单个字节内的位字段

exit(EXIT_FAILURE):Tcl C API类似功能

C语言中的strstr问题

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

如何捕捉只有换行符或空格字符缓冲区的边缘大小写

实现简单字典时C语言中的段错误

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

Tic-tac-toe:从文件加载存储

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

递归打印二维数组(C编程)

计算SIZE_MAX元素的长数组的大小

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码