Search code examples
cimageopencvwebcamresolutions

Increasing camera capture resolution in OpenCV


In my C/C++ program, I'm using OpenCV to capture images from my webcam. The camera (Logitech QuickCam IM) can capture at resolutions 320x240, 640x480 and 1280x960. But, for some strange reason, OpenCV gives me images of resolution 320x240 only. Calls to change the resolution using cvSetCaptureProperty() with other resolution values just don't work. How do I capture images with the other resolutions possible with my webcam?


Solution

  • 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.