• Emgu.CV摄像头通用操作类


      1  class CameraHelper
      2     {
      3         /// <summary>
      4         /// 连接摄像头数量
      5         /// </summary>
      6         public static int cameraCount = 0;
      7         /// <summary>
      8         /// 当前选择的摄像头Id
      9         /// </summary>
     10         public static int cameraId = 0;
     11         /// <summary>
     12         /// 摄像头对象
     13         /// </summary>
     14         public static VideoCapture _cameraCapture;
     15         public static bool _captureInProgress = false;
     16         public static  Mat _frame;
     17         public static Image<Bgr, byte> imgSource = null;
     18         public static Image<Bgr, byte> imgClone = null;
     19         /// <summary>
     20         /// 视频展示PictureBox句柄
     21         /// </summary>
     22         public static PictureBox picCapture;
     23         /// <summary>
     24         /// 打开摄像头
     25         /// </summary>
     26         /// <param name="width"></param>
     27         /// <param name="height"></param>
     28         /// <param name="a"></param>
     29         public static void OpenUSBCarmer(double width, double height,int a=0)
     30         {
     31             try
     32             {
     33                 if (_cameraCapture != null)
     34                 {
     35                     _cameraCapture.Stop();
     36                     _cameraCapture.Dispose();
     37                 }
     38                 _cameraCapture = returnCapture( width,  height,a);
     39                 //usb
     40                 _cameraCapture.ImageGrabbed += ProcessMainFrame;
     41 
     42                 //_cameraCapture = new VideoCapture(Common.GetAppConfig("url"));
     43                 //capture_tick.Start();
     44                 _cameraCapture.Start();
     45                 _captureInProgress = true;
     46             }
     47             catch (Exception ex)
     48             {
     49                 Log.WriteLog(new StackTrace(new StackFrame(true)), ex.Message);
     50             }
     51         }
     52         /// <summary>
     53         /// 连接摄像头,设置摄像头参数,并返回摄像头对象
     54         /// </summary>
     55         /// <param name="a">usb摄像头的话,可设置index=a</param>
     56         /// <returns>摄像头对象</returns>
     57         public static VideoCapture returnCapture( double width,double height, int a = 0)
     58         {
     59             VideoCapture capture;//摄像头对象
     60             try
     61             {
     62 
     63                 capture = new VideoCapture(a);
     64                 //Mat frame = new Mat();
     65                 double xx = capture.GetCaptureProperty(CapProp.FrameHeight);
     66                 double xw = capture.GetCaptureProperty(CapProp.FrameWidth);
     67                 //MessageBox.Show("h:" + xx + "w:" + xw+ "" + width + "height:" + height);
     68                 double xy = capture.GetCaptureProperty(CapProp.GigaFrameSensWidth);
     69                // 这里设置的分辨率是从配置文件读取分辨率,
                //这里需要注意,我设置的这个太高了,曾经在win7电脑上不能读出图像,搞了好久才发现错误原来是设置的分辨率太高了
    70 capture.SetCaptureProperty(CapProp.FrameWidth, 2448); 71 capture.SetCaptureProperty(CapProp.FrameHeight, 3264); 72 73 // capture.SetCaptureProperty(CapProp.Fps, Common.GetInstance().Con_Model.FrameFPS); 74 return capture; 75 76 } 77 catch (Exception ex) 78 { 79 Log.WriteLog(new StackTrace(new StackFrame(true)), ex.StackTrace); 80 return null; 81 } 82 } 83 84 /// <summary> 85 /// 对于视频流中的每一帧进行处理 86 /// </summary> 87 /// <param name="sender"></param> 88 /// <param name="arg"></param> 89 public static void ProcessMainFrame(object sender, EventArgs arg) 90 { 91 if (_cameraCapture != null && _cameraCapture.Ptr != IntPtr.Zero) 92 { 93 if (_captureInProgress) 94 { 95 _frame = new Mat(); 96 _cameraCapture.Retrieve(_frame, 0); 97 if (_frame == null || _frame.IsEmpty) 98 { 99 return; 100 } 101 if (imgSource != null) 102 { 103 imgSource.Dispose(); 104 } 105 imgSource = _frame.ToImage<Bgr, byte>(); 106 imgClone = imgSource.Copy(); 107 //将每一帧图片放到视频流框中显示 108 picCapture.Image = imgSource.ToBitmap(); 109 } 110 } 111 112 } 113 /// <summary> 114 /// 停止获取摄像头画面 115 /// </summary> 116 public static void StopCamera() 117 { 118 _cameraCapture.Stop(); 119 _cameraCapture.Dispose(); 120 } 121 /// <summary> 122 /// 获取本地摄像头列表(例如笔记本上有自身摄像头也有USB连接的摄像头) 123 /// </summary> 124 public static void GetCameras() 125 { 126 cameraCount = 0; 127 for (int i = 0; i < 5; i++) 128 { 129 VideoCapture videoCapture = new VideoCapture(i); 130 if (videoCapture.IsOpened) 131 { 132 cameraCount++; 133 } 134 videoCapture.Dispose(); 135 } 136 } 137 }

    操作类使用方法:

    1 CameraHelper.picCapture = this.picCapture;
    2 CameraHelper.OpenUSBCarmer(this .picCapture.Width,this .picCapture.Height);
  • 相关阅读:
    为什么一刷新页面session没了
    Dedecmsv5.7整合ueditor 图片上传添加水印
    DedecmsV5.7本地上传缩略图无法自动添加水印的解决方法
    mysql find_in_set()函数的使用
    利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验
    dedecms自定义表单时间时间戳值类型的转换方法
    jquery 根据自定义属性选择
    jquery快速获得url 的get传值
    自定义Bean初始化和销毁方法
    Spring常用注解
  • 原文地址:https://www.cnblogs.com/Betty-IT/p/12916520.html
Copyright © 2020-2023  润新知