KeypointExtractUsingDlib
Extract the key point from the face point cloud.
使用Intel Realsense相机提取出包含人脸的点云中人脸的关键点,使用了dlib库对点云中的人脸进行识别。
识别点数为68点,也可使用5点,但需更改部分代码。
有些代码直接使用了librealsense的dlib示例。
github链接:https://github.com/binfenseca2969/KeypointExtractUsingDlib
参考代码
librealsense的dlib示例:https://github.com/IntelRealSense/librealsense/tree/master/wrappers/dlib
利用IntelRealSense D435i 提取一帧pcl::PointXYZRGB图像(C++):https://blog.csdn.net/m0_56838271/article/details/121157332
代码环境
Windows 10 22H2,PCL-1.12.0,librealsense-2.53.1,dlib-19.24,使用Visual Studio 2019,RelWithDebInfo,CMake-3.20,使用的Realsense相机为D405。
附件下载
shape_predictor_68_face_landmarks.dat下载网址:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
结果
平板找的Lena图,红色为识别出的关键点,真人也可以(但是不想放自己的照片……)。
代码
CMakelists.txt
# CMakeList.txt: KeypointExtractUsingDlibNew 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.12)
project ("KeypointExtractUsingDlib")
find_package(realsense2 REQUIRED)
if(NOT realsense2_FOUND)
message(FATAL_ERROR "Error: Unable to find the realsense2 folder.")
endif()
find_package(dlib REQUIRED)
if(NOT dlib_FOUND)
message(FATAL_ERROR "Error: Unable to find the dlib folder.")
endif()
find_package(PCL REQUIRED)
if(NOT PCL_FOUND)
message(FATAL_ERROR "Error: Unable to find the PCL folder.")
endif()
# 将源代码添加到此项目的可执行文件。
add_executable (KeypointExtractUsingDlib "KeypointExtractUsingDlibNew.cpp" "KeypointExtractUsingDlibNew.h" "rs_frame_image.h" "markup_68.h")
target_link_libraries(KeypointExtractUsingDlib PRIVATE
dlib::dlib ${
realsense2_LIBRARY} ${
PCL_LIBRARIES})
target_include_directories(KeypointExtractUsingDlib PRIVATE
${
dlib_INCLUDE_DIRS} ${
realsense2_INCLUDE_DIR} ${
PCL_INCLUDE_DIRS})
# TODO: 如有需要,请添加测试并安装目标。
markup_68.h
// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2019 Intel Corporation. All Rights Reserved.
#pragma once
/*
The 68-point annotations for the iBUG 300-W face landmark dataset.
See this picture:
https://ibug.doc.ic.ac.uk/media/uploads/images/annotpics/figure_68_markup.jpg
NOTE: the indexes in the picture are 1-based, so the actual C++ indexes are less 1.
NOTE: "Right" and "left" refer to the face being described, so are the mirror of the
side that an onlooker (from the front) would see.
*/
enum markup_68
{
// Starting with right ear, the jaw [1-17]
RIGHT_EAR, JAW_FROM = RIGHT_EAR, RIGHT_JAW_FROM = RIGHT_EAR,
RIGHT_1, RIGHT_2, RIGHT_3, RIGHT_4, RIGHT_5, RIGHT_6, RIGHT_7, RIGHT_JAW_TO = RIGHT_7,
CHIN, CHIN_FROM = CHIN - 1, CHIN_TO = CHIN + 1,
LEFT_7 = CHIN + 1, LEFT_JAW_FROM = LEFT_7, LEFT_6, LEFT_5, LEFT_4, LEFT_3, LEFT_2, LEFT_1,
LEFT_EAR, LEFT_JAW_TO = LEFT_EAR, JAW_TO = LEFT_EAR,
// Eyebrows [18-22] and [23-27]
RIGHT_EYEBROW_R, RIGHT_EYEBROW_FROM = RIGHT_EYEBROW_R, RIGHT_EYEBROW_1, RIGHT_EYEBROW_2, RIGHT_EYEBROW_3, RIGHT_EYEBROW_L, RIGHT_EYEBROW_TO = RIGHT_EYEBROW_L,
LEFT_EYEBROW_R, LEFT_EYEBROW_FROM = LEFT_EYEBROW_R, LEFT_EYEBROW_1, LEFT_EYEBROW_2, LEFT_EYEBROW_3, LEFT_EYEBROW_L, LEFT_EYEBROW_TO = LEFT_EYEBROW_L,
// Nose [28-36]
NOSE_RIDGE_TOP, NOSE_RIDGE_FROM = NOSE_RIDGE_TOP, NOSE_RIDGE_1, NOSE_RIDGE_2, NOSE_TIP, NOSE_RIDGE_TO = NOSE_TIP,
NOSE_BOTTOM_R, NOSE_BOTTOM_FROM = NOSE_BOTTOM_R, NOSE_BOTTOM_1, NOSE_BOTTOM_2, NOSE_BOTTOM_3, NOSE_BOTTOM_L, NOSE_BOTTOM_TO = NOSE_BOTTOM_L,
// Eyes [37-42] and [43-48]
RIGHT_EYE_R, RIGHT_EYE_FROM = RIGHT_EYE_R, RIGHT_EYE_1, RIGHT_EYE_2, RIGHT_EYE_L, RIGHT_EYE_4, RIGHT_EYE_5, RIGHT_EYE_TO = RIGHT_EYE_5,
LEFT_EYE_R, LEFT_EYE_FROM = LEFT_EYE_R, LEFT_EYE_1, LEFT_EYE_2, LEFT_EYE_L, LEFT_EYE_4, LEFT_EYE_5, LEFT_EYE_TO = LEFT_EYE_5,
// Mouth [49-68]
MOUTH_R, MOUTH_OUTER_R = MOUTH_R, MOUTH_OUTER_FROM = MOUTH_OUTER_R, MOUTH_OUTER_1, MOUTH_OUTER_2, MOUTH_OUTER_TOP, MOUTH_OUTER_4, MOUTH_OUTER_5,
MOUTH_L, MOUTH_OUTER_L = MOUTH_L, MOUTH_OUTER_7, MOUTH_OUTER_8, MOUTH_OUTER_BOTTOM, MOUTH_OUTER_10, MOUTH_OUTER_11, MOUTH_OUTER_TO = MOUTH_OUTER_11,
MOUTH_INNER_R, MOUTH_INNER_FROM = MOUTH_INNER_R, MOUTH_INNER_1, MOUTH_INNER_TOP, MOUTH_INNER_3,
MOUTH_INNER_L, MOUTH_INNER_5, MOUTH_INNER_BOTTOM, MOUTH_INNER_7, MOUTH_INNER_TO = MOUTH_INNER_7,
N_POINTS
};