学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为3322,预计阅读9分钟

前言

《OpenCV源码Android端编译,用时三天,我编了个寂寞。。。》文中介绍了编译OpenCV+Contrib模块的编译,虽然Andorid下编译始终没有获得libopencv_java4.so的库,不过在Windows下编译还是正常的,今天主要介绍人脸特征点的检测功能,就用到Contrib模块中的FaceMarkLBF。

实现效果

上面的GIF图中可以看出来,除了第一张多人里面有侧脸的,检测特征点时有点差,基本检测的都还挺不错。文章最后有Demo的GitHub源码地址。

实现方式

# 思路
1 加载OpenCV DNN和FacemarkLBF的模型(FacemarkLBF在OpenCVr的Contrib模块中)
2 使用DNN人脸检测获取图像中所有人脸的矩形框
3 调用FaceMarkLBF中的fit针对Mat和上面获得的人脸矩形框进行特征点检测,检测的结果存放为vector<vector<Point2f>>格式。

重点说明

微卡智享

01

关于OpenCV配置

使用VS2019编译的OpenCV及Contrib模块的源码后,生成的dll的动态库是VC16了,不是原来的VC15,而且在Debug和Relese都编译了一遍(用处就在正式环境中速度会提高接近10倍),所以会有opencv_world451.dll和opencv_world451d.dll两个动态库。

属性管理器里面也加入Debug和Relese的配置

Debug和Relese的VC++目录还是编译后的OpenCV目录。

链接器中Debug这里填上opencv_world451d.lib,而Relese里就填opencv_world451.lib。

02

DNN人脸检测

同《实践|OpenCV4.2使用DNN进行人脸检测一(图片篇)》文章中一样,已经把DNN的人脸检测单位写在一个类中

原来的detect的函数中我们是在原图上画出红色矩形框,返回的是vector<Mat>的值,因为特征点需要的是vector<Rect>的值,所以又新写了一个函数

bool dnnfacedetect::detectRect(Mat frame, vector<Rect> &rects)
{Mat tmpsrc = frame;// 修改通道数if (tmpsrc.channels() == 4)cvtColor(tmpsrc, tmpsrc, COLOR_BGRA2BGR);// 输入数据调整Mat inputBlob = dnn::blobFromImage(tmpsrc, inScaleFactor,Size(inWidth, inHeight), meanVal, false, false);_net.setInput(inputBlob, "data");//人脸检测Mat detection = _net.forward("detection_out");Mat detectionMat(detection.size[2], detection.size[3],CV_32F, detection.ptr<float>());if (detectionMat.rows <= 0) return false;//检测出的结果进行绘制和存放到dsts中for (int i = 0; i < detectionMat.rows; i++) {//置值度获取float confidence = detectionMat.at<float>(i, 2);//如果大于阈值说明检测到人脸if (confidence > confidenceThreshold) {//计算矩形int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * tmpsrc.cols);int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * tmpsrc.rows);int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * tmpsrc.cols);int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * tmpsrc.rows);//生成矩形存入检测的数组中Rect rect((int)xLeftBottom, (int)yLeftBottom,(int)(xRightTop - xLeftBottom),(int)(yRightTop - yLeftBottom));rects.push_back(rect);}}return true;
}

03

LBF人脸特征点

LBF人脸特征点检测也单独写了一个类,里面也比较简单,构造函数直接加载模型,然后一个检测的函数。

#include "chkfacemark.h"chkfacemark::chkfacemark(string lfmodel)
{_lfbmodel = lfmodel;//创建对象_facemark = FacemarkLBF::create();//加载模型_facemark->loadModel(_lfbmodel);
}chkfacemark::~chkfacemark()
{_facemark.release();
}bool chkfacemark::facemarkdetector(Mat src, vector<Rect> faces, vector<vector<Point2f>> &facemarks)
{return _facemark->fit(src, faces, facemarks);
}

04

多张图片加载

以前的Demo中只是加载了一张图片,这次是直接加了一个目录下的文件。定义了文件目录后,使用cv::glob的函数可以把所有的文件名存放到vector<string>的变量里。

  //加载多张图片string picdesc = "E:/DCIM/person/";vector<string> filenames;cv::glob(picdesc, filenames);

然后再循环处理filenames的方法即可。

05

关于图像缩放的问题

上面两个图中可以看到,像素差别好大,如果不用缩放的话,第二张图只能看到左上角的图片,为了解决这个问题,所以写了一个函数用于处理图像绽放的问题。

# 图像缩放思路
1 设定横向图像的最大宽度、纵向图像的最大高度
2 根据输入的图像判断是横向还是纵向
3 横向如果宽度超过最大宽度,按最大宽度除当前宽度算出比例,然后进行Resize的缩放(纵向就是高度超过最大高度处理)
//计算图像缩放
void MatResize(Mat& frame, int maxwidth, int maxheight)
{double scale;//判断图像是水平还是垂直bool isHorizontal = frame.cols > frame.rows ? true : false;//根据水平还是垂直计算缩放if (isHorizontal) {if (frame.cols > maxwidth) {scale = (double)maxwidth / frame.cols;resize(frame, frame, Size(0, 0), scale, scale);}}else {if (frame.rows > maxheight) {scale = (double)maxheight / frame.rows;resize(frame, frame, Size(0, 0), scale, scale);}}
}

然后在每次读取完图像后先进行缩放处理,即可正常显示了。

比较核心的东西上面都已经讲完了,全部的代码可以访问下面的链接,或是点击最后的阅读原文下载。里面的LBF模型文件还有DNN的模型文件都在代码里面。

源码地址

https://github.com/Vaccae/OpenCVDnnfacedecet.git

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

牛气冲天

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

.Net5中Swagger采用Attribute方式实现Api隐藏

C++ OpenCV Contrib模块LBF人脸特征点检测相关推荐

  1. 调用摄像头使用face_recognition 或 opencv中haar人脸特征实时检测识别人脸、给人脸打马赛克/给人脸贴图

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) OpenCV:python调用摄像头同时使用OpenCV中自带 ...

  2. Facial Landmark Detection(人脸特征点检测)

    原文地址:http://www.learnopencv.com/facial-landmark-detection/#comment-2471797375 作为计算机视觉研究员,我们很早就开始研究人脸 ...

  3. 第四篇:基于深度学习的人脸特征点检测 - 数据预处理

    在上一篇博文中,我们整理了300-W.LFPW.HELEN.AFW.IBUG和300-VW这6个数据集,使用Python将特征点绘制在对应的图片上,人工验证了数据集的正确性,最终获得了223034个人 ...

  4. 人脸特征点检测(一)

    人脸特征点检测(Facial landmark detection),即人脸特征点定位.人脸对齐(Face Alignment),是在人脸检测的基础上进行的,对人脸上的特征点例如嘴角.眼角等进行定位. ...

  5. 人脸特征点检测:SDM

    <Supervised Descent Method and its Applications to Face Alignment>论文解读 这篇文章发表于CVPR2013,来自于CMU. ...

  6. PFLD:简单、快速、超高精度人脸特征点检测算法

    作者 | 周强(CV君) 来源 | 我爱计算机视觉(公众号id:aicvml) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourc ...

  7. CPU上跑到 100 fps 的高精度PyTorch人脸特征点检测库

      视学算法分享   作者 | cunjian 编译 | CV君 转自 | 我爱计算机视觉 [导读]向大家推荐一款基于PyTorch实现的快速高精度人脸特征点检测库,其在CPU上的运行速度可达100 ...

  8. ShapeNet:超实时人脸特征点检测与形状拟合开源库

    点击我爱计算机视觉标星,更快获取CVML新技术 近日,来自德国亚琛工业大学的研究人员开源了形状拟合库ShapeNet,其可以实现超实时的人脸特征点检测,也可以用在其他任何需要形状拟合的应用场景. 开源 ...

  9. 『深度学习项目四』基于ResNet101人脸特征点检测

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

最新文章

  1. android 之 Intent、broadcast
  2. oracle+结果拆分,ORACLE字符拆分函數返回結果集
  3. 搜索引擎学习资源收集
  4. wpf checkbox选中触发事件_Cypress 可操作事件
  5. 小白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连载四(场景切换)...
  6. Windows CE创建桌面快捷方式
  7. ceph怎么搭建文件存储_SUSE专家谈Ceph落地之最佳实践
  8. 解压ubi文件_请问为什么AM3352 NAND FLASH UBI文件系统挂载失败?
  9. python matplotlib打开相机
  10. Hive面试题汇总(2021)
  11. 多边形的凹凸性判断及python实现
  12. 好男07演唱会将开唱 劲歌热舞点燃盛夏激情
  13. 皮外骨伤科病题库【1】
  14. Duang,Duang,H5 +酷炫效果+干货,此时不收更待何时
  15. 【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能
  16. 2.2加勒比海盗船 最优装载问题
  17. 价值投资私募基金三人谈
  18. 美国国防部(DoD)计划采用敏捷开发
  19. <CSS3练习> CSS动画综合案例 热点图(含素材)
  20. 如何让你爱的人爱上你

热门文章

  1. a标签的target链接跳转指向iframe的方法
  2. 学习笔记(8):【数据分析】第七周 机器学习-5.性能考核 02
  3. 在element dialog中使用天地图报错Error in v-on handler: “TypeError: Cannot read property ‘_tdt_events‘ of null
  4. C++小游戏——种树
  5. 你好,C++(26)如何与函数内部进行数据交换?5.1.3 函数参数的传递
  6. 区块链狼人杀:宝二爷、赵东、帅初、易理华,谁是狼人谁是预言家?
  7. 这位程序员,你知道如何挣到月薪 20000+ 吗?
  8. python识图 web_python如何调用百度识图api
  9. 区块链技术如何赋能食品安全链路追溯
  10. 帝国CMS7.5仿薄荷健康网源码