C++ OpenCV人脸图像提取
学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为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);
}
划重点
上面的代码还是比较简单的,两个需要注意的点:
人脸关键点检测出来的数据是vector<vector<Point2f>>,而做凸包检测的时候需要将vector<vector<Point2f>>转换成vector<vector<Point>>。
做区域掩膜时先生成一张相同大小的全黑的图片,然后把要截取的区域全部填充为白色,再通过copyto的方式生成即可。
结语
源码下一篇会再提交上去,现在的源码在处理人脸的Delaunay三角形的
提取,正好遇到了问题。等下篇的时候一起说一下。
完
扫描二维码
获取更多精彩
微卡智享
「 往期文章 」
C++ OpenCV Contrib模块LBF人脸特征点检测
牛气冲天
OpenCV源码Android端编译,用时三天,我编了个寂寞。。。
C++ OpenCV人脸图像提取相关推荐
- VS2022 C# .Net6 OpenCV人脸识别 提取人脸特征提取
根据原作者提供的信息,本文使用的是VS2022 .Net6 Asp.Net WebForm,用来网页端上传头像,后端先保存网页传入的照片再进行照片处理. 一.添加引用三个Nuget包 1.Emgu.C ...
- C# .Net5 OpenCV人脸识别 提取人脸特征提取
基于OpenCV人脸识别 并出提取人脸 翻遍了百度只有WPF跟WinForm的,这个可以支持Asp.Net .NetCore,本人用来网页端上传头像,后端先保存网页传入的照片再进行照片处理就OK了. ...
- OpenCV 实践——人脸检测与人脸图像提取
人脸对比是现在比较常用的功能,比如出租车司机人脸与司机驾照照片对比,门禁系统中进入者的人脸与人脸库中的人脸进行对比.要实现人脸对比,首先要实现的是人脸检测,在摄像头拍摄到的一张图片中,正确的检测到人脸 ...
- OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)
本周有机会接触了一点opnev, 在此做一下记录, 最终以框选出下图箱子为目的(图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS:本文参考了好 ...
- python多张照片拼成一张人脸,使用OpenCV实现人脸图像卡通化的示例代码
引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视觉和机器学习的开源 python 库.它主要针对实时计算机视觉和图像处理.它用于对图像执行不同的操作,这些操作使用不同的技术对图像进行 ...
- Python-中北大学人工智能OpenCV人脸识别(根据图片训练数据,根据训练好的数据识别人脸)
文章目录 1. 根据训练照片训练数据模型 2. 根据训练的数据文件,进行人脸识别 1. 根据训练照片训练数据模型 训练流程: 读取文件夹下的所有文件,使用PIL 库中的Image方法打开图片,并将其转 ...
- matlab截视频人脸,一种视频图像中人脸图像截取方法与流程
本发明涉及人工智能领域,具体涉及一种提高人脸比对性能的视频图像中人脸图片截取方法. 背景技术: 人脸图像比对需要对人脸图像提取特征数据,用于人脸对比的人脸特征提取,主要是对经人脸检测过程截取到的视频图 ...
- 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克
使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...
- 在线会议中人脸面部轮廓图像提取(三)——Dlib库人脸面部轮廓图像特征提取
前言:所使用图片并无盈利等目的,如有侵犯他人肖像权请联系删除. 当当当当,第三期来廖!接上一期在线会议中人脸面部轮廓图像提取(二)--HOG人脸面部轮廓图像特征提取,介绍完HOG特征提取我们继续学习D ...
- 使用OpenCV实现人脸图像卡通化
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视 ...
最新文章
- python bisect_Python中bisect的用法
- 东方数智发布新品AIDOL™,打造人工智能偶像全息平台
- ubuntu java7安装_Ubuntu下安装配置 JDK 7
- 打印菱形(Java)
- 8、SpringBoot+Mybatis整合------参数取值方式
- android markdown软件,安卓上的Markdown写作软件——Markdrop
- bash学习之环境变量
- JS/JQuery操作iframe元素
- ubuntu服务器文件权限设置密码,Ubuntu 开启 root 用户并开启 ssh 远程访问权限
- NB-IoT天线座和连接器SMA、U.FL、IPX、IPEX
- Windows 中批量重新注册所有的DLL文件的方法
- WTL for MFC Programmers, Part V - Advanced Dialog UI Classes
- Android中缩放图片的方法
- 计算机二级excel高级筛选,Excel 如何按双条件执行高级筛选?
- ASP.NET Core 导出Excel文件
- css 侧栏跟随_简单代码实现智能侧边栏跟随固定浮动的效果
- java中long=后面为什么还要加个L
- Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC
- Python感知器算法
- Expert 诊断优化系列------------------内存不够用么?