/// <summary> /// 图像采集函数 ,线程 /// </summary> private void ShowThread() { while (true) { if (frameList.Count == 0) { Thread.Sleep(10); continue; } /* 图像队列取最新帧 */ mutex.WaitOne(); IGrabbedRawData frame = frameList.ElementAt(frameList.Count - 1); frameList.Clear(); mutex.ReleaseMutex(); /* 主动调用回收垃圾 */ GC.Collect(); /* 控制显示最高帧率为25FPS */ if (false == IsTimeToDisplay()) { continue; } try { /* 图像转码成bitmap图像 */ var bitmap = frame.ToBitmap(false); HObject image = BitmapToHImage(bitmap); OnImageAcqed(image);//触发事件 try { image.Dispose(); image = null; } catch { } try { bitmap.Dispose(); bitmap = null; } catch { } } catch (Exception exception) { Catcher.Show(exception); /* MessageBox.Show("Dahua:系统异常"); * Environment.Exit(0);*/ } } }
private void ShowThread() // 开启线程采集 { try { while (m_bShowLoop) { if (m_frameList.Count == 0) { Thread.Sleep(10); continue; } /* 图像队列取最新帧 */ m_mutex.WaitOne(); IGrabbedRawData frame = m_frameList.ElementAt(m_frameList.Count - 1); m_frameList.Clear(); m_mutex.ReleaseMutex(); /* 主动调用回收垃圾 */ GC.Collect(); /* 控制显示最高帧率为25FPS */ if (false == isTimeToDisplay()) { continue; } try { /* 图像转码成bitmap图像 */ var bitmap = frame.ToBitmap(false); // Bitmap bit = bitmap.Clone(); m_bShowByGDI = true; if (m_bShowByGDI) { HImage himage = BitmapToHImage(bitmap); /// 添加事件通过绑定事件的方式进行图像传播 DoSomething(bitmap, himage); } } catch (Exception exception) { Catcher.Show(exception); } } } catch (Exception) { throw; } }
/// <summary> /// 码流捕获函数 /// </summary> /// <param name="sender">事件投递方</param> /// <param name="e">码流事件参数</param> private void OnImageGrabbing(object sender, IGrabbedEventArg e) { // 停止采集 if (Interlocked.Read(ref _bCollection) == 0) { return; } // 更新样本数据,通知算法线程 if (Interlocked.CompareExchange(ref _bAlgorithmRunning, 1, 0) == 0) { _FrameData = null; _FrameData = e.GrabResult; _DetectBarCodeEvent.Set(); } }
/* 转码显示线程 */ private void ShowThread() { while (m_bShowLoop) { if (m_frameList.Count == 0) { Thread.Sleep(10); continue; } /* 图像队列取最新帧 */ m_mutex.WaitOne(); IGrabbedRawData frame = m_frameList.ElementAt(m_frameList.Count - 1); m_frameList.Clear(); m_mutex.ReleaseMutex(); /* 主动调用回收垃圾 */ GC.Collect(); /* 控制显示最高帧率为25FPS */ if (false == isTimeToDisplay()) { continue; } try { /* 图像转码成bitmap图像 */ bitmap = frame.ToBitmap(false); m_bShowByGDI = true; if (m_bShowByGDI) { /* 使用GDI绘图 */ if (_g == null) { _g = pbImage.CreateGraphics(); } _g.DrawImage(bitmap, new Rectangle(0, 0, pbImage.Width, pbImage.Height), new Rectangle(0, 0, bitmap.Width, bitmap.Height), GraphicsUnit.Pixel); if (bitmap != null) { imgOri = bitmap; } // bitmap.Save(strSavePath + strFileName); // bitmap.Dispose(); } else { /* 使用控件绘图,会造成主界面卡顿 */ if (InvokeRequired) { BeginInvoke(new MethodInvoker(() => { try { pbImage.Image = bitmap; } // save captured image // bitmap.Save("C:\\Users\\rocki\\Desktop\\captured\\shot.jpg"); catch (Exception exception) { Catcher.Show(exception); } })); } } } catch (Exception exception) { Catcher.Show(exception); } } }
private void LocalImageGrabbing() { List <Bitmap> bitmapList = new List <Bitmap>(); LocalFrameData bitmapData; System.Drawing.Imaging.BitmapData bmpData; try { if (MvBarCode.MvBarCodeGlobalVar.LocalImagePath == string.Empty) { Console.WriteLine("没有本地目录"); return; } string imgType = "*.bmp|*.png|*.jpg"; string[] ImgType = imgType.Split('|'); List <string> Dirs = new List <string>(); for (int i = 0; i < ImgType.Length; i++) { Dirs.AddRange(Directory.GetFiles(string.Format(MvBarCode.MvBarCodeGlobalVar.LocalImagePath), ImgType[i])); } //_FrameData //string[] dirs = Directory.GetFiles(); foreach (var d in Dirs) { Bitmap img = new Bitmap(d); bitmapList.Add(img); } foreach (var b in bitmapList) { Thread.Sleep(1000); if (Interlocked.CompareExchange(ref _bAlgorithmRunning, 1, 0) == 0) { Rectangle rect = new Rectangle(0, 0, b.Width, b.Height); bmpData = b.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, b.PixelFormat); bitmapData = new LocalFrameData(b.Width, b.Height, b, bmpData.Scan0); b.UnlockBits(bmpData); _FrameData = bitmapData; _DetectBarCodeEvent.Set(); } } Thread.Sleep(3000); foreach (var b in bitmapList) { //b.Dispose(); } } catch (Exception e) { MvBarCode.MvBarCodeGlobalVar.Log.Error(e); } }