在我的C/C++程序中,我使用OpenCV从我的网络摄像头捕捉图像。相机(Logitech QuickCam IM)可以在320x240,640x480和1280x960的分辨率下拍摄。但是,出于某种奇怪的原因,OpenCV只给我提供了分辨率为320x240的图像。使用cvSetCaptureProperty()与其他分辨率值一起更改分辨率的调用不起作用。如何使用网络摄像头以其他可能的分辨率捕获图像?
发布于 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.
发布于 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和飞利浦的网络摄像头进行了测试
发布于 2008-08-19 00:20:02
我以前在linux上做过图像处理,跳过了OpenCV的内置摄像头功能,因为它(正如你所发现的)不完整。
根据您的操作系统的不同,您可能会更幸运地通过正常渠道直接访问硬件,而不是通过openCV。如果你使用Linux,video4linux或video4linux2应该可以让你相对简单地访问USB网络摄像头,你可以使用libavc1394进行火线。根据设备和您遵循的示例代码的质量,您应该能够在一两个小时内使用您想要的参数运行设备。
编辑后的补充内容:如果是Windows系统,则只能靠自己。我想这并不是很难,但我从来没有做过。
https://stackoverflow.com/questions/14287
复制相似问题