摘要
“OpenCV是一个开源的计算机视觉库。OpenCV采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上。OpenCV还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV的一个目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂得计算机视觉相关应用程序。OpenCV包含的函数有500多个,覆盖了计算机视觉的许多应用。
Emgu
Emgu CV是将OpenCV使用.net编程语言(C#)封装成的.net库,使用Emgu CV就可以在.net平台上调用OpenCV的功能,同时,Emgu CV也是开源的。
Emgu CV官网:http://www.emgu.com
从官网上你可以下载最新版本,我采用的是3.2.0.2682版本的。
安装成功之后,打开目录
打开解决方案,你可以看到很多demo,可以根据自己需求研究下
新建winform程序,添加引用,Emgu安装目录下的dll
并将所需的文件从Emgu的bin目录下拷贝到你的程序debug下
测试核心代码
public partial class MainFrm : Form { ////// 摄像头 /// private VideoCapture _capture = null; private Mat _frame; private string _exePath = AppDomain.CurrentDomain.BaseDirectory; private string _trainedFacePath = string.Empty; /// /// 3.5s 保存一次图片 /// private const double Interval = 3.5; long detectionTime; List faces = new List (); List eyes = new List (); /// /// 上次保存图片时间 /// private DateTime _lastSaveDt = DateTime.Now; /// /// 窗口坐标 /// private Point _frmPoint; /// /// 是否抓取到人脸 /// private bool _isHavePersonFace = false; public MainFrm() { InitializeComponent(); this.TopMost = true; CheckForIllegalCrossThreadCalls = false; _frmPoint = new Point(); } private void MainFrm_Load(object sender, EventArgs e) { //无边框 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; //不出现在任务栏 this.ShowInTaskbar = false; //去掉滑轮放大或者缩小 this.VideoImageBox.Enabled = false; this.MouseDown += MainFrm_MouseDown; this.MouseMove += MainFrm_MouseMove; _trainedFacePath = _exePath + "trainedfaces"; this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width - 1,
Screen.PrimaryScreen.WorkingArea.Height - this.Height); if (!Directory.Exists(_trainedFacePath)) { Directory.CreateDirectory(_trainedFacePath); } CvInvoke.UseOpenCL = false; try { _capture = new VideoCapture(); _frame = new Mat(); _capture.ImageGrabbed += ProcessFrame; _capture.Start(); } catch (NullReferenceException excpt) { MessageBox.Show(excpt.Message); } } void MainFrm_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point myPosittion = MousePosition; myPosittion.Offset(-_frmPoint.X, -_frmPoint.Y); Location = myPosittion; } } void MainFrm_MouseDown(object sender, MouseEventArgs e) { _frmPoint.X = e.X; _frmPoint.Y = e.Y; } private void ReleaseData() { if (_capture != null) _capture.Dispose(); } private void ProcessFrame(object sender, EventArgs e) { if (_capture != null && _capture.Ptr != IntPtr.Zero) { bool isOk = _capture.Retrieve(_frame, 0); VideoImageBox.Image = _frame; if (isOk && !_isHavePersonFace) { Run(_frame); } } } private void UploadFile(string filePath) { try { FileInfo file = new FileInfo(filePath); FileLogHelper.WriteFileLog(file.Name); } catch (Exception ex) { FileLogHelper.WriteFileLog(ex); } } private void Run(Mat mat) { IImage image = mat; DetectFace.Detect( image, "haarcascade_frontalface_default.xml", "haarcascade_eye.xml", faces, eyes, out detectionTime); string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg"; string path = Path.Combine(_trainedFacePath, fileName); foreach (Rectangle face in faces) { try { _isHavePersonFace = true; CvInvoke.Rectangle(image, face, new Bgr(Color.Red).MCvScalar, 1); using (Bitmap bm = new Bitmap(face.Width, face.Height)) using (Graphics g = Graphics.FromImage(bm)) { g.DrawImage(image.Bitmap, new Rectangle(0, 0, face.Width, face.Height),
new Rectangle(face.X + 1, face.Y + 1, face.Width - 1, face.Height - 1), GraphicsUnit.Pixel); bm.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg); } break; } catch (Exception ex) { FileLogHelper.WriteFileLog(ex); } } _isHavePersonFace = false; } }