2 dansouyong dansouyong 于 2016.04.21 22:48 提问

emgucv Caputre类在打开摄像头的情况下,关闭子窗口,会产生中断错误

这是子窗口关闭时,调用的代码


        private void VideoWnd_FormClosing(object sender, FormClosingEventArgs e)
        {
            capture.Pause();
            capture.Stop();
           for(int i=0;i<999999999;i++)
            {
                if (capture._grabState == Emgu.CV.Capture.GrabState.Stopped)
                    capture.Dispose();
            }

        }

修改Capture类的结构体,查看_grabState字段始终未stopping状态

下面为Capture类中线程运行代码

 private void Run()
        {
            try
            {
                while (_grabState == GrabState.Running || _grabState == GrabState.Pause)
                {
                    if (_grabState == GrabState.Pause)
                    {
                        _pauseEvent.WaitOne();
                    }
                    else if (IntPtr.Zero.Equals(_ptr) || !Grab())    
                    {
                        //capture has been released, or
                        //no more frames to grab, this is the end of the stream. 
                        //We should stop.
                        _grabState = GrabState.Stopping;
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception("Capture error", e);
            }
            finally
            {
                _grabState = GrabState.Stopped;
            }
        }

在子窗口中添加按钮,关闭摄像头能够正常工作。
在摄像头打开的情况下,直接点击关闭按钮,无论怎样都会产生catch错误,
错误为:引用已经释放的对象,ImageBox

1.理论上不是我在VideoWnd_FormClosing事件中调用了capture.stop()方法,线程不就应该调用finally中的代码么,但是直到for循环结束,线程都没有调用。不知道为什么

1个回答

devmiao
devmiao   Ds   Rxr 2016.04.21 22:49
dansouyong
dansouyong 我的摄像头能正常打开与工作,我是用子窗口打开的摄像头,此时关闭子窗口,摄像头线程就会报错
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于EMGU CV的那些事——2.摄像头捕捉(RGB and GRAY)
今天我们更进一步,来看看Emgu CV如何捕捉摄像头并显示视频。 思路很简单,Capture cap = new Capture()来开启一个新的摄像头,cap.Start()开始图像捕捉。利用cap.QueryFrame()得到一帧图像显示在窗口里或者控件里,利用while循环即可不断的获得视频帧。这里说明一下,若使用imshow函数将视频帧显示在窗口里,是不需要多线程的,用户不想得到视频帧时
Emgucv摄像头使用
Emgucv摄像头使用 1、引用 using Emgu.CV; using Emgu.CV.CvEnum; 2、引用变量 private VideoCapture _capture = null; private Mat _frame; 3、VideoCapture需要加载方法 private void ProcessFrame(object send
EmguCV的配置和获取摄像头画面
如遇到“Emgu.CV.MatInvoke”的类型初始值设定项引发异常报错 ,看这里http://blog.csdn.net/qq_22033759/article/details/47285653。 我用的是emgucv3.0.0版本,网上有好多教程是2.4的版本的,有一部分已经不再适用,3.0.0版本比之前的要方便得多。 先是添加引用,库文件所在目录为emgucv安装文件夹内的bin文件夹
c#_使用emgu3.0操作本地摄像头
c#_使用emgucv 3.0 操作本地摄像头首先我们要下载emgu3.0,安装包,[下载地址]http://www.emgu.com/wiki/index.php/Download_And_Installation安装完成以后,根据你要所开发的应用的平台,在安装目录的bin目录下选择x86或者x64 复制里面的四个dll文件 : cvextern.dll + msvcp120.dll + msvc
Windows10下C# 使用EmguCV3.2 读取本机摄像头
前面一篇文章详细介绍了如何在VS2013下配置EmguCV3.2。接下来,我们来编写代码进行摄像头的读取与显示。 先新建一个Windows窗体程序项目,配置好EmguCV,具体过程请参照前一篇博客。 在设计模式下,拖一个ImageBox到窗体上。 并拖一个按钮到窗体上,Name为startBtn,双击按钮,编写Click事件代码。具体代码如下: using System; using
EmguCV学习之例程详解(02):仅用5行代码实现的摄像头监视
准备工作与这篇文章相同
emgucv读取摄像头
emgucv读取摄像头
c#下使用EmguCV操作摄像头和最简单的人脸检测
c#下使用EmguCV操作摄像头和最简单的人脸检测 http://blog.csdn.net/a582127421/article/details/77745580
c# emgucv 获取外部摄像头(ip camera)
http://bbs.csdn.net/topics/390696239
emgu cv 读取摄像头图像
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; u