2016-06-21 158 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() ;”请参阅上述问题中的**更新:**部分。谢谢 –