51 votes

Augmentation de la résolution de capture des caméras dans OpenCV

Dans mon programme C/C++, j'utilise OpenCV pour capturer les images de ma webcam. La caméra ( Logitech QuickCam IM ) peut capturer à des résolutions 320x240 , 640x480 y 1280x960 . Mais, pour une raison étrange, OpenCV me donne des images de résolution 320x240 seulement. Appels pour changer la résolution en utilisant cvSetCaptureProperty() avec d'autres valeurs de résolution ne fonctionnent tout simplement pas. Comment puis-je capturer des images avec les autres résolutions possibles avec ma webcam ?

42voto

Grifo Points 618

J'utilise openCV 1.1pre1 sous Windows (la bibliothèque videoinput est utilisée par défaut par cette version d'openCv sous Windows).

Avec ces instructions, je peux régler la résolution de la caméra. Notez que j'appelle l'ancien cvCreateCameraCapture au lieu de cvCaptureFromCam.

capture = cvCreateCameraCapture(cameraIndex);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );

videoFrame = cvQueryFrame(capture);

Je l'ai testé avec les webcams Logitech, Trust et Philips.

17voto

Ashwin Points 17537

Il ne semble pas y avoir de solution. La résolution peut être augmentée à 640x480 en utilisant ce piratage partagé par ceinture de vie77 . Voici les détails reproduits :

Ajouter à 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

Ajouter la fonction 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;
}

et modifier captureCAM VFW vtable comme suit :

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

Maintenant reconstruit highgui.dll .

5voto

Louis Brandy Points 4844

J'ai déjà fait du traitement d'images sous Linux et j'ai ignoré la fonctionnalité de caméra intégrée d'OpenCV parce qu'elle est (comme vous l'avez découvert) incomplète.

En fonction de votre système d'exploitation, vous aurez peut-être plus de chance d'accéder directement au matériel par les voies normales plutôt que par openCV. Si vous utilisez Linux, video4linux ou video4linux2 devrait vous donner un accès relativement trivial aux webcams USB et vous pouvez utiliser libavc1394 pour le firewire. En fonction du périphérique et de la qualité du code d'exemple que vous suivez, vous devriez être en mesure de faire fonctionner le périphérique avec les paramètres que vous voulez en une heure ou deux.

Modifié pour ajouter : Vous êtes seul si c'est Windows. J'imagine que ce n'est pas beaucoup plus difficile mais je ne l'ai jamais fait.

5voto

martjno Points 1024

Je suggère fortement d'utiliser Librairie VideoInput il prend en charge n'importe quel périphérique DirectShow (même plusieurs périphériques en même temps) et est plus configurable. Vous passerez cinq minutes à le faire jouer avec OpenCV.

5voto

Yo-L Points 347

Regardez ce billet : https://code.ros.org/trac/opencv/ticket/376

"La solution est d'utiliser le nouveau wrapper basé sur libv4l.

  1. installer libv4l-dev (c'est ainsi que cela s'appelle dans Ubuntu)

  2. réexécutez cmake, vous verrez "V4L/V4L2 : Using libv4l"

  3. rerun make. maintenant la résolution peut être changée. testé avec isight intégré sur MBP".

Cela m'a permis de résoudre le problème sous Ubuntu et pourrait bien fonctionner pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X