1、安装dlib
dlib官网(http://dlib.net/)这里好像只有最新的dlib版本包,下载选项在左下角有个蓝色的按钮,写着download
我用的还是目前最新的版本19.2,因为最新的dlib版本添加了一些新的人脸检测器,mmod+cnn算法,可以看看dlib的blog(http://blog.dlib.net/)。
2、 C++编译dlib
如果你是使用的C++,那么很简单,不用安装,直接按照官网的指示(也是在官网首页,左边栏目里有个how to compile(http://dlib.net/compile.html),这个指示只是交你怎么快速使用dlib库中的examples).
从官网下载的dlib文件如下:
从dlib的根目录执行下面语句即可:
>>首先进入dlib的根目录下
>>再执行如下语句:
cd examples #进入dlib下的examples文件夹
mkdir build #新建build文件夹,存放cmake编译后的执行文件
cd build #进入新建好的build文件夹
cmake .. #cmake编译examples整个文件夹
cmake --build . --config Release
最终,dlib/examples/build文件夹如下:
这只是编译好了examples下的dlib,要想编译整个dlib库,则执行以下代码即可:
>>进入dlib根目录下
mkdir build
cd build
cmake ..
make release=1
3、新建dlib工程
如果要自己建立工程,可以仿照dlib/examples/CMakeLists.txt,直接include(dlib/dlib/cmake)文件即可。
在其他地方新建工程(不要放dlib根目录下),首先新建一个文件夹放置工程,进入文件夹下,新建CMakeList.txt文件,可以采用vim指令编辑,如下参考如下代码:
vim CMakeList.txt
再将如下代码复制到CMakeList.txt中:
cmake_minimum_required(VERSION 2.8.4) #版本最小为2.8.4
PROJECT(dlib_facedetector) #设置工程名
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -DDLIB_JPEG_SUPPORT")
IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything")
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
ENDIF()
#INCLUDE OPENCV
FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
message(STATUS "Opencv include dir found at ${OpenCV_INCLUDE_DIRS}")
#包含头文件
INCLUDE_DIRECTORIES(/home/fr/fr/dlib) #dlib根目录地址
LINK_DIRECTORIES(/home/fr/fr/dlib/build/dlib/) #dlib编译后bulid下dlib地址
#生产类似于.exe的可执行文件
ADD_EXECUTABLE(dlib_detector dlib_test.cpp)
#链接库
TARGET_LINK_LIBRARIES(dlib_detector dlib ${OpenCV_LIBS})
#TARGET_LINK_LIBRARIES(dlib_detector libjpeg.so)
以上代码含OpenCV。
然后再自己vim test.cpp文件,编译执行,编译代码如下:
>>在自己建的工程文件夹下新建build文件夹
mkdir build
cd build
cmake ..
make -j8 #用make也行
编译正确后,在build文件夹中会出现dlib_detector:
这就是我们需要的可执行文件。
然后再执行.cpp文件,执行代码如下:
>>在build文件夹下继续执行一行代码即可显示结果:
./dlib_detector
注意:一旦我们修改过CMakeList.txt,我们需要将之前编译过的build文件删除掉,重新新建编译过一次
>>在工程目录下删除build文件夹,用rm -r指令
rm -r build
mkdir build
cd build
cmake ..
make -j8
4、dlib下examples中的Face Landmark Detection功能实现
按上述方法新建好了一个工程,将官网给的例程(http://dlib.net/face_landmark_detection_ex.cpp.html)复制在我们的.cpp中。
if (argc == 1)
{
cout << "Call this program like this:" << endl;
cout << "./face_landmark_detection_ex shape_predictor_68_face_landmarks.dat faces/*.jpg" << endl;
cout << "\nYou can get the shape_predictor_68_face_landmarks.dat file from:\n";
cout << "http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl;
return 0;
}
首先要去官网下载面部特征点检测模型(http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2),接着进行解压。这是一个.bz2的压缩文件,不是.dat.bz2,不要搞错了。
bunzip2 shape_predictor_68_face_landmarks.dat.bz2
注意,编译通过后运行.cpp根据程序内容,代码如下:
./dlib_detector ../shape_predictor_68_face_landmarks.dat ../*.jpg # ../*.jpg为实验图片地址
需要将源码给出的./face_landmark_detection_ex换成我们自己生成的./dlib_detector可执行文件
运行最后结果:
小图为7个人脸被剪切出来的图,已对齐。大图为7个人脸的68个特征点定位图。
我用自己的头像做了一次实验,结果如下:
我故意歪了一定角度的头,可以看到,小图中人脸已经矫正了。