初步了解C#版图像处理库emgucv

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步了解C#版图像处理库emgucv相关的知识,希望对你有一定的参考价值。

Emgu CV是OpenCV图像处理库的跨平台.Net包装器。允许从.NET兼容语言(C#,VB,VC ++,IronPython等)调用OpenCV函数。

网上下一个示例程序,运行如下;

可以把人脸识别出来提取到右侧;我试了一下不是所有的情况都能识别;

大概看一下代码;

 

packages目录下包含emgucv的库;

 

代码中包含一个xml文件,是人脸识别的模板文件;

 

需要的dll;

 

 代码;

using Emgu.CV;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CV

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void button1_Click(object sender, EventArgs e)
        

            OpenFileDialog openFileDialog1 = new OpenFileDialog();     //显示选择文件对话框
            openFileDialog1.Filter = "图片文件 (*.jpg)|*.jpg|All files (*.*)|*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            
                var file = openFileDialog1.FileName;          //显示文件路径
                this.pictureBox1.ImageLocation = file;
                PicSet(file);
            
        

        private void Pic(Bitmap bitmap)
        
            PictureBox pic = new PictureBox();
            pic.Image = Image.FromHbitmap(bitmap.GetHbitmap());
            pic.Size = new Size(103, 103);
            pic.Name = DateTime.Now.Ticks.ToString();
            pic.BackgroundImageLayout = ImageLayout.Stretch;
            pic.SizeMode = PictureBoxSizeMode.StretchImage;
            flowLayoutPanel1.Controls.Add(pic);
        



        public void PicSet(string file)
        
            var face = new CascadeClassifier("haarcascade_frontalface_alt.xml");
            //加载要识别的图片
            var img = new Image<Bgr, byte>(file);
            var img2 = new Image<Gray, byte>(img.ToBitmap());
            //把图片从彩色转灰度
            CvInvoke.CvtColor(img, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
            //亮度增强
            CvInvoke.EqualizeHist(img2, img2);
            //在这一步就已经识别出来了,返回的是人脸所在的位置和大小
            var facesDetected = face.DetectMultiScale(img2, 1.1, 10, new Size(50, 50));
            //循环把人脸部分切出来并保存
            int count = 0;
            var b = img.ToBitmap();
            foreach (var item in facesDetected)
            
                count++;
                var bmpOut = new Bitmap(item.Width, item.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                var g = Graphics.FromImage(bmpOut);
                g.DrawImage(b, new Rectangle(0, 0, item.Width, item.Height), new Rectangle(item.X, item.Y, item.Width, item.Height), GraphicsUnit.Pixel);
                g.Dispose();
                Pic(bmpOut);
                bmpOut.Save($"count.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                bmpOut.Dispose();
            
            if (facesDetected.Length < 1)
            
                this.label1.Text = "识别结果:0";
            
            else 
                this.label1.Text = "识别结果:"+ facesDetected.Length;
            

            //释放资源退出
            b.Dispose();
            img.Dispose();
            img2.Dispose();
            face.Dispose();
        
        
    

基本的人脸识别比较简单,库已经做了大多数事情;

包含相关命名空间,

加载人脸识别模板文件,

     var face = new CascadeClassifier("haarcascade_frontalface_alt.xml");

再调用几个函数就可以了;

看一下xml的模板文件,这是库提供的;

 

 

         里面是一些看上去是系数的东西;这是以一定数量的人脸数据经人工智能训练得来的;我也不知道是啥;大概是嘴巴的宽度、眼睛的大小、嘴巴到鼻子的距离、鼻子到眼睛的距离一类的东西;

它的官网;

https://www.emgu.com/wiki/index.php/Main_Page
https://www.emgu.com/wiki/index.php/Emgu_TF_License

以上是关于初步了解C#版图像处理库emgucv的主要内容,如果未能解决你的问题,请参考以下文章

Emgucv3.0的安装与配置

VS2010+C#+EmguCV 配置详解

EmguCV手部检测

浅入浅出EmguCvOpenCv与EmguCv

C# EmguCV图像处理实例

C#想用openCV应该如何配置