最近在做一个有关人脸识别的项目 . 读取摄像头的视频 是用 emgucv , 我想用picturebox 来显示摄像头的视频, 我是 用一个死循环, 截取画面,然后赋值给picturebox . 这样是 可以显示出摄像头的内容了,但是运行一会儿程序就会报错,说写入受保护的内存,网上查了下, 好像是说 picturebox.image = Bitmap ; 的时候,有个 画笔的资源没有释放,这样导致的错误.我对这块不是很明白,谁能给我解释下,这个要怎么去释放. 下面放上部分代码
private void start() { cp = new Capture(0); cp.Start(); //开启默认摄像头 th = new Thread(zs); // 创建线程,用于循环截取摄像头画面,给picturebox th.IsBackground = true; th.Start(); } private void zs() { z s = delegate() { try { Mat m = cp.QueryFrame(); //获取截图 pictureBox2.Image = m.Bitmap; //赋值,展示 } catch (Exception e) { pictureBox2.Image = null; // MessageBox.Show(e.Message); } }; while (bl) { try { Thread.Sleep(1); this.Invoke(s); } catch (Exception e) { // MessageBox.Show(e.Message); } } }
你这样是治标不治本,一:你购买的摄像头如果有相关的sdk就最好了,会自带显示控件或者用panle做显示控件,如果没有的话也有通用的取像的dll,但不管哪样好像都不是放在picture里的吧
是有对应的控件,但是我连接的什么样的摄像头都有....我想用同一个控件兼容有所的摄像头
@百鸟朝凤: AForge.NET 用这个通用的
@jqw2009: 还有海康和大有的网络摄像头....
Finally 里加个释放试试
释放bitmap?如果释放的话,我还需要他显示呢...释放了就显示不了画面了