zoukankan      html  css  js  c++  java
  • 无人地磅自助机开发总结(三)调用电脑本地摄像头拍照抓拍,添加水印

    1.这个抓拍为静默抓拍,不展示抓拍画面,直接拍照片存到本地

    2.Nuget引用AForge.Controls.dll

    3.CameraHelper.cs

    public static class CameraHelper
            {
                private static FilterInfoCollection _cameraDevices;
                private static VideoCaptureDevice div = null;
                private static VideoSourcePlayer sourcePlayer = new VideoSourcePlayer();
                private static bool _isDisplay = false;
                //指示_isDisplay设置为true后,是否设置了其他的sourcePlayer,若未设置则_isDisplay重设为false
                private static bool isSet = false;
    
                /// <summary>
                /// 获取或设置摄像头设备,无设备为null
                /// </summary>
                public static FilterInfoCollection CameraDevices
                {
                    get
                    {
                        return _cameraDevices;
                    }
                    set
                    {
                        _cameraDevices = value;
                    }
                }
                /// <summary>
                /// 指示是否显示摄像头视频画面
                /// 默认false
                /// </summary>
                public static bool IsDisplay
                {
                    get { return _isDisplay; }
                    set { _isDisplay = value; }
                }
                /// <summary>
                /// 获取或设置VideoSourcePlayer控件,
                /// 只有当IsDisplay设置为true时,该属性才可以设置成功
                /// </summary>
                public static VideoSourcePlayer SourcePlayer
                {
                    get { return sourcePlayer; }
                    set
                    {
                        if (_isDisplay)
                        {
                            sourcePlayer = value;
                            isSet = true;
                        }
    
                    }
                }
                /// <summary>
                /// 更新摄像头设备信息
                /// </summary>
                public static void UpdateCameraDevices()
                {
                    _cameraDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                }
                /// <summary>
                /// 设置使用的摄像头设备
                /// </summary>
                /// <param name="index">设备在CameraDevices中的索引</param>
                /// <returns><see cref="bool"/></returns>
                public static bool SetCameraDevice(int index)
                {
                    if (!isSet) _isDisplay = false;
                    //无设备,返回false
                    if (_cameraDevices.Count <= 0 || index < 0) return false;
                    if (index > _cameraDevices.Count - 1) return false;
                    // 设定初始视频设备
                    div = new VideoCaptureDevice(_cameraDevices[index].MonikerString);
                    sourcePlayer.VideoSource = div;
                    div.Start();
                    sourcePlayer.Start();
                    return true;
                }
                /// <summary>
                /// 截取一帧图像并保存
                /// </summary>
                /// <param name="filePath">图像保存路径</param>
                /// <param name="fileName">保存的图像文件名</param>
                public static void CaptureImage()
                {
    
                    ////连接摄像头
                    //CameraHelper.UpdateCameraDevices();
                    //if (CameraHelper.CameraDevices.Count > 0)
                    //{
                    //    CameraHelper.SetCameraDevice(0);
                    //}
    
                if (sourcePlayer.VideoSource == null) return;
                string strDir = AppDomain.CurrentDomain.BaseDirectory + @"抓拍人脸_WMS" + @"" + DateTime.Now.ToString("yyyyMMdd");
               
                if (!Directory.Exists(strDir))
                    {
                        Directory.CreateDirectory(strDir);
                    }
                    try
                    {
                        //sourcePlayer.Start();
    
                        Image bitmap = sourcePlayer.GetCurrentVideoFrame();
                    if (bitmap != null)
                    {
                        //添加水印
                        using (var g = Graphics.FromImage(bitmap))
                        using (var brush = new SolidBrush(Color.White))
                        {
                            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                            //var sizeF = g.MeasureString(text, font);
                            g.ResetTransform();
                            //g.TranslateTransform(p.X, p.Y);
                            //g.RotateTransform(44);
                            Font drawFont = new Font("Arial", 12);
                            float x = 20.0F;
                            float y = 20.0F;
                            // Set format of string.
                            StringFormat drawFormat = new StringFormat();
                            drawFormat.FormatFlags = StringFormatFlags.DisplayFormatControl;
                            g.DrawString(DateTime.Now.ToString("yyyy/MM/dd/HH:mm:ss"), drawFont, brush, x, y, drawFormat);
                        }
                    }
                    
                     string imgname = DateTime.Now.ToString("yyyyMMddHHmm") + Global.Carnum + ".jpg";
                     string jpgPath = strDir + @"" + imgname;
                     Global.DriverjpgPath = jpgPath;
                     bitmap.Save(jpgPath);
                     bitmap.Dispose();
                    //sourcePlayer.Stop();
                     //CloseDevice();
                    }
                    catch (Exception e)
                    {
                    MessageBox.Show(e.ToString());
                       Global.Notice = "拍摄设备故障,请联系工作人员:"+Global.Phone;
                       SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
                        if (Global.Times != null && Global.Times != "")
                        {
                            for (int i = 0; i < int.Parse(Global.Times); i++)
                            {
                                speechSynthesizer.Speak(Global.Notice);
                            }
                        }               
                   
                    }
                }
          
            /// <summary>
            /// 关闭摄像头设备
            /// </summary>
            public static void CloseDevice()
                {
                    if (div != null && div.IsRunning)
                    {
                        sourcePlayer.Stop();
                        div.SignalToStop();
                        div = null;
                        _cameraDevices = null;
                    }
                }
            }

    4.调用拍照类抓拍

    
    

    //连接摄像头
    CameraHelper.UpdateCameraDevices();
    if (CameraHelper.CameraDevices.Count > 0)
    {
    CameraHelper.SetCameraDevice(0);
    }

     

    //抓拍人脸
    CameraHelper.CaptureImage();

     
  • 相关阅读:
    个性化排序算法实践(三)——deepFM算法
    Textbox输入状态提示
    CheckBox状态多选
    TextBox各种设置
    CheckBox多选
    简单的动画
    样式中调用方法
    textbox获取焦点选中内容
    linq一般用法
    自定义表头Datagrid
  • 原文地址:https://www.cnblogs.com/king10086/p/15380102.html
Copyright © 2011-2022 走看看