Opencv IP Camera Error

时间:2016-06-21 08:40:19

标签: c++ winforms visual-studio opencv c++-cli

我正在使用andriod app(IP网络摄像头)作为ip camera。 我在单独的线程中运行代码。因为如果我在主线程中运行它会导致程序崩溃。

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应用程序),它打印&#34;相机关闭&#34;在控制台中。 当我在我的andriod设备上关闭wifi时会出现问题。 我直接关闭wifi(让应用程序仍然运行)线程冻结的那一刻,即使它在try catch块!

我的表单中有一个button_click事件,我在其中调用了cap.release();。 如果我单击此按钮,则会在visual studio中显示以下错误(opencv没有错误)

  

HEAP [Test.exe]:HEAP:免费堆块6797780修改为   它被释放后67977d4触发了一个断点   TEST.EXE。

     

这可能是由于堆的损坏,这表明存在错误   Test.exe或它加载的任何DLL。

     

这也可能是由于用户在Test.exe具有焦点时按下F12。

     

输出窗口可能包含更多诊断信息。

是否有人遇到此错误?
Visual Studio调试器在cap.release();行停止。
有没有办法克服这个问题?

谢谢&amp;问候

P.S:我使用Visual Studio 2013和opencv 3.0 [C ++ / Cli(winforms)]

更新:我在button_clickEvent中添加了thread->Abort();(替换cap.release();)。程序也崩溃了thread-&gt; Abort(); 是否有更安全的方式来终止线程?
我认为这是OpenCV中的一个错误,有没有解决方法?

1 个答案:

答案 0 :(得分:0)

你不应该打电话 cap.release(),当 cap 的可见区域结束时,它将第二次被调用。 在阅读之前检查 cap.isOpened()也很棒。

“thread-&GT;中止();”我想这没关系,另一种停止方法是设置静态全局标志来完成循环,如:

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