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

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

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

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

初步了解C#版图像处理库emgucv_第1张图片

大概看一下代码;

初步了解C#版图像处理库emgucv_第2张图片 

packages目录下包含emgucv的库;

初步了解C#版图像处理库emgucv_第3张图片 

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

初步了解C#版图像处理库emgucv_第4张图片 

需要的dll;

初步了解C#版图像处理库emgucv_第5张图片 

 代码;

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(file);
            var img2 = new Image(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的模板文件,这是库提供的;

初步了解C#版图像处理库emgucv_第6张图片

初步了解C#版图像处理库emgucv_第7张图片 

初步了解C#版图像处理库emgucv_第8张图片 

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

它的官网;

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

你可能感兴趣的:(.Net,图像处理和识别,图像处理,opencv)