学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为2168,预计阅读6分钟

前言

《C++ OpenCV Contrib模块LBF人脸特征点检测》文章中已经介绍了人脸特征点的检测,本篇文章是在原代码的基础上实现人脸的提取。

实现效果

从上图上可以看到,左边蓝色方框里面是截取的人脸图像,然后在人脸图像的基础上针对特征点选定区域,最后生成右边圆框中的人脸图像。

# 实现方式
1 使用DNN检测到人脸并截取人脸部分区域
2 在截取的人脸区域中检测人脸68个特征点
3 针对68个特征点实现凸包检测形成图像掩膜
4 根据掩膜提取图像的人脸信息

关于人脸68个特征点

微卡智享

上图中介绍了人脸特征点的几个关键位置:

位置 点的范围
左侧下巴轮廓 0-7
下巴 8
右侧下巴轮廓 9-16
左侧眉毛 17-21
右侧眉毛 22-26
鼻梁区域 27-30 ‍
鼻底区域 31-35
左眼 36-41
右眼 42-47
嘴唇外缘 48-59
嘴唇内缘 60-67

人脸关键点

  • 鼻尖   30

  • 鼻根   27

  • 下巴   8

  • 左眼外角    36   

  • 左眼内角    39

  • 右眼外角    45

  • 右眼内角    42

  • 嘴中心    66

  • 嘴左角    48

  • 嘴右角    54

  • 左脸最外    0

  • 右脸最外    16

核心代码

微卡智享

//初始化模版人脸
void InitFaceMarkModel(Mat& frame, Rect rect, Mat& dst, vector<Point2f>& dstfacemarkmodel)
{vector<int> faceid = { 30,27,8,36,39,45,42,66,48,54,0,16 };vector<int>::iterator it;dst = Mat(frame, rect);Mat tmpmodel;dst.copyTo(tmpmodel);Rect tmprect = Rect(0, 0, dst.cols, dst.rows);vector<Rect> tmprects;tmprects.push_back(tmprect);vector<vector<Point2f>> tmpfacemodels;facemarkdetect.facemarkdetector(dst, tmprects, tmpfacemodels);Mat tmpdst = Mat::zeros(dst.size(), CV_8UC1);if (tmpfacemodels.size() > 0) {facemarkmodel = tmpfacemodels[0];//将vector<Point2f>转为vector<Point>用于做凸包检测vector<Point> facemarkcontour;    for (int i = 0; i < facemarkmodel.size(); ++i) {facemarkcontour.push_back(Point(facemarkmodel[i].x, facemarkmodel[i].y));//it = find(faceid.begin(), faceid.end(), i);//if (it != faceid.end()) {//  putText(tmpmodel, to_string(i), facemarkmodel[i], FONT_HERSHEY_PLAIN, 1, Scalar(255, 0, 0));//}cout << "模版特征点"<< i <<":" << facemarkmodel[i] << endl;}//凸包检测vector<Point> contourhull;convexHull(facemarkcontour, contourhull);//存入二维数组vector<vector<Point>>中用于画轮廓处理vector<vector<Point>> contours;contours.push_back(contourhull);//画轮廓并添充drawContours(tmpdst, contours, -1, Scalar(255, 255, 255), -1);}dst = Mat::zeros(tmpmodel.size(), CV_8UC3);tmpmodel.copyTo(dst, tmpdst);imshow("dst", dst);//resize(tmpmodel, tmpmodel, Size(0, 0), 5, 5);imshow("srcmodel", tmpmodel);imshow("tmpdst", tmpdst);
}

划重点

上面的代码还是比较简单的,两个需要注意的点:

  1. 人脸关键点检测出来的数据是vector<vector<Point2f>>,而做凸包检测的时候需要将vector<vector<Point2f>>转换成vector<vector<Point>>。

  2. 做区域掩膜时先生成一张相同大小的全黑的图片,然后把要截取的区域全部填充为白色,再通过copyto的方式生成即可。

结语

源码下一篇会再提交上去,现在的源码在处理人脸的Delaunay三角形的

提取,正好遇到了问题。等下篇的时候一起说一下。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

C++ OpenCV Contrib模块LBF人脸特征点检测

牛气冲天

OpenCV源码Android端编译,用时三天,我编了个寂寞。。。

C++ OpenCV人脸图像提取相关推荐

  1. VS2022 C# .Net6 OpenCV人脸识别 提取人脸特征提取

    根据原作者提供的信息,本文使用的是VS2022 .Net6 Asp.Net WebForm,用来网页端上传头像,后端先保存网页传入的照片再进行照片处理. 一.添加引用三个Nuget包 1.Emgu.C ...

  2. C# .Net5 OpenCV人脸识别 提取人脸特征提取

    基于OpenCV人脸识别 并出提取人脸 翻遍了百度只有WPF跟WinForm的,这个可以支持Asp.Net .NetCore,本人用来网页端上传头像,后端先保存网页传入的照片再进行照片处理就OK了. ...

  3. OpenCV 实践——人脸检测与人脸图像提取

    人脸对比是现在比较常用的功能,比如出租车司机人脸与司机驾照照片对比,门禁系统中进入者的人脸与人脸库中的人脸进行对比.要实现人脸对比,首先要实现的是人脸检测,在摄像头拍摄到的一张图片中,正确的检测到人脸 ...

  4. OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)

    本周有机会接触了一点opnev, 在此做一下记录, 最终以框选出下图箱子为目的(图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS:本文参考了好 ...

  5. python多张照片拼成一张人脸,使用OpenCV实现人脸图像卡通化的示例代码

    引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视觉和机器学习的开源 python 库.它主要针对实时计算机视觉和图像处理.它用于对图像执行不同的操作,这些操作使用不同的技术对图像进行 ...

  6. Python-中北大学人工智能OpenCV人脸识别(根据图片训练数据,根据训练好的数据识别人脸)

    文章目录 1. 根据训练照片训练数据模型 2. 根据训练的数据文件,进行人脸识别 1. 根据训练照片训练数据模型 训练流程: 读取文件夹下的所有文件,使用PIL 库中的Image方法打开图片,并将其转 ...

  7. matlab截视频人脸,一种视频图像中人脸图像截取方法与流程

    本发明涉及人工智能领域,具体涉及一种提高人脸比对性能的视频图像中人脸图片截取方法. 背景技术: 人脸图像比对需要对人脸图像提取特征数据,用于人脸对比的人脸特征提取,主要是对经人脸检测过程截取到的视频图 ...

  8. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  9. 在线会议中人脸面部轮廓图像提取(三)——Dlib库人脸面部轮廓图像特征提取

    前言:所使用图片并无盈利等目的,如有侵犯他人肖像权请联系删除. 当当当当,第三期来廖!接上一期在线会议中人脸面部轮廓图像提取(二)--HOG人脸面部轮廓图像特征提取,介绍完HOG特征提取我们继续学习D ...

  10. 使用OpenCV实现人脸图像卡通化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视 ...

最新文章

  1. python bisect_Python中bisect的用法
  2. 东方数智发布新品AIDOL™,打造人工智能偶像全息平台
  3. ubuntu java7安装_Ubuntu下安装配置 JDK 7
  4. 打印菱形(Java)
  5. 8、SpringBoot+Mybatis整合------参数取值方式
  6. android markdown软件,安卓上的Markdown写作软件——Markdrop
  7. bash学习之环境变量
  8. JS/JQuery操作iframe元素
  9. ubuntu服务器文件权限设置密码,Ubuntu 开启 root 用户并开启 ssh 远程访问权限
  10. NB-IoT天线座和连接器SMA、U.FL、IPX、IPEX
  11. Windows 中批量重新注册所有的DLL文件的方法
  12. WTL for MFC Programmers, Part V - Advanced Dialog UI Classes
  13. Android中缩放图片的方法
  14. 计算机二级excel高级筛选,Excel 如何按双条件执行高级筛选?
  15. ASP.NET Core 导出Excel文件
  16. css 侧栏跟随_简单代码实现智能侧边栏跟随固定浮动的效果
  17. java中long=后面为什么还要加个L
  18. Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC
  19. Python感知器算法
  20. Expert 诊断优化系列------------------内存不够用么?

热门文章

  1. 信息化为五万教学点带来“优质教师”
  2. java语言的入门开始介绍
  3. 基于Matlab的海洋监视雷达检测仿真(附源码)
  4. 7. 堆(宋红康笔记)
  5. ES基于Hbase二级索引
  6. Jetson Nano 入坑之路 ----(9)C++调用SYN6288语音播报模块
  7. 社区发现研究报告——基于信息熵和局部相关性的多标签传播重叠社区发现算法
  8. Java 运行环境安装(JRE JDK 区别)
  9. Python:人工智能库如何选择,百度图像识别入门
  10. 实验设计和结果分析经验总结