我正在使用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中的一个错误,有没有解决方法?
答案 0 :(得分:0)
你不应该打电话 cap.release(),当 cap 的可见区域结束时,它将第二次被调用。 在阅读之前检查 cap.isOpened()也很棒。
“thread-&GT;中止();”我想这没关系,另一种停止方法是设置静态全局标志来完成循环,如:
static char doCapThread = 1;
...
while((waitKey(33)!=27) && doCapThread) {