2013-04-18 3 views
19

OpenCV의 Logitech C920에서 비디오 스트림을 캡처하려고합니다. Labview를 사용하면 30fps 1080p의 MJPG 스트림에 액세스 할 수 있습니다. opencv에서는 5fps 또는 640x480으로 제한됩니다. 여기 openCV를 사용하여 logitech c920에서 30fps로 1080p 캡처 2.4.3

는 카메라 설정과 관련된 코드 :

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')); 

이 모두 반환 한, 그러나 나는 YUY2 스트림에 해당하는 1080p의의 5fps 스트림을 얻는다.

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

이 0 내가 640 × 480에 30 프레임 스트림을 얻을 반환
나는 다음 행을 추가합니다. 나에게 그것은 MJPG 설정이 받아 들여지지 않는 것처럼 보이지만 나는 무엇을 해야할지, 어떻게 고쳐야할지 모른다.

편집 : 다음 프로그램이 다운됩니다.

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; 

그런 다음 내 실행 코드에서 나는 다음과 같습니다

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 : 해결 방법은 카메라의 높이와 폭을 설정하기 전에 FOURCC 코덱을 설정하는 것입니다.

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 

을하고 MJPG을 설정하지 않고 작동 여부를 확인 :

+0

, 당신은 코덱 설정 한 후 그것을 할 필요가 있지만, 폭 이전/높이 설정 – MartinM

+1

EDIT2와 같은 사운드는 30fps에서 1080p를 제공했습니다. 대답으로 바뀌고 받아 들여 져야 문제가 해결 된 것처럼 보입니다. –

답변

1

아무것도 설정하기 전에 캡처에서 첫 번째 프레임을 가져보십시오. 작동한다면 MJPG를 사용해보십시오.

제게 뭔가 설정하기 전에 첫 번째 프레임을 가져와야한다는 것이 약간 이상하지만, 그것이 나를 위해 일하는 유일한 방법입니다 (Windows 7 32 비트).



// 편집 :
요 다른 API를 사용하려고 할 수 있습니다 - 여기 내 대답의 두 번째 부분을 참조하십시오하지만 어쩌면에서, https://stackoverflow.com/a/14188280/1598485 OpenCV의 기본으로 최고의 API를 사용하려고하는 당신 일부 다른 API가 더 잘 작동합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 당신이 말한 것을 시도했고 이미지를 표시하기 전에 코드가 망가졌습니다. cap.read는 1을 반환하고 카메라에서 다시 읽으려고 할 때 충돌합니다. –

+0

어떤 행에 있습니까? 이 줄이 표시된 코드를 보여주십시오. – cyriel

+0

요청한 코드를 보여주기 위해 원래 질문을 업데이트했습니다. –

6

게시물의 작성자가 이미 해결책을 찾았으나 답변을 추가하지 않았으므로 해결책을 제시 할 것입니다.

당신은 당신이 원하는 해상도를 설정하기 전에 코덱을 설정해야합니다 : 당신이 (카메라에서 지원해야 함) FPS를 설정하려면

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

감사! 그것은 명시된대로 일했습니다!반면에 이것이 fullHD @ 30 해상도를 허용 할지라도 이미지 품질은 매우 열악 할 수 있습니다 (압축 속도는 USB 2.0의 대역폭 제한을 충족시키기 위해 높아야 함) – cbuchart

관련 문제