2013-04-18 13 views
19

Próbuję uchwycić strumień wideo z mojego Logitech C920 w OpenCV. Dzięki Labview mogę uzyskać dostęp do strumienia MJPG z prędkością 30 fps 1080p. W opencv jestem ograniczony do 5fps lub 640x480.Przechwytywanie 1080p przy 30 fps z logitech c920 z openCV 2.4.3

Oto odpowiedni kod do ustawień kamery:

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 

Te wszystkie powrót 1, jeszcze mam strumienia 5fps 1080p, która odpowiada strumienia YUY2.
Jeśli dodać następujący wiersz:

this->camRef.set(CV_CAP_PROP_FPS, 30); 

to zwraca 0. uzyskać strumień 30 fps przy 640x480. Dla mnie wygląda na to, że ustawienie MJPG nie jest akceptowane, ale nie wiem, co zrobić i jak to naprawić.

EDYCJA: Następujące awarie powodują awarię programu.

this->camRef.read(this->image); 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)   << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)  << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl; 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 

Wtedy w moim kodu run mam następujące:

void camera::run() 
{ 
    while(true) 
    { 
     if(this->camRef.read(this->image) == 0) 
     { 
      if(this->capture) 
      { 
       cv::imwrite(fileName,this->image); 
       this->count++; 
      } 
     } 
     msleep(15); 
    } 
} 

EDIT2: Rozwiązanie jest ustawiony kodek FourCC przed ustawieniem kamery wysokość i szerokość.

+0

jeśli chcesz ustawić fps (musi być obsługiwany przez kamerę), trzeba to zrobić po kodeka ustawienie, ale przed szerokość/ustawienia wysokości – MartinM

+1

Wygląda na to, że EDIT2 dało 1080p przy 30 klatkach na sekundę. Powinien zostać przekształcony w odpowiedź i zaakceptowany, aby problem został rozwiązany. –

Odpowiedz

1

Postaraj się, aby pierwszą klatkę z wychwytywanie przed ustawieniem nic:

VideoCapture cap(0); 
if(!cap.isOpened()) 
return -1; 

Mat frame; 
cap >> frame; 
double fps; 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0); 
//add the loop here 

i sprawdzić, czy to będzie działać bez ustawiania MJPG. Jeśli to zadziała, spróbuj z MJPG.

Dla mnie to trochę dziwne, że musisz ustawić pierwszą klatkę przed ustawieniem czegokolwiek, ale jest to jedyny sposób, w jaki działa dla mnie (Windows 7 32bit).



// edit:
Yo może spróbować użyć innego API - zobacz drugą część mojej odpowiedzi tutaj: https://stackoverflow.com/a/14188280/1598485 OpenCV stara się korzystać z najlepszych API domyślnie, ale być może w swojej W przypadku niektórych innych API będzie działać lepiej.

+0

Dziękuję za odpowiedź. Próbowałem, co powiedziałeś, a teraz mój kod ulega awarii przed wyświetleniem obrazu. cap.read zwraca 1, a następnie ulega awarii, gdy próbuje ponownie odczytać z aparatu. –

+0

W której linii? Proszę pokazać swój kod z zaznaczoną linią. – cyriel

+0

Zaktualizowałem oryginalne pytanie, aby wyświetlić żądany kod. –

6

Jako że autor postu znalazł rozwiązanie, ale nie dodałem go jako odpowiedzi, przedstawię tutaj rozwiązanie.

Musisz ustawić kodek, zanim ustawić żądaną rozdzielczość:

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
+0

Dzięki! Działało jak stwierdzono!Z drugiej strony, chciałbym wspomnieć, że chociaż pozwoli to na rozdzielczość fullHD @ 30, jakość obrazu może być bardzo niska (stopień kompresji musi być wysoki, aby sprostać ograniczeniom przepustowości USB 2.0) – cbuchart

Powiązane problemy