2016-06-21 9 views
0

IP 카메라로 andriod 앱 (IP 웹캠)을 사용하고 있습니다. 코드 아래에서 별도의 스레드로 실행하고 있습니다. 왜냐하면 내가 메인 스레드에서 실행되면 프로그램이 충돌하기 때문이다.OpenCv IP 카메라 오류

VideoCapture cap; Mat img; 
cap.open("http://192.168.0.101:8080/video?x.mjpeg"); 
while(waitKey(33)!=27) 
{ 
    try{ 
     cap>>img; 
     cout<<"Thread active"<<endl; 
     if(img.empty()) 
     { 
     cout<<"camera Closed"<<endl; 
     break; 
     } 
     imshow("Video",img); 
     } catch(...{}  
} 

모두 정상적으로 작동합니다. 카메라를 꺼도 (close andriod app) 콘솔에서 "카메라가 닫혔습니다"라는 내용이 인쇄됩니다. andriod 장치에서 wifi를 끄면 문제가 발생합니다. wifi를 직접 끄는 순간 (앱을 계속 실행하는 중) 스레드가 멈추어도 try catch 블록에 있습니다.

나는 내 양식에 button_click 이벤트가 있고 그 안에 cap.release();을 호출하고 있습니다. HEAP : 67977d4에서 수정 무료 힙 블록 6,797,780이 해제 된 후 Windows가 난 후이 버튼을 클릭하면 은 다음과 오류는 비주얼 스튜디오 (OpenCV의에서 오류없이)

HEAP [Test.exe라는]이 표시됩니다 Test.exe에서 중단 점을 트리거했습니다.

Test.exe 또는로드 한 DLL에 버그가 있음을 나타내는 힙이 손상되었을 수 있습니다.

이것은 Test.exe에 포커스가있는 동안 사용자가 F12 키를 누르기 때문일 수도 있습니다.

출력 창이 더 많은 진단 정보를 가지고있을 수 있습니다.

아무도이 오류를 발견하지 못 했습니까?
Visual Studio 디버거가 cap.release();에서 멈 춥니 다

이 문제를 해결할 수있는 방법이 있습니까?

감사 & 감사

P.S : 내가 OpenCV의 3.0 비주얼 스튜디오 2013을 사용하고 있습니다 [C++/CLI (윈폼)]

업데이트 :은 내가 (cap.release(); 교체) button_clickEvent에 thread->Abort();을 추가했다. 또한 프로그램은 쓰레드 -> 중단(); 스레드를 종료하는 안전한 방법이 있습니까?
이것이 OpenCV의 버그라고 생각합니다. 해결 방법이 있습니까?

답변

0

통화 cap.release()을하지 말아야, 그것은 의 가시 영역이 종료 두 번째로 호출됩니다. 읽기 전에 cap.isOpened()을 확인하는 것도 좋습니다.

"thread-> Abort();" 내가 괜찮아 가정을 중지하는 또 다른 방법은 같은 루프를 완료 정적 전역 플래그를 설정 : 아직도 내가 'cap.release를 제거 할 경우에도 충돌합니다, 여러분의 소중한 응답 theg4sh에 대한 을

static char doCapThread = 1; 
... 
    while((waitKey(33)!=27) && doCapThread) { 
+0

감사합니다() ; ' 위의 질문에서 ** 업데이트 : ** 섹션을 참조하십시오. 감사 –