Zwiększenie rozdzielczości przechwytywania kamery w OpenCV

W moim programie C/C++, używam OpenCV do przechwytywania obrazów z mojej kamery internetowej. Kamera (Logitech QuickCam IM ) może rejestrować w rozdzielczości 320x240, 640x480 i 1280x960 . Ale z jakiegoś dziwnego powodu OpenCV daje mi tylko obrazy o rozdzielczości 320x240 . Wywołania zmiany rozdzielczości za pomocą cvsetcaptureproperty() z innymi wartościami rozdzielczości po prostu nie działają. Jak przechwytywać obrazy w innych możliwych rozdzielczościach za pomocą mojego Kamera internetowa?

Author: Mark Biek, 2008-08-18

15 answers

Używam openCV 1. 1pre1 pod Windows (biblioteka videoinput jest domyślnie używana przez tę wersję openCv pod windows).

Za pomocą tych instrukcji mogę ustawić rozdzielczość kamery. Zauważ, że nazywam Stary cvCreateCameraCapture zamiast cvCaptureFromCam.
capture = cvCreateCameraCapture(cameraIndex);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );


videoFrame = cvQueryFrame(capture);

Przetestowałem go z Logitech, Trust I Philips webcams

 42
Author: Grifo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-01 15:41:28

Wydaje się, że nie ma rozwiązania. Rozdzielczość może być zwiększona do 640x480 za pomocą tego hacka udostępnionego przezlifebelt77 . Oto szczegóły reprodukowane:

Dodaj do 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

Dodaj funkcję icvSetPropertyCAM_VFW do 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;
}

I edytuj captureCAM_VFW_vtable w następujący sposób:

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

Teraz odbudowany highgui.dll .

 16
Author: Ashwin Nanjappa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-18 07:46:15

Robiłem już wcześniej przetwarzanie obrazu w Linuksie i pominąłem wbudowaną w OpenCV funkcjonalność kamery, ponieważ jest (jak się okazało) niekompletna.

W zależności od Twojego systemu operacyjnego możesz mieć więcej szczęścia przechodząc bezpośrednio do sprzętu przez normalne kanały, w przeciwieństwie do OpenCV. Jeśli używasz Linuksa, video4linux lub video4linux2 powinny dać ci stosunkowo banalny dostęp do kamer internetowych USB i możesz użyć libavc1394 dla firewire. W zależności od urządzenia i jakości przykładowego kodu obserwujesz, powinieneś być w stanie uruchomić urządzenie z żądanymi parametrami w ciągu godziny lub dwóch.

Edited to add: you are on your own if its Windows. Wyobrażam sobie, że to nie jest dużo trudniejsze, ale nigdy tego nie robiłem.

 5
Author: Louis Brandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-19 00:20:02

Zdecydowanie sugeruję użycie VideoInput lib, obsługuje każde urządzenie DirectShow (nawet wiele urządzeń jednocześnie) i jest bardziej konfigurowalne. Poświęcisz pięć minut na zabawę z OpenCV.

 5
Author: martjno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-01 17:15:00

Zobacz ten bilet: https://code.ros.org/trac/opencv/ticket/376

" rozwiązaniem jest użycie nowszego wrappera opartego na libv4l.

  1. Zainstaluj libv4l-dev (tak to się nazywa w Ubuntu)

  2. Po ponownym uruchomieniu cmake zobaczysz "V4L/ V4L2: Using libv4l"

  3. Powtórz. teraz rozdzielczość może zostać zmieniona. testowane z wbudowanym isight na MBP."

To naprawiło to dla mnie używając Ubuntu i może równie dobrze działać dla Ciebie.

 5
Author: Yo-L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 10:33:09

Kod w końcu zacząłem pracować w Pythonie, gdy Aaron Haun zauważył, że muszę zdefiniować argumenty funkcji set przed ich użyciem.

#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")
 5
Author: Forrest Erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-03 20:26:00

Używam Debiana i ubuntu, miałem ten sam problem, nie mogłem zmienić rozdzielczości wejścia wideo używając cv_cap_prop_frame_width i CV_CAP_PROP_FRAME_HEIGHT

Okazało się, że powodem była zaginiona biblioteka. Zainstalowałem lib4l-dev przez synaptic, przebudowałem OpenCV i problem rozwiązany!

 4
Author: evangelos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-28 10:06:45

Zamieszczam to, aby upewnić się, że nikt inny nie marnuje czasu na tę funkcję setproperty. Spędziłem nad tym 2 dni, żeby zobaczyć, że nic nie działa. Więc wykopałem kod (za pierwszym razem zainstalowałem bibliotekę). Tak właśnie się dzieje-cvsetcaptureproperty, wywołuje setProperty wewnątrz klasy CvCapture i lo, SetProperty nic nie robi. Po prostu zwraca false. Zamiast tego odbiorę za pomocą innej biblioteki do podawania OpenCV przechwytywania wideo / obrazów. Używam OpenCV 2.2

 2
Author: CyraX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-01 15:16:52

CvSetCaptureProperty (capture, cv_cap_prop_frame_width, WIDTH);

CvSetCaptureProperty (capture, cv_cap_prop_frame_height, HEIGHT);

CvQueryFrame (capture);

To nie będzie działać z OpenCV 2.2, ale jeśli używasz OpenCV 2.1 będzie działać dobrze !

 0
Author: William,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 09:52:00

Jeśli jesteś na platformie windows, spróbuj DirectShow (Iamstreamconfig).

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

 0
Author: plan9assembler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-12 09:56:29

Pod Windows spróbuj użyć biblioteki VideoInput: http://robocraft.ru/blog/computervision/420.html

 0
Author: noonv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-25 12:15:49

Uważam, że w Windows (od Win98 do WinXP SP3), OpenCV często używa biblioteki VFW Microsoftu do dostępu do kamery. Problem z tym polega na tym, że często jest bardzo powolny (powiedzmy maksymalnie 15 fps przechwytywania klatek) i buggy (stąd dlaczego cvsetcaptureproperty często nie działa). Na szczęście zazwyczaj możesz zmienić rozdzielczość w innym oprogramowaniu (szczególnie "AMCAP", który jest łatwo dostępnym programem demonstracyjnym) i wpłynie to na rozdzielczość, której będzie używał OpenCV. Na przykład możesz uruchomić AMCAP aby ustawić rozdzielczość na 640x480, a następnie OpenCV będzie używać tego domyślnie od tego momentu!

Ale jeśli możesz użyć innej biblioteki dostępu do kamery Windows, takiej jak biblioteka "videoInput" http://muonics.net/school/spring05/videoInput / , który uzyskuje dostęp do kamery za pomocą bardzo wydajnego DirectShow (część DirectX). Lub jeśli masz profesjonalną kamerę, często będzie ona dostarczana z niestandardowym interfejsem API, który umożliwia dostęp do kamery i można go użyć do szybkiego dostępu z możliwością zmiany rozdzielczości i wielu innych rzeczy.

 0
Author: Shervin Emami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 07:00:52

Tylko jedna informacja, która może być cenna dla osób mających trudności ze zmianą domyślnej rozdzielczości przechwytywania (640 x 480) ! Sam eksperymentowałem z takim problemem z opencv 2.4.x i jedną kamerę Logitech ... i znalazłem jedno obejście !

Zachowanie, które wykryłem, polega na tym, że domyślny format jest ustawiany jako początkowe parametry po uruchomieniu przechwytywania kamery( cvCreateCameraCapture) i wszystkie żądania zmiany wysokości lub szerokości:

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ... 

Lub

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ...

Nie są możliwe potem ! Skutecznie odkryłem, dodając błąd powrotu funkcji ioctl, że sterownik V4L2 zwraca EBUSY dla żądań thet ! Dlatego jednym obejściem powinna być zmiana wartości domyślnej bezpośrednio w highgui/cap_v4l.cpp :

*#define DEFAULT_V4L_WIDTH  1280    // Originally 640* 

*#define DEFAULT_V4L_HEIGHT 720     // Originally 480*

Po tym, właśnie rekompilowałem opencv ... i przybył, aby uzyskać 1280 x 720 bez żadnego problemu ! Oczywiście lepszą poprawką powinno być zatrzymanie akwizycji, zmiana parametrów i ponowne uruchomienie strumienia po, ale nie jestem dość znajomości opencv, aby to zrobić !

Mam nadzieję, że to pomoże. Michel BEGEY]}
 0
Author: user2833455,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 14:19:40

Spróbuj tego:

capture = cvCreateCameraCapture(-1);
//set resolution
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, frameWidth);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, frameHeight);
 -1
Author: fantom1210,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-05 21:24:47
cvQueryFrame(capture);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size);

cvQueryFrame(capture);
Powinno wystarczyć!
 -3
Author: mg72,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-23 21:21:40