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-&gt;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 摄像机错误的主要内容,如果未能解决你的问题,请参考以下文章

Opencv IP 摄像机错误

OpenCV 无法流式传输 IP 摄像机

通过opencv和c ++从ip摄像头流式传输视频

带有 IP 摄像机的 OpenCV 问题

使用 OpenCv 和多线程从 IP 摄像机提供实时视频

OpenCV cv2.VideoCapture() 停止读取 RTSP IP 摄像机