手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

C# 使用OpenCV在一张图片里寻找人脸

[日期:2017-10-30] 来源:cnblogs.com/DragonStart  作者:DragonStart [字体: ]

先上个效果图

相关库的下载

例程中用到一个库叫做emgucv,是opencv\的net封装
编译打包好的稳定版,在这:https://sourceforge.net/projects/emgucv/files/emgucv/
如果要最新代码,在这里获取:https://github.com/emgucv/emgucv

建立工程

首先建立一个C#控制台工程.添加引用:Emgu.CV.World.dll
然后添加这2个文件到工程(在emgucv的压缩包里有的,搜索下文件吧~):
注意:其中的dll文件需要根据要编译的程序是32位还是64位选不同文件

记得把"复制到输出目录"设为"较新则复制"
另外准备一张要识别的图片,放到编译输出目录.
接下来就是编辑代码了,后面所有代码都在main里

配置OpenCV使用显卡运算(如果支持的话)

使用显卡处理图像数据效率会很多,如果你的设备支持,最好打开,使用CvInvoke.HaveOpenCLCompatibleGpuDevice能返回是否支持.
配置CvInvoke.UseOpenCL能让OpenCV 启用或者停用 GPU运算

CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;

构建级联分类器对象

emgu包里已经有训练好的数据了,文件名叫做"haarcascade_frontalface_alt.xml",就是上面添加的文件之一

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

加载图像并作简单处理

在OpenCV中,大部分函数是处理灰度图的,包括这个识别物体,所以需要转成灰度图,然后再调整下亮度

//加载要识别的图片
var img = new Image<Bgr, byte>("0.png");
var img2 = new Image<Gray, byte>(img.ToBitmap());
//把图片从彩色转灰度
CvInvoke.CvtColor(img, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
//亮度增强
CvInvoke.EqualizeHist(img2, img2);

检测人脸

其实这一步反而最简单,返回的是rectangle[]格式,因为图中可能有多个人脸,所以返回的是数组.

//在这一步就已经识别出来了,返回的是人脸所在的位置和大小
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();
    bmpOut.Save($"{count}.png", System.Drawing.Imaging.ImageFormat.Png);
    bmpOut.Dispose();
}

释放资源退出

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

全代码和测试图片:

static void Main(string[] args)
{
    //如果支持用显卡,则用显卡运算
    CvInvoke.UseOpenCL = CvInvoke.HaveOpenCLCompatibleGpuDevice;

    //构建级联分类器,利用已经训练好的数据,识别人脸
    var face = new CascadeClassifier("haarcascade_frontalface_alt.xml");

    //加载要识别的图片
    var img = new Image<Bgr, byte>("0.png");
    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();
        bmpOut.Save($"{count}.png", System.Drawing.Imaging.ImageFormat.Png);
        bmpOut.Dispose();
    }

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

    return;

}

运行效果

编译后运行可以看到目录多了两个图片文件:

打开看看:

OpenCV官方教程中文版(For Python) PDF  http://www.chineselinuxuniversity.net/Linux/2015-08/121400.htm

Ubuntu 14.04安装OpenCV2.4.9  http://www.chineselinuxuniversity.net/Linux/2016-07/132884.htm

Ubuntu 16.04上用CMake图形界面交叉编译树莓派的OpenCV3.0 http://www.chineselinuxuniversity.net/Linux/2016-10/135914.htm

Ubuntu 16.04中安装OpenCV 2.4.11  http://www.chineselinuxuniversity.net/Linux/2016-07/132882.htm

Ubuntu 16.04下Matlab2014a+Anaconda2+OpenCV3.1+Caffe安装  http://www.chineselinuxuniversity.net/Linux/2016-07/132860.htm

Linux上安装和编译OpenCV3.0.0  http://www.chineselinuxuniversity.net/Linux/2017-07/145446.htm

Ubuntu 16.04下OpenCV安装笔记和例程 http://www.chineselinuxuniversity.net/Linux/2017-08/146027.htm

Ubuntu 16.04下TensorFlow+Caffe+OpenCV3.1+Theano部署  http://www.chineselinuxuniversity.net/Linux/2017-01/139503.htm

Ubuntu 16.04 编译安装OpenCV 3.1及OpenCV多版本切换 http://www.chineselinuxuniversity.net/Linux/2017-01/139325.htm

[翻译]Ubuntu 14.04, 13.10 下安装 OpenCV 2.4.9  http://www.chineselinuxuniversity.net/Linux/2014-12/110045.htm

Ubuntu 安装 OpenCV 2.4.9  http://www.chineselinuxuniversity.net/Linux/2016-12/138293.htm

Ubuntu 17.04下OpenCV源码编译安装  http://www.chineselinuxuniversity.net/Linux/2017-10/147316.htm

OpenCV的详细介绍请点这里
OpenCV的下载地址请点这里

本文永久更新链接地址http://www.chineselinuxuniversity.net/Linux/2017-10/148126.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款