图片质量估计-如何判定一个人脸是否为阴阳脸
前言:

接上次python版本的判定,c++版本的阴阳脸判定方法,同样的,如下的代码依赖opencv和dlib人脸检测部分;


void checkyinyang(string imgpath) {int fontFace = cv::FONT_HERSHEY_SCRIPT_SIMPLEX;FaceBox facebox;facebox = detect(imgpath);cv::Mat temp;//cv::Mat mask;temp = cv::imread(imgpath);int w = temp.rows;int h = temp.cols;//mask.create(w, h, CV_8UC1);cv::Mat mask = cv::Mat::zeros(w, h, CV_8UC1);cv::Mat mask2 = cv::Mat::zeros(w, h, CV_8UC1);for (int i = 0; i < 68; i++) {//cv::putText(temp, std::to_string(i), cv::Point(facebox.landmark[2 * i], facebox.landmark[2 * i + 1]), fontFace, 0.5, cv::Scalar::all(255), 1, 1);//cv::circle(temp, cv::Point(facebox.landmark[2 * i], facebox.landmark[2 * i + 1]), 3, cv::Scalar(0, 0, 255), -1);}cv::Point pt = cv::Point(facebox.landmark[2 * 0], facebox.landmark[2 * 0 + 1]);std::cout << "pt.x = " << pt.x << std::endl;//add all points of the contour to the vectorstd::vector<std::vector<cv::Point> > fillContAll;//fill the single contour std::vector<cv::Point> fillContSingle;cv::Point polypt[1][15];for (int i = 0; i < 9; i++) {  polypt[0][i]= cv::Point(facebox.landmark[2 * i], facebox.landmark[2 * i + 1]);}polypt[0][9]= cv::Point(facebox.landmark[2*28], facebox.landmark[2*28+1]);polypt[0][10] = cv::Point(facebox.landmark[2*27], facebox.landmark[2*27+1]);for (int i = 21; i > 17; i--) {polypt[0][11+21-i]= cv::Point(facebox.landmark[2 * i], facebox.landmark[2 * i+1]);}int npt[] = {15};int lineType = 8;const cv::Point* ppt[1] = { polypt[0] };cv::fillPoly(mask, ppt, npt, 1, cv::Scalar(255), lineType);cv::Mat leftmask= cv::Mat::zeros(w, h, CV_8UC3);cv::bitwise_and(temp, temp, leftmask,mask = mask);std::vector<cv::Point> leftPoints;for (int i = 0; i < 15; i++) {leftPoints.push_back(polypt[0][i]);}double left_Area = cv::contourArea(cv::Mat(leftPoints));std::vector<cv::Mat>  v;std::vector<cv::Mat> leftHsv_sum; cv::Mat leftHsvimage, hue;       cv::cvtColor(leftmask, leftHsvimage, cv::COLOR_BGR2HSV);cv::split(leftHsvimage, leftHsv_sum);cv::Point polyptRight[1][14];std::vector<cv::Point> rightPoints;for (int i = 8; i < 16; i++) {polyptRight[0][i-8] = cv::Point(facebox.landmark[2 * i], facebox.landmark[2 * i + 1]);}polyptRight[0][8] = cv::Point(facebox.landmark[2 * 26], facebox.landmark[2 * 26 + 1]);polyptRight[0][9] = cv::Point(facebox.landmark[2 * 24], facebox.landmark[2 * 24 + 1]);polyptRight[0][10] = cv::Point(facebox.landmark[2 * 22], facebox.landmark[2 * 22 + 1]);for (int i = 27; i < 30; i++) {polyptRight[0][11+ i-27] = cv::Point(facebox.landmark[2 * i], facebox.landmark[2 * i + 1]);}const cv::Point* ppt_right[1] = { polyptRight[0] };int npt2[] = { 14 };cv::fillPoly(mask2, ppt_right, npt2, 1, cv::Scalar(255), lineType);cv::Mat rightmask = cv::Mat::zeros(w, h, CV_8UC3);cv::bitwise_and(temp, temp, rightmask, mask = mask2);for (int i = 0; i < 14; i++) {rightPoints.push_back(polyptRight[0][i]);}double right_Area = cv::contourArea(cv::Mat(rightPoints));std::vector<cv::Mat> rightHsv_sum;cv::Mat rightHsvimage;cv::cvtColor(rightmask, rightHsvimage, cv::COLOR_BGR2HSV);cv::split(rightHsvimage, rightHsv_sum);cout << "right_Area " << right_Area << endl;cout << "rightmask " << sum(mask2) << endl;cout << "right_mask " << mask.size() << endl;cout << " mean(rightHsv_sum[2]= " << sum(rightHsv_sum[2]) << endl;imshow("rightHsv_sum", rightHsv_sum[2]);imshow("rightmask", rightmask);imshow("leftHsvimage", leftHsv_sum[2]);imshow("mask2", mask2);imshow("Dlib特征点", temp);cv::waitKey(0);
}
  • 结果和之前python版本类似:
  • 原始图片:
  • 左脸区域:
  • 右脸区域:

后续:实际上这种方式判定阴阳脸的方法还是有缺陷的,有些人脸还是没有那么容易区分的。上次有朋友说,使用灰度图取代原有的v通道进行判定,我实际测了下,并没有改进,所以我还是决定v通道进行判定。实际情况的阴阳脸的判定只是人脸质量检测的一部分,最终还是要为人脸识别任务服务的。单纯的过滤左右的人脸亮度不均只是一部分,带有光线不均,光斑的也是属于不正常光照,以后有好的方法再贴出来吧。

TO BE CONTINUE…

图片质量估计-如何判定一个人脸是否为阴阳脸(第二弹:C++版本)相关推荐

  1. 图片质量估计-如何判定一个人脸是否为阴阳脸(第一弹:python版本)

    图片质量估计-如何判定一个人脸是否为阴阳脸 前言: 在人脸识别中,人脸质量对人脸识别系统重要性不言而喻.本文主要简要说明,如何进行阴阳脸的检测.思路还是挺清晰的:获取人脸左右部分的亮度进行比较,差异较 ...

  2. OpenCV4.5.4 DNN人脸识别模块使用介绍--如何快速搭建一个人脸识别系统

    点击下方卡片,关注"OpenCV与AI深度学习" 视觉/图像重磅干货,第一时间送达 导读 本文主要介绍OpenCV4.5.4中人脸识别模块的使用和简易人脸识别系统的搭建,供大家参考 ...

  3. 神探Sherlock如何用AI破案?教你在Excel中搭建一个人脸识别CNN网络

    作者 | Dave Smith 译者 | 刘畅 编辑 | 阿司匹林.Jane 出品 | AI科技大本营 [导读]人脸识别技术已经有了非常广泛的应用,国内大规模监控系统背后运用的技术就是人脸识别. 与大 ...

  4. 玩了一个人脸识别登录

    最近温差大,请别感冒 前言 这篇文章就没有目录了,直接从头正序开始即可. 因为突然接到了一个需求,一个xx局,内部使用的移动端项目(是我们开发的),需要添加一个人脸识别登录的需求. 内部员工使用的识别 ...

  5. 基于PYQT编写一个人脸识别软件(2)

    前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件.鉴于使用的是开源库--face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时效 ...

  6. 基于PYQT编写一个人脸识别软件

    转载请注明出处:http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接:http://blog.csdn.net/hongbin_xu ...

  7. python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器

    想要能人脸识别,我们需要训练一个识别器处理.训练的话就需要之前已经标注好的训练集,在前一篇文章中,我们创建了一个已经标注好的训练集.现在,是时候用这个训练集来训练一个人脸识别器了.当然,是用OpenC ...

  8. ASM 判定一个类,实现了指定接口

    为什么80%的码农都做不了架构师?>>>    ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法. 通 ...

  9. 用PyQt5+Caffe+Opencv搭建一个人脸识别登录界面

    最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的想法是用opencv自带的人脸检测算法检测出面部,利用caffe训 ...

最新文章

  1. 你还在new对象吗?Java8通用Builder了解一下?
  2. linux 删除乱码文件
  3. 人刚毕业,在小米造狗没有KPI,雷军奖励100万美金
  4. 阿里云智能编码idea插件:Alibaba Cloud AI Coding Assistant
  5. python布尔系列_python数据分析类库系列-Numpy之布尔型索引
  6. Qt 布局(水平、垂直、网格)
  7. bash shell是如何识别特殊符号的
  8. Monorail tutorial
  9. 再破记录!2019天猫双11八小时总成交1504.9亿,开场后8分1秒发货量破1亿
  10. 关于BMZCTF中 shell_exec的解法详解
  11. 通过elasticsearch对日志进行搜索热词统计
  12. java web文件拖拽上传文件_Java实现拖拽文件上传dropzone.js的简单使用示例代码
  13. 华为热设计工程师待遇_【华为热设计工程师面试】华为二面--热设计工程师。-看准网...
  14. 关于轩微电子ADS1256+stm32f103开发板的一点使用小tip
  15. 传奇服务器运行内存占用很高,电脑内存占用一直很高,怎么回事? 电脑内存占用率过高的原因和解决方法...
  16. Defcon 2018 Qualify: Easy Pisy writeup
  17. AutoCAD安装失败
  18. 解决 Windows系统 快捷方式 图标 变成 白色方块
  19. linux下的go富集分析,GO富集分析(转载)-Go语言中文社区
  20. Pytorch基础入门

热门文章

  1. 【笔记(干货)】论文word编辑中的常见问题(自用)
  2. 【数论】 秦九韶公式
  3. markdown居中文本
  4. 增量式PID的P和I怎么理解(一)
  5. FastJSON处理字符串转义字符问题
  6. 【spring跨域问题处理】
  7. 【C语言】C语言成长之路之超易上手的傻瓜版三子棋教程₍ᐢ.ˬ.⑅ᐢ₎
  8. 软件测试人员如何编写测试报告
  9. C# 对Excel文档打印时的页面设置
  10. Codeforces Round #492 D. Suit and Tie