Increasing camera capture resolution in OpenCV Increasing camera capture resolution in OpenCV c c

Increasing camera capture resolution in OpenCV


I'm using openCV 1.1pre1 under Windows (videoinput library is used by default by this version of openCv under windows).

With these instructions I can set camera resolution. Note that I call the old cvCreateCameraCapture instead of cvCaptureFromCam.

capture = cvCreateCameraCapture(cameraIndex);cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );videoFrame = cvQueryFrame(capture);

I've tested it with Logitech, Trust and Philips webcams


There doesn't seem to be a solution. The resolution can be increased to 640x480 using this hack shared by lifebelt77. Here are the details reproduced:

Add to 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

Add the function icvSetPropertyCAM_VFW to 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;}

and edit captureCAM_VFW_vtable as following:

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};

Now rebuilt highgui.dll.


I've done image processing in linux before and skipped OpenCV's built in camera functionality because it's (as you've discovered) incomplete.

Depending on your OS you may have more luck going straight to the hardware through normal channels as opposed to through openCV. If you are using Linux, video4linux or video4linux2 should give you relatively trivial access to USB webcams and you can use libavc1394 for firewire. Depending on the device and the quality of the example code you follow, you should be able to get the device running with the parameters you want in an hour or two.

Edited to add: You are on your own if its Windows. I imagine it's not much more difficult but I've never done it.