Frage

In meinem C/C++ - Programm, das ich verwende OpenCV Bilder aus meiner webcam.Die Kamera (Logitech QuickCam IM) können erfassen Auflösungen 320x240, 640x480 und 1280x960.Aber, für einige seltsame Grund, OpenCV gibt mir die Bilder der Auflösung 320x240 nur.Aufrufe ändern Sie die Auflösung mit cvSetCaptureProperty() mit anderen Auflösungen Werte einfach nicht funktionieren.Wie kann ich Bilder aufnehmen mit der anderen Auflösungen möglich mit meiner webcam?

War es hilfreich?

Lösung 2

Es scheint nicht die Lösung sein.Die Auflösung kann erhöht werden 640x480 Verwendung dieser hack freigegeben lifebelt77.Hier sind die details wiedergegeben:

Hinzufügen 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

Fügen Sie die Funktion icvSetPropertyCAM_VFW zu 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;
}

und Bearbeiten captureCAM_VFW_vtable wie folgenden:

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

Jetzt neu aufgebaut highgui.dll.

Andere Tipps

Ich bin mit openCV 1.1pre1 unter Windows (videoinput-Bibliothek wird standardmäßig verwendet, die von dieser version von openCv unter windows).

Mit dieser Anleitung kann ich set Kamera Auflösung.Beachten Sie, dass ich die alten cvCreateCameraCapture statt cvCaptureFromCam.

capture = cvCreateCameraCapture(cameraIndex);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );


videoFrame = cvQueryFrame(capture);

Ich habe es getestet mit Logitech, Vertrauen und Philips webcams

Ich habe getan, image processing in linux vor und übersprungen OpenCV ist gebaut in Kamera-Funktionalität, da es (wie Sie herausgefunden haben), unvollständig.

Je nach Betriebssystem müssen Sie möglicherweise mehr Glück geht direkt auf die hardware durch die normalen Kanäle, im Gegensatz zu über openCV.Wenn Sie mit Linux arbeiten, video4linux oder video4linux2 sollte Ihnen relativ einfach Zugriff auf USB-webcams, die Sie verwenden können, libavc1394 für firewire.Je nach Gerät und die Qualität der Beispiel-code, den Sie Folgen, sollten Sie in der Lage sein, um das Gerät läuft mit den Parametern, die Sie wollen, in ein oder zwei Stunden.

Bearbeitet, um hinzufügen:Sie sind auf Ihre eigenen, wenn die Fenster.Ich vorstellen, es ist nicht viel schwieriger, aber ich habe es nie getan.

Ich empfehle die Verwendung VideoInput lib, es unterstützt alle DirectShow-Gerät (auch mehrere Geräte an der gleichen Zeit) und ist mehr konfigurierbar.Verbringen Sie fünf Minuten machen spielen mit OpenCV.

Überprüfen Sie dieses ticket aus:https://code.ros.org/trac/opencv/ticket/376

"Die Lösung ist die Verwendung der neueren von libv4l-based wrapper.

  1. installieren von libv4l-dev (dies ist, wie es genannt wird Ubuntu)

  2. cmake erneut ausführen, werden Sie sehen, "V4L/V4L2:Mithilfe von libv4l"

  3. erneut machen.jetzt kann die Auflösung geändert werden.getestet mit der integrierten isight auf MBP."

Dieser repariert es für mich mit Ubuntu und vielleicht auch für Sie arbeiten.

Code, den ich habe endlich die Arbeit in Python einmal Aaron Haun hingewiesen, die ich brauchte, um zu definieren, werden die Argumente der Funktion, bevor Sie Sie verwenden.

#Camera_Get_Set.py
#By Forrest L. Erickson of VRX Company Inc. 8-31-12.
#Opens the camera and reads and reports the settings.
#Then tries to set for higher resolution.
#Workes with Logitech C525 for resolutions 960 by 720 and 1600 by 896


import cv2.cv as cv
import numpy

CV_CAP_PROP_POS_MSEC = 0
CV_CAP_PROP_POS_FRAMES = 1
CV_CAP_PROP_POS_AVI_RATIO = 2
CV_CAP_PROP_FRAME_WIDTH = 3
CV_CAP_PROP_FRAME_HEIGHT = 4
CV_CAP_PROP_FPS = 5
CV_CAP_PROP_POS_FOURCC = 6
CV_CAP_PROP_POS_FRAME_COUNT = 7
CV_CAP_PROP_BRIGHTNESS = 8
CV_CAP_PROP_CONTRAST = 9
CV_CAP_PROP_SATURATION = 10
CV_CAP_PROP_HUE = 11

CV_CAPTURE_PROPERTIES = tuple({
CV_CAP_PROP_POS_MSEC,
CV_CAP_PROP_POS_FRAMES,
CV_CAP_PROP_POS_AVI_RATIO,
CV_CAP_PROP_FRAME_WIDTH,
CV_CAP_PROP_FRAME_HEIGHT,
CV_CAP_PROP_FPS,
CV_CAP_PROP_POS_FOURCC,
CV_CAP_PROP_POS_FRAME_COUNT,
CV_CAP_PROP_BRIGHTNESS,
CV_CAP_PROP_CONTRAST,
CV_CAP_PROP_SATURATION,
CV_CAP_PROP_HUE})

CV_CAPTURE_PROPERTIES_NAMES = [
"CV_CAP_PROP_POS_MSEC",
"CV_CAP_PROP_POS_FRAMES",
"CV_CAP_PROP_POS_AVI_RATIO",
"CV_CAP_PROP_FRAME_WIDTH",
"CV_CAP_PROP_FRAME_HEIGHT",
"CV_CAP_PROP_FPS",
"CV_CAP_PROP_POS_FOURCC",
"CV_CAP_PROP_POS_FRAME_COUNT",
"CV_CAP_PROP_BRIGHTNESS",
"CV_CAP_PROP_CONTRAST",
"CV_CAP_PROP_SATURATION",
"CV_CAP_PROP_HUE"]


capture = cv.CaptureFromCAM(0)

print ("\nCamera properties before query of frame.")
for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)):
#    camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo]
    foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i])
    camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo]
#    print str(camera_values)
    print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo)


print ("\nOpen a window for display of image")
cv.NamedWindow("Camera", 1)
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("Camera", img)
    if cv.WaitKey(10) == 27:
        break
cv.DestroyWindow("Camera")


#cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1024)
#cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 768)
cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1600)
cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 896)


print ("\nCamera properties after query and display of frame.")
for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)):
#    camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo]
    foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i])
    camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo]
#    print str(camera_values)
    print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo)


print ("/nOpen a window for display of image")
cv.NamedWindow("Camera", 1)
while True:
    img = cv.QueryFrame(capture)
    cv.ShowImage("Camera", img)
    if cv.WaitKey(10) == 27:
        break
cv.DestroyWindow("Camera")

Ich bin mit debian und ubuntu, ich hatte das gleiche problem, ich konnte es nicht ändern, die Auflösung des video-Eingang verwenden CV_CAP_PROP_FRAME_WIDTH und CV_CAP_PROP_FRAME_HEIGHT

Ich stellte sich heraus, dass der Grund dafür war eine fehlende Bibliothek.Ich installierte lib4l-dev über synaptic, Generalüberholt OpenCV und das problem ist GELÖST!

Ich bin dieses posting, um sicherzustellen, dass niemand sonst verschwendet Zeit auf dieser setproperty Funktion.Ich verbrachte 2 Tage auf diesem zu sehen, nichts scheint zu funktionieren.Also grub ich den code den ich installiert hatte die Bibliothek das erste mal um).Dies ist, was tatsächlich passiert - cvSetCaptureProperty, ruft setProperty innerhalb CvCapture Klasse und lo-siehe setProperty tut nichts.Es ist einfach false zurück.Stattdessen werde ich abholen mit einer anderen Bibliothek zu füttern OpenCV-capture-video/Bilder.Ich bin mit OpenCV 2.2

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, WIDTH );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);

cvQueryFrame(capture);

Das wird nicht funktionieren mit OpenCV 2.2, aber wenn Sie OpenCV 2.1 es wird funktionieren !

Wenn Sie auf windows-Plattform, versuchen DirectShow (IAMStreamConfig).

http://msdn.microsoft.com/en-us/library/dd319784%28v=vs.85%29.aspx

Unter Windows versuchen, VideoInput Bibliothek:http://robocraft.ru/blog/computervision/420.html

Ich finde, dass in Windows (ab Win98 bis WinXP SP3), OpenCV verwenden oft Microsoft VFW-Bibliothek für Kamera-Zugriff.Das problem mit diesem ist, dass es ist oft sehr langsam (sagen wir max 15 FPS frame capture) und buggy (daher, warum cvSetCaptureProperty oft nicht funktioniert).Zum Glück können Sie in der Regel die Auflösung ändern in eine andere software (insbesondere "AMCAP", das ist ein demo-Programm, das leicht verfügbar ist), und es wird Wirkung die Auflösung, die OpenCV verwendet.Für Beispiel, Sie können führen Sie AMCAP aus, dass die Auflösung auf 640x480, und dann OpenCV verwenden, die standardmäßig von diesem Zeitpunkt an!

Aber wenn Sie können, verwenden Sie ein anderes Windows-Kamera Zugang Bibliothek wie die "videoInput" Bibliothek http://muonics.net/school/spring05/videoInput/ für den Zugriff auf die Kamera über sehr effiziente DirectShow (Bestandteil von DirectX).Oder wenn Sie haben eine professionelle Qualität Kamera, dann oft, es wird kommen mit einem custom API ermöglicht den Zugriff auf die Kamera, und Sie könnten, die für den schnellen Zugriff mit der Möglichkeit, die Auflösung ändern und viele andere Dinge.

Nur eine information, die nützlich sein kann für Menschen, die Schwierigkeiten haben, ändern Sie die Standard-capture-Auflösung (640 x 480) !Ich experimentierte selbst ein solches problem mit opencv 2.4.x-und einem Logitech-Kamera ...und fand einen workaround !

Das Verhalten habe ich erkannt, dass das Standard-format ist die Einrichtung als ersten Parameter, wenn die Kamera-Aufnahme gestartet wird (cvCreateCameraCapture), und alle Anforderung zum ändern der Höhe oder Breite :

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ... 

oder

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ...

sind dann nicht mehr möglich !Effektiv, entdeckte ich mit dem hinzufügen von return-Fehler von ioctl-Funktionen, die V4l2-Treiber Rückkehr EBUSY für thet Anfragen !Daher, eine Lösung sollte es sein, ändern Sie den Standardwert direkt in highgui/cap_v4l.cpp :

*#define DEFAULT_V4L_WIDTH  1280    // Originally 640* 

*#define DEFAULT_V4L_HEIGHT 720     // Originally 480*

Nach, dass, ich nur neu kompiliert opencv ...und angekommen zu bekommen, 1280 x 720, ohne jeglicher problem !Natürlich, ein besseres Update sollte das stoppen der Erwerb, die Parameter ändern und neu starten Strom nach, aber ich bin nicht genug vertraut mit opencv zu tun !

Hoffe es wird helfen.

Michel BEGEY

Versuchen Sie dies:

capture = cvCreateCameraCapture(-1);
//set resolution
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, frameWidth);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, frameHeight);
cvQueryFrame(capture);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size);

cvQueryFrame(capture);

sollte gerade genug sein!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top