OpenCV人脸检测与三角剖分绘制
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
一:三角剖分概念(Triangulation)
三角剖分最早是俄国数学家Delaunay提出来的,而他获得博士学位时候的老师是Georgy Voronoy,是维诺图概念的提出者,而且维诺是马尔可夫的学生,就是很难懂的马尔可夫链的鼻祖。所以三角剖分又常常被冠以Delaunay Triangulation。其基本思想就是对任意多的点,分割为多个三角形,任意一个三角形的外接圆都不应该包含其它顶点,如果包含则继续寻找组合,直到所有点满足此条件,最终得到的多个三角形就是三角剖分,三角剖分在人脸特征迁移、人脸合成与交换、图像合成与分割等方面应用广泛,最常见的就是通过三角剖分实现合成显示如下:
二:OpenCV中相关API支持
Subdiv2D对象是OpenCV中用来生成三角剖分,并且获取三角剖分全部三角形的工具类,主要方法如下:
- Subdiv2D subdiv // 定义三角剖分
- initDelaunay (Rect rect) // 初始化三角剖分对象
- subdiv.insert(Point2f); // 插入三角剖分的顶点
- subdiv.getTriangleList(std::vector< Vec6f> &triangleList); // 获取三角形数据
三:OpenCV基于人脸的三角剖分实现
现在很多人脸识别演示场景都支持实时绘制人脸的三角剖分之后的全部三角形,感觉是非常的帅,特别是大屏投影显示,笔者就在一些人工智能的展会上看到大厂的这种展示。利用OpenCV的HAAR级联检测器实现人脸检测,然后基于人脸检测结果通过LBF人脸Landmark检测器实现人脸68个特征点的拟合,然后根据拟合的68个点调用Subdiv2D类的相关API就可以生成人脸三角剖分,最后绘制即可。相关步骤代码如下:
1.人脸检测
CascadeClassifier face_detector(harr_file);
vector<Rect> faces;
face_detector.detectMultiScale(gray, faces, 1.02, 1, 0, Size(20, 20), Size(300, 300));
for(size_t t = 0; t < faces.size(); t++) {rectangle(src, faces[t], Scalar(0, 0, 255), 2, 8, 0);
}
2.Landmark特征点提取
// 创建LBF landmark 检测器
Ptr<FacemarkLBF> facemark = FacemarkLBF::create(params);
// 加载模型数据
facemark->loadModel("D:/vcprojects/images/lbfmodel.yaml");
cout << "Loaded model"<< endl;
// 提取人脸landmark-68个特征点
vector<vector<Point2f>> landmarks;
facemark->fit(src, faces, landmarks);
3.三角剖分生成与绘制
// 创建剖分三角形生成器
Subdiv2D subdiv;
subdiv.initDelaunay(rect);
// 添加与绘制特征点
for(int i = 0; i < shapes.size(); i++) {subdiv.insert(shapes[i]);circle(result, shapes[i], 2, Scalar(0, 0, 255), -1, 8, 0);
}
// 生成剖分三角形
vector<Vec6f> triangleList;
subdiv.getTriangleList(triangleList);
vector<Point> pt(3);
// 绘制剖分三角形
for(size_t i = 0; i < triangleList.size(); i++)
{Vec6f t = triangleList[i];pt[0] = Point(cvRound(t[0]), cvRound(t[1]));pt[1] = Point(cvRound(t[2]), cvRound(t[3]));pt[2] = Point(cvRound(t[4]), cvRound(t[5]));// 使用随机颜色,绘制三角形if(rect.contains(pt[0]) && rect.contains(pt[1]) && rect.contains(pt[2])){line(result, pt[0], pt[1], Scalar(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256)), 1, LINE_AA, 0);line(result, pt[1], pt[2], Scalar(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256)), 1, LINE_AA, 0);line(result, pt[2], pt[0], Scalar(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256)), 1, LINE_AA, 0);}
}
输入原图
人脸检测结果
三角剖分绘制
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
OpenCV人脸检测与三角剖分绘制相关推荐
- OpenCV-Python实战(21)——OpenCV人脸检测项目在Web端的部署
OpenCV-Python实战(21)--OpenCV人脸检测项目在Web端的部署 0. 前言 1. OpenCV 人脸检测项目在 Web 端的部署 1.1 解析请求并构建响应 1.2 构建请求进行测 ...
- 人脸识别系统——OpenCV人脸检测
EduCoder:人脸识别系统--OpenCV人脸检测 第1关:图片基本操作 编程要求: 请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求: 导入openCV库(cv2): 读取路径 s ...
- OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)
OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...
- keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)
人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法. Keras系列: 1.keras系列︱Sequential与Model模型.kera ...
- .NetCore——基于OpenCV人脸检测
.NetCore--基于OpenCV人脸检测 一.介绍 在.NetCore中,基于OpenCV实现对静态图片的人脸识别,检测人脸是否存在,且存在的数量.注: 不能自动学习人脸特征. 二.使用 首先引入 ...
- 基于Haar分类器的OpenCV人脸检测实例
一.人脸的Haar特征分类器是什么 人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值.当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也 ...
- 【EduCoder答案】人脸识别系统——OpenCV人脸检测
简介 答案查询的入口网页版 其他各类实训答案的目录见这里 答案获取的方法简介见这里 并不是所有的关卡都有答案,有些只有部分关卡有 不要直接复制答案哦 人脸识别系统 -- OpenCV人脸检测 > ...
- opencv人脸检测总结
主要参考了很多大神的总结,做了自己的整理,还没有完成,,后续不断完善补充 opencv人脸检测总结 一.人脸检测介绍 1. 人脸检测分类 基于知识方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛 ...
- C++:opencv 人脸检测
C++:opencv 人脸检测 问题描述: 要求 输入一张图片:输出圈出人脸的图片: vs2015: opencv3.4.6: 效果 输入: 输出: 代码实现: #include "open ...
最新文章
- CMD如何生成文件夹目录结构
- 在python中、下列代码的输出是什么-Python 面试中 8 个必考问题
- Android的事件分发实例分析
- Linux使用tcpdump抓取网络数据包示例
- WebSocket 实现 Web 端即时通信
- 【Auto.js】[zip压缩] 将文件夹压缩成zip包
- SharePoint Online 创建门户网站系列之首页布局
- python是面向对象还是过程_python编程:面向对象与过程是什么?
- Laravel服务提供器
- 上大学有用吗?35岁以上的程序员都去哪里了
- 2014蓝桥杯:李白打酒;奇怪的分式(枚举,最大公约数)
- 制作Web动画——动画制作工具Flash MX
- mysql编写触发器语法_mysql触发器语法
- 中国电信修改光猫路由模式为桥接模式
- c语言中 结构体对象,C语言中结构体详解
- 测试方法介绍-计算模型复杂度(GMac)、模型大小(M)、计算速度(FPS)
- 谈谈卷积神经网络和循环神经网络
- 网上作业c语言第三章,c语言 第3章 作业 和部分答案.doc
- 市面上开源项目这么多,别无脑上,需谨慎行事
- cmd命令行下常见的注册表操作