2014-09-29 2 views
3

opencv 라이브러리를 사용하여 기본 제공 웹캠에서 비디오를 가져옵니다. 다음 코드는 카메라 로직 코드를 메인 함수에 넣을 때 완벽하게 작동하지만 별도의 스레드에 넣을 때는 그렇지 않습니다. task1() 스레드는 cv::VideoCapture capture(0)에서 멈 춥니 다. 한편 task2()과 주 스레드가 모두 올바르게 실행되고 있습니다.스레드에서 카메라 이미지 가져 오기

누군가 내가 왜 opencv 논리가 별도의 스레드에 넣을 때 작동하지 않는지 설명 할 수 있습니까?

내 코드 :

#include <iostream> 
#include <string.h> 
#include <thread> 
#include <unistd.h> 
#include <opencv2/opencv.hpp> 

using namespace std; 

void task1(){ 
      cout<<"1st thread "; 
      cv::Mat frame; 
      cv::VideoCapture capture(0); 
      if (capture.isOpened() == false) 
      { 
       cout<<"Failed to open camera"; 
      } 

      cv::namedWindow("Test OpenCV",1); 


      while (true){ 
       capture >> frame; 
       cv::imshow("Test OpenCV", frame); 
       int key = cv::waitKey(1); 
       if (key == 27) 
        break; 
      } 

     } 

     void task2(){ 
      int n = 0; 
      while (1){ 
       cout<<"2nd thread "<<n<<"\n"; 
       sleep(3); 
       n++; 
      } 
     } 

     int main(int argc, const char * argv[]) { 
      // insert code here... 
      cout << "Hello, World!\n"; 
      thread t1(task1); 
      thread t2(task2); 
      //t1.join(); 
      //t2.join(); 
      int n = 0; 
      while (1){ 
       cout<<"main thread "<<n<<"\n"; 
       sleep(1); 
       n++; 
      } 
      return 0; 
     } 
+0

스레드가 실행될 기회가없는 것처럼 보입니다. – Ashalynd

+0

몇 년 전 Qt와 OpenCV에서 같은 문제가있었습니다. 확실하지는 않지만 C 메소드를 사용했다고 생각합니다. CvCapture * cvCaptureFromCAM (int 디바이스). – riv333

+0

@Ashalynd 확실히 실행됩니다. 내가 breakpoints와 cout을 두 번 체크했다 – grzebyk

답변

1

귀하의 코드는 나를 위해 (수정없이)해야 내가 (OpenCV의 2.4.5을 사용) 작업 1 스레드를 통해 라이브 피드를 얻을로 실행됩니다. 컴파일러 지원을 위해 -std=gnu++0x 플래그를 추가했습니다. 그렇지 않으면 g ++에서 오류가 발생합니다.

g++ -std=gnu++0x opencv_thread.cpp -o opencv_thread `pkg-config --cflags --libs opencv` 

내 콘솔 출력을 확인하십시오. here. 나는 task1의 while 루프 안에 cout << "1st thread "<< endl;을 추가했다.

이전 버전 (비슷한 것을 기억하지 못함)에서 유사한 문제를 보았을 때 문제가 일부 opencv 버전에만 해당 될 수 있다고 생각합니다. 사용한 버전에 대한 세부 정보를 제공 할 수 있습니까? 또한 2.4.5를 사용해보십시오.

+0

나는 Mac OS X 10.9와 Xcode 6에서 OpenCV 2.4.9를 사용하고있다. – grzebyk

+0

나는 리눅스를 사용하고 있는데 osx :(하지만 동료는 2.4.9를 사용하지 말 것을 권고했다. 비슷한 문제가있다. 리눅스를 사용해 본다면 리눅스를 사용해 볼 수 있습니다.) 2.4.5를 시도해 볼 수 있습니까? – Vasanth

+0

프로젝트를 재구성하여이 문제를 극복했습니다 -> 메인 스레드에 opencv 로직을 넣고 나머지는 사이드 커브에 넣습니다. 어쨌든, opencv 문제인지 또는 다른 것이 있는지 확인하기 위해 며칠간 2.4.5를 시도 할 것입니다. – grzebyk

관련 문제