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();