2016-06-21 189 views
0

我正在使用andriod應用程序(IP攝像頭)作爲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(...{}  
} 

一切工作正常。即使我關閉相機(關閉andriod應用程序),它會在控制檯中打印「相機關閉」。 當我在我的andriod設備上關閉wifi時發生問題。 現在我直接關掉wifi(應用程序仍在運行)線程凍結,即使它在try catch塊!

我在我的表單中有一個button_click事件,我打電話給它打電話cap.release();。 如果我點擊這個按鈕,然後,將顯示在Visual Studio(沒有來自OpenCV的錯誤)

HEAP [將Test.exe]跟隨錯誤:堆:在 67977d4修改自由堆塊6797780在被釋放後Windows有在 Test.exe中觸發了一個斷點。

這可能是由於堆損壞引起的,這表示 Test.exe或它已加載的任何DLL的錯誤。

這也可能是由於用戶在Test.exe具有焦點時按下F12。

輸出窗口可能有更多診斷信息。

有沒有人遇到過這個錯誤?
Visual Studio調試器停止在cap.release();

有沒有辦法解決這個問題?

感謝&問候

P.S:我使用Visual Studio 2013的OpenCV 3.0 [C++/CLI(的WinForms)]

更新: i的button_clickEvent加入thread->Abort();(替換cap.release();)。程序也崩潰了thread-> Abort(); 是否有更安全的方式來終止線程?
我認爲這是OpenCV中的一個錯誤,有沒有解決方法?

回答

0

你不應該做的呼叫cap.release(),它會被稱爲當的可視區域結束的第二次。 在閱讀之前檢查cap.isOpened()也會很好。

「thread-> Abort();」我想這是好的,另一種方式來阻止被設置靜態全局標誌來完成循環,如:

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

感謝您的寶貴答案theg4sh, 它仍然會崩潰,即使我刪除「cap.release() ;」請參閱上述問題中的**更新:**部分。謝謝 –