Opencv IP 摄像机错误
Posted
技术标签:
【中文标题】Opencv IP 摄像机错误【英文标题】:Opencv IP Camera Error 【发布时间】:2016-06-21 08:40:19 【问题描述】:我正在使用安卓应用(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(...
一切正常。即使我关闭相机(关闭安卓应用程序),它也会在控制台中打印“相机关闭”。 当我在我的安卓设备上关闭 wifi 时会出现问题。 在我直接关闭 wifi 的那一刻(应用程序仍在运行)线程冻结,即使它在 try catch 块中!
我的表单中有一个 button_click 事件,我在其中调用cap.release();
。
如果我单击此按钮,则在 Visual Studio 中显示以下错误(opencv 没有错误)
HEAP[Test.exe]:HEAP:空闲堆块 6797780 修改于 67977d4 被释放后 Windows 已触发断点 测试.exe。
这可能是由于堆损坏,这表明存在错误 Test.exe 或它已加载的任何 DLL。
这也可能是由于用户在 Test.exe 获得焦点时按 F12。
输出窗口可能有更多的诊断信息。
有人遇到过这个错误吗?
Visual Studio 调试器停止在 cap.release();
行
有没有办法克服这个问题?
感谢和问候 P.S:我正在使用 Visual Studio 2013 和 opencv 3.0 [C++/Cli (winforms)]
更新: 我在 button_clickEvent 中添加了thread->Abort();
(替换了cap.release();
)。程序也因 thread->Abort() 而崩溃;
有没有更安全的方法来终止线程?
我认为这是 OpenCV 中的一个错误,是否有解决方法?
【问题讨论】:
【参考方案1】:你不应该调用 cap.release(),它会在 cap 的可见区域结束时第二次调用。 在阅读之前检查 cap.isOpened() 也很棒。
"线程->Abort();"我想没关系,另一种停止方法是设置静态全局标志来完成循环,例如:
static char doCapThread = 1;
...
while((waitKey(33)!=27) && doCapThread)
【讨论】:
感谢您宝贵的回答 theg4sh,即使我删除 'cap.release();' 它仍然会崩溃请参阅上述问题中的 Update: 部分。谢谢以上是关于Opencv IP 摄像机错误的主要内容,如果未能解决你的问题,请参考以下文章