dlib+vs2013+opencv实现人脸特征点检测

刷知乎的时候发现dlib做特征点检测和人脸识别的效果都好于OpenCV,就想着动手玩一下。没想到也是遇坑重重。

首先,在官网 install命令和setup.py文件进行安装时报错,先是报错cmake没有找到,添加了环境变量之后仍然报错c++11需要在vs2015下才能运行。后来找到的资料也说明了要想在vs2013下开发需要安装较早的版本。不想再重新安装vs了,可是官网也找不到早期的dlib版本,幸好有人做了汇总。下载了18.17版本,发现文件夹中没有setup文件,这时应该还需要cmake进行编译。

Cmake编译已经很熟悉了,选择编译的源文件和生成文件的目的地址,目的地址可以选择dlib主目录下新建的文件夹。第一步是configuration,要选择和自己vs版本对应的配置。Vs2013win32就选择visual studio 12 2013 (没有ARM)。下一步generation,然后就可以打开sln或者open project了。

然后就是新建c++工程,配置包含目录、库目录、附加依赖项。Vs2013预编译头已经包含了stdafx.h,不必在cpp文件中重新包含,否则会报错。期间遇到了LNK2019: 无法解析的外部符号的问题,不用说,链接库肯定没添加对。错误各有各的错法,我遇到的是在cmake的时候就出错了:configuration应该选择和自己vs平台一样的,我的是vs2013win32版的,却选择了win64,后来改成arm还是不对,只能是下图中所选的。

这下编译终于通过了,但是在读入shape_predictor_5_face_landmarks.dat中就异常中断了,中断处的代码显示是未能正确打开文件。郁闷了半天才意识到应该是路径中有中文连接符号-。把文件放到工作目录就解决问题了。

可以看到程序已经实现了在图像中检测人脸位置并将人脸中标志性的符号(如眼角,嘴角)标记出来,可以根据这些标志信息进一步知道人脸的表情信息(或者说动作pose)。实现人脸位置检测的是frontal_face_detector,实现标志提取的是shape_predictor,前者使用传统的HOG特征和线性分类器、图像金字塔、滑窗实现,后者通过根据2014年的一篇CVPR文章训练好的网络模型实现。在网上可以找到两个模型,一个可以找出68个人脸中的特征点,一个可以找到5个特征点。更换对应的.dat文件就可以实现,当然特征点更少时耗时更少。

P.s 更改模型文件后要记得更改绘制特征点圆圈的for循环中的循环次数,不然会溢出中断。

在这里的代码中使用了OPenCV实现图像导入和最后的显示和保存,在官网提供的例子中,可以全部使用dlib库完成。

/*dlib::deserialize("D:\\program\Anaconda2\\Tools\dlib-18.17\\shape_predictor_68_face_landmarks.dat") >> pose_model;cv::Mat img = imread("D:\\program\Anaconda2\\Tools\dlib-18.17\\zkaj.jpg", 1);*/
#include <dlib/opencv.h>  
#include <opencv2/opencv.hpp>  
#include <dlib/image_processing/frontal_face_detector.h>  
#include <dlib/image_processing/render_face_detections.h>  
#include <dlib/image_processing.h>  
#include <dlib/gui_widgets.h>  using namespace dlib;using namespace std;int main(){try{// Load face detection and pose estimation models.  frontal_face_detector detector = get_frontal_face_detector();//正脸检测器,得到人脸的边界框//检测器使用经典的HOG特征和线性分类器,图像金字塔和滑窗完成shape_predictor pose_model;//shape_predictor用于预测脸上标志的位置deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model;//读取已经训练好的模型,在 iBUG 300-W人脸数据集(禁止商用)上训练得到 http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2.// Grab and process frames until the main window is closed by the user.  // Grab a frame  cv::Mat temp;//cap >> temp;  temp = cv::imread("timg.jpg", 1);//cv::VideoCapture cap(0);也可以从摄像头获取当前画面cv_image<bgr_pixel> cimg(temp);//拷贝赋值 dlib的图像格式是array2d// Detect faces   std::vector<rectangle> faces = detector(cimg);// Find the pose of each face.  std::vector<full_object_detection> shapes;//用于存放特征点的容器for (unsigned long i = 0; i < faces.size(); ++i)shapes.push_back(pose_model(cimg, faces[i]));//68个点组成人脸poseif (!shapes.empty()){for (int j = 0; j < shapes.size(); j++)//遍历每个检测到的人脸{for (int i = 0; i < 68; i++)//遍历每个人脸的68个特征点{circle(temp, cvPoint(shapes[j].part(i).x(), shapes[j].part(i).y()), 3, cv::Scalar(0, 0, 255), -1);//半径是3,颜色是红色。-1表示圆被填充putText(temp, to_string(i), cvPoint(shapes[j].part(i).x(), shapes[j].part(i).y()), CV_FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 0), 1, 4);//线条宽度是1,字形是4邻域。to_string将int转为string,这是c++11新添加的}}}//Display it all on the screen  imshow("Dlib特征点", temp);imwrite("Dlib特征点1.jpg", temp);cv::waitKey(0);}catch (serialization_error& e){cout << "You need dlib's default face landmarking model file to run this example." << endl;cout << "You can get it from the following URL: " << endl;cout << "   http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl;cout << endl << e.what() << endl;}}

Python接口的配置

直接下载安装包更方便。dlib · PyPI注意还是要选择和自己python版本和机器相符合的安装包。通过命令pip install dlib-18.17.100-cp35-none-win_amd64.whl进行安装。我遇到的问题是pip版本不够高,使用python -m pip install --upgrade pip进行升级。总是弄不清楚到底进不进入python命令行,现在看来看来命令行中含python的就可以直接在cmd中执行。Pip也是直接在cmd中执行。

但是在pycharmn中的python版本是anaconda(python2.7),没有安装opencv。在https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy中找到了opencv的安装包。

使用pip install命令安装opencv,注意应该将D:\Anaconda3\Scripts(这是我电脑的安装目录)加入到环境变量,这样就可以使用pip命令。

一切就绪以后以管理员身份运行cmd或PowerShell。依次输入以下命令:

pip install --upgrade setuptools

pip install opencv-python

虽然网络还可以,顺利下载成功,但是依然无法import。原来pip自动下载也可能版本不对,于是下载了whl安装包(名字叫轮子?),再使用pip安装。

然后又遇到了numpy无法导入的问题,也是先卸载,重新安装。conda remove numpy;conda install numpy。

最后一个问题是cv2.rectangle的使用,我的opencv版本没有cv2.LINE_AA这个参数,注释掉就好了。

反正就是一步步走,一个个解决问题。终于看到了结果:

Reference:

  1. 手把手手把手教你Dlib+VS2013+Win7配置(详细)_凌桑的自我修养--You are the Eternity-CSDN博客_dlib vs2013
  2. Python:Widows下安装dlib(通过Python调用)_ezhchai的博客-CSDN博客
  3. 摄像头https://blog.csdn.net/qq_15807167/article/details/68944673
  4. Python接口Widows下安装dlib(通过Python调用)_ezhchai的博客-CSDN博客
  5. 用anaconda安装dlib库(python—opencv)_Snowing_ST的博客-CSDN博客_anaconda安装dlib
  6. Cv2:https://blog.csdn.net/Yeah_snow/article/details/79438097
  7. Uninstall:https://blog.csdn.net/zyfortirude/article/details/70176705

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对号入座,看看未来几年机器人是否会取代你的工作

来源&#xff1a;资本实验室摘要&#xff1a;面对未来&#xff0c;你是否准备好了&#xff1f;“机器是否会取代人类的工作”是当前讨论最多的话题之一。这主要源自于近几年以人工智能为代表的新技术的快速发展与商业化。尽管各研究机构的预测数据有所不同&#xff0c;但相同的…

冈萨雷斯《数字图像处理》读书笔记(十一)——表示和描述

虽然不是专门研究图像分割的&#xff08;峰兄才是&#xff09;&#xff0c;但多少接触了一点&#xff0c;并且图像分割是图像处理中的最为复杂的&#xff0c;通过图像分割可以很好地认识图像处理的好多方法。今天看的是边界追踪和链码的表示。网易计算机视觉工程师的第一道选择…

细胞内钾多钠少——原初生物的第三大遗迹?

来源&#xff1a;科学网在我们每日的饮食中&#xff0c;食盐&#xff08;氯化钠&#xff09;是少不了的&#xff0c;难以想象我们怎么能够每天吃完全没有盐味的食物。不仅人类如此&#xff0c;许多动物&#xff0c;例如食草的动物如牛和羊&#xff0c;也会主动寻找土表盐粒。我…

冈萨雷斯《数字图像处理》读书笔记(九)——形态学图像处理

形态学来自于生物学&#xff0c;研究动植物的形态和结构。运用在图像中可提取如边界、骨架和凸壳。初学形态学都是在二值化的图像上研究&#xff0c;之后可以扩展到灰度图像。 膨胀和腐蚀 数学形态学与集合论分不开&#xff0c;因为形态学中的操作是基于两个集合的&#xff0…

云计算行业现状及未来发展趋势

来源&#xff1a;国元证券、乐晴智库摘要&#xff1a;按照服务类型云计算被分为IaaS、PaaS、SaaS。▌云计算产业链构成按照服务类型云计算被分为IaaS、PaaS、SaaS。IaaS基础设施及服务:IaaS主要提供计算基础设施服务&#xff0c;主要包括CPU、内存、存储、网络、虚拟化软件、分…

冈萨雷斯《数字图像处理》读书笔记(三)——空间滤波

滤波这个词来源于频域处理&#xff0c;因为它的目的就是针对频率分量而言的&#xff0c;滤除一定的频率分量。但其实滤波在时域&#xff08;图像中对应为空域&#xff09;中也可以完成相应的操作&#xff0c;比如低通滤波器滤除了代表细节的高频分量&#xff0c;我们可以直接在…

WinInet:HTTPS 请求出现无效的证书颁发机构的处理

首先&#xff0c;微软提供的WinInet库封装了对网页访问的方法。 最近工作需要从https服务器获取数据&#xff0c;都知道https和http网页的访问方式不同&#xff0c;多了一道证书认证程序&#xff0c;这样就使得https在请求起来比http要复杂的多&#xff1b;好在&#xff0c;Win…

热度下的冷思考——智能眼镜到底有没有前途?

来源&#xff1a;环球网我们曾期望Google眼镜能够成为革命性的新产品&#xff0c;因为它某种程度上实现了大家对未来的幻想。然而Google眼镜作为概念产品虽然有趣&#xff0c;但它仍然太不成熟&#xff0c;而且因为存在侵犯隐私的可能还被大众抵触&#xff0c;更重要的是它花去…

TFRecords文件的存储与读取

将cats和dogs两个文件夹各1000张图片存储为&#xff1a;train.tfrecords#将图片文件生成train record import os import tensorflow as tf from PIL import Image #生成cats和dogs的record文件 path./data/train filenamesos.listdir(path) writertf.python_io.TFRecordWriter(…

对比激光SLAM与视觉SLAM:谁会成为未来主流趋势?

来源&#xff1a;智车科技摘要&#xff1a;SLAM&#xff08;同步定位与地图构建&#xff09;&#xff0c;是指运动物体根据传感器的信息&#xff0c;一边计算自身位置&#xff0c;一边构建环境地图的过程&#xff0c;解决机器人等在未知环境下运动时的定位与地图构建问题。目前…

链表中的指针

中期答辩改在了国庆之后&#xff0c;终于有时间可以看看剑指offer了。在看到单向链表的部分&#xff0c;对指针&#xff0c;尤其是头指针有点疑惑。首先容易理解的是链表的节点是一个结构体&#xff0c;该结构体包含一个数据&#xff08;一般是int型&#xff09;&#xff0c;还…

实现TFrecords文件的保存与读取

import os import cv2 import numpy as np import tensorflow as tf """ 将train文件夹下的cats和dog文件夹处理成train.tfrecords放在train文件夹里 """ #将图片的路径和对应的标签存储在list中返回 def deal(dir):images []temp []for root,…

工具推荐-css3渐变生成工具

今天工作用到了css3渐变&#xff0c;但是写起来才发现太麻烦了&#xff0c;而却很浪费时间&#xff0c;所以在这里向大家推荐一个在线的css3 渐变生成工具 地址是&#xff1a;http://www.colorzilla.com/gradient-editor/ 这个工具是可视化视图&#xff0c;用起来就和photoshop…

神经网络相关的笔试题目集合(一)

在找工作的过程中发现好多公司没有专门的、传统的图像处理岗位&#xff0c;所以只能参加算法类的笔试甚至AI类的笔试。在AI的笔试中几乎全是关于神经网络的问题&#xff0c;其实也都是很基础的一些问题&#xff0c;如果事先做了准备&#xff0c;可以从容应对。而对于我这种从传…

中美超算“你追我赶” 中国优势可圈可点

来源&#xff1a;新华网摘要&#xff1a;中美超算“你追我赶” 中国优势可圈可点新一期全球超级计算机&#xff15;&#xff10;&#xff10;强榜单&#xff11;&#xff12;日在美国达拉斯发布。与半年前的榜单相比&#xff0c;全球格局变化不大&#xff0c;美国在最快超算上…

吴恩达作业1:逻辑回归实现猫的分类

思路&#xff1a;输入样本X与随机初始权重W相乘&#xff0c;利用sigmoid激活函数输出值&#xff0c;对于二分类问题&#xff0c;用交叉熵损失函数来计算损失值&#xff0c;通过交叉熵损失函数利用链式法则求出W和b的偏导&#xff0c;梯度下降更新W和b即可&#xff0c;&#xff…

双摄与双目视觉

越来越多的手机开始上双摄&#xff0c;首先解释一下双摄的目的&#xff0c;双摄可以达到什么样的效果。首先双摄可以分为两类&#xff0c;一类是利用双摄获得图像中物体到镜头或者焦距的距离&#xff0c;得到景深信息就可以进行后续的3D重建、图像分割、背景虚化等&#xff1b;…

“脑补”的科学依据:眼前的黑不是黑,靠得是你的大脑

一个在眨眼的婴儿 | 图片来源&#xff1a;Leungcho Pan/Shutterstock撰文&#xff1a;Mindy Weisberger来源&#xff1a;科研圈编译&#xff1a;向菲菲人们常说&#xff1a;“别眨眼&#xff0c;精彩稍纵即逝。”但其实在我们眨眼的时候&#xff0c;精彩仍在我们眼前上演。我们…

基于Sql Server 2008的分布式数据库的实践(三)

配置PHP 1.打开PHP配置文件&#xff0c;找到extensionphp_mssql.dll&#xff0c;将前面的注释符号去掉 2.找到mssql.secure_connection&#xff0c;将Off改为On 3.找到com.allow_dcom true&#xff0c;将前面的注释符号去掉 4.下载正确版本的 ntwdblib.dll (2000.80.194.0)&am…

ORB论文研读与代码实现

首先&#xff0c;ORB算法来自于OpenCV Labs&#xff0c;相比于SIFT和SURF&#xff0c;ORB在使用中不必担心专利的问题。但同时ORB在保证了一定性能的条件下做到了高效。在论文《ORB: An efficient alternative to SIFT or SURF》2011中&#xff0c;ORB在特征点检测和描述子生成…