前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV人脸检测与三角剖分绘制

OpenCV人脸检测与三角剖分绘制

作者头像
OpenCV学堂
发布2018-07-26 10:39:37
2.6K0
发布2018-07-26 10:39:37
举报

一:三角剖分概念(Triangulation)

三角剖分最早是俄国数学家Delaunay提出来的,而他获得博士学位时候的老师是Georgy Voronoy,是维诺图概念的提出者,而且维诺是马尔可夫的学生,就是很难懂的马尔可夫链的鼻祖。所以三角剖分又常常被冠以Delaunay Triangulation。其基本思想就是对任意多的点,分割为多个三角形,任意一个三角形的外接圆都不应该包含其它顶点,如果包含则继续寻找组合,直到所有点满足此条件,最终得到的多个三角形就是三角剖分,三角剖分在人脸特征迁移、人脸合成与交换、图像合成与分割等方面应用广泛,最常见的就是通过三角剖分实现合成显示如下:

二:OpenCV中相关API支持

Subdiv2D对象是OpenCV中用来生成三角剖分,并且获取三角剖分全部三角形的工具类,主要方法如下:

代码语言:javascript
复制
- Subdiv2D subdiv // 定义三角剖分
- initDelaunay (Rect rect) // 初始化三角剖分对象
- subdiv.insert(Point 2f); // 插入三角剖分的顶点
- subdiv.getTriangleList(std::vector< Vec6f > &triangleList); // 获取三角形数据

三:OpenCV基于人脸的三角剖分实现

现在很多人脸识别演示场景都支持实时绘制人脸的三角剖分之后的全部三角形,感觉是非常的帅,特别是大屏投影显示,笔者就在一些人工智能的展会上看到大厂的这种展示。利用OpenCV的HAAR级联检测器实现人脸检测,然后基于人脸检测结果通过LBF人脸Landmark检测器实现人脸68个特征点的拟合,然后根据拟合的68个点调用Subdiv2D类的相关API就可以生成人脸三角剖分,最后绘制即可。相关步骤代码如下:

1.人脸检测

代码语言:javascript
复制
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特征点提取

代码语言:javascript
复制
// 创建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.三角剖分生成与绘制

代码语言:javascript
复制
// 创建剖分三角形生成器
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);
    }
}

输入原图

人脸检测结果

三角剖分绘制


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:三角剖分概念(Triangulation)
  • 二:OpenCV中相关API支持
  • 三:OpenCV基于人脸的三角剖分实现
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档