【计算机视觉】对检测的人脸进行剪切和归一化

标签: 计算机 视觉 归一化 | 发表时间:2014-12-18 05:53 | 作者:JasonDing1354
出处:http://blog.csdn.net

引子

要进行人脸的识别,尤其是复杂环境下的人脸识别,就要在捕获人脸图像之后对图像进行预处理的工作,如图像的大小和灰度的归一化,头部姿态的矫正,图像分割等。这样做的目的是改善图像质量,消除噪声,统一图像灰度值及尺寸,为后序特征提取和分类识别打好基础。
该文将就人脸的剪切和归一化操作进行学习探讨,并做一笔记备用。

具体步骤

由于opencv的人脸识别需要输入图片具有相同的尺寸和灰度级,所以识别之前还要进行很重要的一步工作,就是针对人脸识别的需要调整人脸图片,具体可以分为以下步骤:

  • 图片去噪
  • 图片灰度化
  • 人脸的剪切(crop)
  • 调整图片大小(resize)
  • 姿态旋转(rotate)

人脸剪切的策略

这里我设想的最基本的人脸剪切方法是根据人眼的位置进行人脸的旋转和校正的。
基本思路如下:

  1. 根据两眼的倾斜角度对图像进行旋转校正
  2. 根据两眼在图片中的实际距离和自定义的偏移量进行图片的缩放

下面是剪切的效果图,最终的图片是100*100像素,偏移量是0.3

Detecting Face
Detecting Face
Cropping Result
Cropping Result

其代码为:

  cv::Mat FaceClassifer::cropFacesBasedOnEye(cv::Rect faceRect,
                                    cv::Point leftEye,cv::Point rightEye,
                                    float offset,int outputWidth,int outputHeight)
{
    int offset_h = floor(offset * outputWidth);
    int offset_v = floor(offset * outputHeight);

    int eyegap_h = rightEye.x-leftEye.x;
    int eyegap_v = rightEye.y-leftEye.y;

    float eye_distance = sqrt(pow(eyegap_h,2)+pow(eyegap_v,2));
    float eye_reference = outputWidth - 2*offset_h;
    float scale = eye_distance/eye_reference;

    //rotate original around the left eye
    cv::Mat rotatedImage;
    if(eyegap_v != 0)
    {
        double rotation = atan2f((float)eyegap_v,(float)eyegap_h);
        double degree = rotation*180/CV_PI;
        rotateFace(_image, leftEye, degree, rotatedImage);
    }

    //crop the rotated image
    cv::Point crop_xy(leftEye.x-scale*offset_h,leftEye.y-scale*offset_v);
    cv::Size crop_size(outputWidth*scale, outputHeight*scale);
    cv::Rect crop_area(crop_xy, crop_size);
    cv::Mat cropFace;
    if(eyegap_v == 0)
        cropFace = _image(crop_area);
    else
        cropFace = rotatedImage(crop_area);

    //resize the face
    cv::resize(cropFace,cropFace,cv::Size(outputWidth,outputHeight));
    cv::Mat croppedGray;
    cv::cvtColor(cropFace,croppedGray,CV_BGR2GRAY);
    cv::equalizeHist(croppedGray, croppedGray);
    return croppedGray;
}

解释一下代码:

  • 偏移量是指眼睛到图片上边界和左右边界的距离比例,比如0.3的偏移量,那么左眼到左边界,右眼到右边界的长度占所剪切的人脸图片宽度为0.3,同理到上边界的距离也占图片高度的0.3。
  • 根据两眼的实际距离和两眼依偏移量所应占据图片宽度的比例对图片进行缩放,比如实际距离是求一个欧式距离eye_distance,参考的距离eye_reference是输出的宽度outputWidth减去左眼到左边界的0.3 outputWidth,再减去右眼到右边界的0.3 outputWidth。
  • 由于最终要做人脸识别,需要输出灰度图,所以,最后的返回值是经过灰度化并且直方图均衡化了的图片

图片旋转的API

这里图片旋转用到了OpenCV的函数,warpAffine()。
这里涉及到了仿射变换,可以参考 OpenCV官方文档,放射变换

  void FaceClassifer::rotateFace(cv::Mat& src,cv::Point& pt,double angle,cv::Mat& dst)
{
    cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0);
    cv::warpAffine(src, dst, r, cv::Size(src.cols,src.rows));
}

这里我以左眼的中心点作为旋转的输入原点,cv::getRotationMatrix2D()生成了表示仿射变换的2 * 3矩阵。

转载请注明作者Jason Ding及其出处
Github主页(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)

作者:JasonDing1354 发表于2014-12-17 21:53:11 原文链接
阅读:67 评论:0 查看评论

相关 [计算机 视觉 归一化] 推荐:

【计算机视觉】对检测的人脸进行剪切和归一化

- - CSDN博客综合推荐文章
要进行人脸的识别,尤其是复杂环境下的人脸识别,就要在捕获人脸图像之后对图像进行预处理的工作,如图像的大小和灰度的归一化,头部姿态的矫正,图像分割等. 这样做的目的是改善图像质量,消除噪声,统一图像灰度值及尺寸,为后序特征提取和分类识别打好基础. 该文将就人脸的剪切和归一化操作进行学习探讨,并做一笔记备用.

计算机视觉领域的一些牛人博客

- Paul - 丕子
来自CSDN上carson2005写的一篇博客《计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接》. 以下链接是本人整理的关于计算机视觉(ComputerVision, CV)相关领域的网站链接,其中有CV牛人的主页,CV研究小组的主页,CV领域的paper,代码,CV领域的最新动态,国内的应用情况等等.

【重磅】GluonCV—基于MXNet的计算机视觉库 - 知乎

- -
2018-04-26,分布式机器学习社区(DMLC) 发布了两个深度学习工具箱 GluonCV 和 GluonNLP,它们分别为计算机视觉和自然语言处理提供了顶级的算法实现与基本运算. 本文主要介绍GluonCV,并提供了安装和基本使用示例. GluonCV提供了计算机视觉领域最先进的(SOTA)深度学习算法的实现.

马云的8亿美元会打水漂吗?从高层离职的Magic Leap谈计算机视觉

- - 博客园_新闻
Magic Leap 高管大量离职,隐忧已现. 计算机视觉如何把平面图像还原成立体物体. 本文来自微信公众号:硅谷密探(SVS-007). Magic Leap 年初获阿里巴巴领投的 7.9 亿美元,一时风光无二. 但在今年 5 月 Magic Leap 对前技术副总裁 Gary Bradski 和 Adrian Kaehler 提起诉讼,认为他们向第三方泄露了公司机密.

腾讯杰出科学家写给2029的信:计算机视觉AI技术的爆点在哪里?

- -
在数不清的视觉AI应用中,我们认为未来技术的爆发点可能来自三个方面:信息的整合和提取、医疗和自动驾驶. 文 | 腾讯杰出科学家、腾讯优图实验室负责人 贾佳亚. 腾讯优图实验室总监 戴宇荣博士 郑冶枫博士. 本期杂志封面人物沈南鹏说过,投资人要思考十年后的情况. 不光是投资人,在迷雾重重、混沌不明的当下,市场中的每一个理性人都需要放长眼量,将锚抛在时间之河中较远的地方,以未来丈量现在,才能站立得更坚实安稳.

腾讯 AI Lab & Robotics X 主任张正友博士:计算机视觉的三生三世 | CCF-GAIR 2019

- - 雷锋网
雷锋网 AI 科技评论按:7 月 12 日-7 月 14 日,2019 第四届全球人工智能与机器人峰会(CCF-GAIR 2019)于深圳正式召开. 峰会由中国计算机学会(CCF)主办,雷锋网、香港中文大学(深圳)承办,深圳市人工智能与机器人研究院协办,得到了深圳市政府的大力指导,是国内人工智能和机器人学术界、工业界及投资界三大领域的顶级交流博览盛会,旨在打造国内人工智能领域极具实力的跨界交流合作平台.

数据归一化和两种常用的归一化方法

- - zzm
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和 量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性. 原始数据经过数据标准 化处理后,各指标处于同一数量级,适合进行综合对比评价. 一、min-max标准化(Min-Max Normalization).

计算机学科漫谈

- - 编程 - 编程语言 - ITeye博客
    PHP设计模式之观察者模式. 在这篇博文里,我想和大家聊一聊自己对计算机学科的理解. 当下本科阶段的计算机专业教学涉及计算机学科的方方面面,分类繁杂,有时可能令新人茫然不知所措. 那么,对计算机专业的学者来说,什么是最重要的呢. 我相信,一千个读者,一千个哈姆雷特,同样的,每个计算机的学习者都有自己对专业的一番认识.

天才计算机程序员 -- fabrice bellard

- 山石 - 小美的部落格
这位老兄就是写jslinux的那位,它的主页是:. 上面有他的几个作品,包括qemu,ffmpeg,tcc等. 这个世界从来不缺天才,只缺乏利用天分坚持理想和信念不断创新的人,这些人用恒心和努力缔造一个又一个传奇. 法国人Fabrice Bellard 就是这样一个了不起的程序员. Fabrice Bellard1972年生于法国,曾就读于巴黎高等综合理工学院和法国电信研究院.

计算机爱好者 VS. 程序员

- kapster - 博客园新闻频道
  本文是从 Hackers vs. Coders 这篇文章翻译而来.   优秀的计算机爱好者具有一种无价的技能. 可作为一名程序员会跟计算机爱好者一样吗. 难道程序员跟那些不知道如何编码的计算机爱好者们相比,会在创造性上处于劣势吗.   下面的这个故事让我看清了他们之间的不同.   我最近被邀请在一个周末创业活动中做指导.