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

Stella981
• 阅读 713

学更好的别人,

做更好的自己。

——《微卡智享》

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

前言

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

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

实现效果

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

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

实现方式

思路

1

加载OpenCV DNN和FacemarkLBF的模型(FacemarkLBF在OpenCVr的Contrib模块中)

2

使用DNN人脸检测获取图像中所有人脸的矩形框

3

调用FaceMarkLBF中的fit针对Mat和上面获得的人脸矩形框进行特征点检测,检测的结果存放为vector<vector>格式。

重点说明

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

微卡智享

01

关于OpenCV配置

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

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

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

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

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

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

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

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

02

DNN人脸检测

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

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

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

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

bool dnnfacedetect::detectRect(Mat frame, vector<Rect> &rects)

03

LBF人脸特征点

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

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

#include "chkfacemark.h"

04

多张图片加载

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

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

  //加载多张图片

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

05

关于图像缩放的问题

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

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

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

图像缩放思路

1

设定横向图像的最大宽度、纵向图像的最大高度

2

根据输入的图像判断是横向还是纵向

3

横向如果宽度超过最大宽度,按最大宽度除当前宽度算出比例,然后进行Resize的缩放(纵向就是高度超过最大高度处理)

//计算图像缩放

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

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

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

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

源码地址

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

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

扫描二维码

获取更多精彩

微卡智享

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

「 往期文章 」

牛气冲天

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

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

本文分享自微信公众号 - 微卡智享(VaccaeShare)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
Android CameraX NDK OpenCV(四)
学更好的别人,做更好的自己。——《微卡智享》本文长度为1999字,预计阅读5分钟前言OpenCV在4的版本后就有了二维码QRCode的检测和识别功能,当时刚出的时候效率及识别效果都还一般,在4.1.2的版本中也改善了精度和速度,然后后面4.3版
Stella981 Stella981
3年前
C++ OpenCV透视变换综合练习
学更好的别人,做更好的自己。——《微卡智享》本文长度为3879字,预计阅读9分钟前言以前的文章《COpenCV之透视变换(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
.net5发布在Windows2008的几个注意事项
学更好的别人,做更好的自己。——《微卡智享》本文长度为1312字,预计阅读4分钟导语前面《使用.Net5尝鲜的一些小总结及Configuration.Json读取配置文件的使用(https://www.oschina.net/action
Stella981 Stella981
3年前
C++ OpenCV透视变换改进
学更好的别人,做更好的自己。——《微卡智享》本文长度为4379字,预计阅读11分钟前言前一篇《COpenCV透视变换综合练习(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2F
Stella981 Stella981
3年前
OpenCV源码Android端编译,用时三天,我编了个寂寞。。。
学更好的别人,做更好的自己。——《微卡智享》本文长度为1526字,预计阅读4分钟导语《全网首发微信二维码引擎Android平台移植(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2F
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这