⼈脸识别68个点转
【Opencv】于仕琪⼈脸68个特征点分布情况
// ⿐尖 30
// ⿐根 27
// 下巴 8
// 左眼外⾓ 36
// 左眼内⾓ 39
// 右眼外⾓ 45
// 右眼内⾓ 42
// 嘴中⼼ 66
// 嘴左⾓ 48
/
/ 嘴右⾓ 54
// 左脸最外 0
// 右脸最外 16
--------------------------------------------------------------------------
对于⼀些常⽤的⼈脸库常常会提供对应的⼈脸框的位置以及⼈脸的特征点的坐标。虽然往往会有68个特征点的坐标,但是如果是⽤于⼈脸对齐,并不需要⽤到所有的点坐标。所以知道特征点的检测顺序能够帮助我们很快的到我们所需要的特定点坐标。
对于更加少的特征点的出现顺序与前⾯类似,可以推理出来。例如5个特征点的坐标信息可以判别出来每个坐标对应的是那个部位(左右眼,⿐⼦,左右嘴⾓)。
当然不是所有的特征点都会按照这个顺序进⾏变化,但是可以通过简单的算法将每个点⼀次显⽰出来,从⽽可以到我们所需要的点。(python)
def point_xy(s):
first = s.find(':')
x = s[0:first]
y = s[first+1:]
return x,y
for eachpoint in img_point:
[x,y] = point_xy(eachpoint)
[x,y] = [float(x),float(y)]
cv2.circle(im,(int(x),int(y)),2,(0,0,255),-1)
cv2.imshow('img',img)
cv2.waitKey(0)
其中 img_point是保存了所有特征点的⼀个数组。这样就能够⼀步⼀步的看出每个特征点的顺序。
--------------------------------------------------------------
Dlib+opencv实时提取⼈脸轮廓(windows环境下//Dlib配置⼊门)
本⽂主要演⽰Dlib在windows环境下利⽤VS配置环境运⾏成功调⽤摄像头的实时⼈脸特征点提取以及轮廓的描绘。
///////////////////////////////软件资源////////////////////////////////
//但最新版的dlib⽤VS2015会报⼀个很奇葩的错误,故⽽推荐上⾯的下载链接
//////////////////////////////正⽂/////////////////////////////////////
下载完Dlib之后解压。
接着新建⼀个空项⽬,把下载的⼈脸库(.dat⽂件解压压缩包后)添加到如下的⽬录下。
继⽽在项⽬⾥添加Dlib⼈脸库⾥的dlib\\all\\source.cpp进⼊项⽬
//如果不添加会报错,添加了source.cpp相当于把需要⽤的东西全引⼊进来了
接着再添加examples\\webcam_face_pose_ex.cpp进⼊项⽬
//这个是我们这次主要测试的提取⼈脸特征点的重要CPP
接着我们开始配置环境~
⾸先要配置opencv环境以及加上webcam需要调⽤的⽂件的⽬录
添加包含⽬录:
C:\opencv_310\build\include 这个是opencv的包含⽬录
C:\Users\handsome\Desktop\dlib-master 这个是dlib的主⽬录
添加库⽬录:
C:\opencv_310\build\x86\vc14\lib 这个是opencv的lib存储位置
附加依赖项的输⼊加上:
opencv_world310.lib opencv_ts310.lib 如果是debug或者其他版本的opencv换掉即可
需要注意的⼏点:
1.配置环境时选择的是X86还是X64以及是Release还是Debug,之后调试的时候也要选择好
2.⼈脸库(也就是那个⼀百兆的.dat⽂件)需要放对位置,不然程序没结果!如果直接打开EXE测试的话直接放到和EXE⼀个⽬录即可。
3.电脑⼀定要有摄像头!这⾥利⽤的是opencv调⽤摄像头
4.程序卡顿是因为detector函数耗时过长,可以考虑压缩画质或者换好⼀点的处理器
5.笔记本亲测效果远不如外置摄像头
6.这个库可以商⽤
接着就可以正常运⾏程序啦~~~
结果如图:
最后祝⼤家编程愉快:)
-----------------------------------------------------------------------------------------------
Dlib提取⼈脸特征点(68点,opencv画图)主要在官⽹给的Demo基础之上⽤Opencv把特征点描绘出来了。
很早之前写过⼀篇配置Dlib环境的博客,现在来稍微梳理下提取特征点的使⽤⽅法。
惯例先放效果图吧:
动图如下:
接着就是简单粗暴的代码:
//@zmdsjtu@163
//2016-12-4
//blog.csdn/zmdsjtu/article/details/53454071
#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>
rectangle函数opencv#include <dlib/gui_widgets.h>
using namespace dlib;
using namespace std;
int main()
{
try
{
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
cerr << "Unable to connect to camera" << endl;
return1;
}
//image_window win;
// Load face detection and pose estimation models.
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor pose_model;
deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model;
// Grab and process frames until the main window is closed by the user.
while (cv::waitKey(30) != 27)
{
/
/ Grab a frame
cv::Mat temp;
cap >> temp;
cv_image<bgr_pixel> cimg(temp);
// 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]));
if (!pty()) {
for (int i = 0; i < 68; i++) {
circle(temp, cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), 3, cv::Scalar(0, 0, 255), -1);
// shapes[0].part(i).x();//68个
}
}
//Display it all on the screen
imshow("Dlib特征点", temp);
}
}
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 << " dlib/files/shape_predictor_68_face_landmarks.dat.bz2" << endl;
cout << endl << e.what() << endl;
}
catch (exception& e)
{
cout << e.what() << endl;
}
}
来看下上⾯那段代码,所有的需要的特征点都存储在Shapes⾥。仔细看看下⾯这⾏代码:
circle(temp, cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), 3, cv::Scalar(0, 0, 255), -1);
可以看到shpes[0]代表的是第⼀个⼈(可以同时检测到很多个⼈),part(i)代表的是第i个特征点,x()和y()是访问特征点坐标的途径。
每个特征点的编号如下:
在上述画图的基础上加了如下⼀⾏代码:
putText(temp, to_string(i), cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), CV_FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 0),1,4);
效果图:
对照着上图,⽐如说想获取⿐尖的坐标,那么横坐标就是shapes[0].part[30].x(),其余的类似。
在这个的基础上就可以做很多有意思的事情啦,2333
最后祝⼤家开发愉快:)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论