前面一篇写了编译人脸检测部分,现在就介绍下人脸配准部分,SeetaFace的Face Alignment通过人脸的五个关键点来配准人脸,也就是双眼、鼻尖、两个嘴角。

这部分的编译也和上一篇一样,步骤如下:

1、创建空的DLL工程:

2、修改配置器:

3、添加include:

这里要注意,因为人脸配准需要先检测人脸,会用到前面配置好的人脸检测,所以要加上其头文件;

4、添加Lib文件路径和依赖项

5、修改预处理器:

6、打开OpenMP:

7、添加源文件到工程:

一样,先将SeetaFaceEngine\FaceDetection\src下的所有文件和文件夹(test除外)都复制到工程目录下,并将全部文件添加到工程中。

8、编译工程(Release的步骤也是一样的)

9、使用Face Alignment

这里使用的是FaceAlignment\src\test下的face_alignment_test.cpp,需要根据自己的路径修改模型和数据的路径

int testFaceAlignment(std::string src_Path)
{
seeta::FaceDetection detector("D:/SeetaFaceEngine/include_lib/model/FaceDetection/seeta_fd_frontal_v1.0.bin");
detector.SetMinFaceSize(40);
detector.SetScoreThresh(2.f);
detector.SetImagePyramidScaleFactor(0.8f);
detector.SetWindowStep(4, 4); // Initialize face alignment model 
seeta::FaceAlignment point_detector((MODEL_DIR + "seeta_fa_v1.1.bin").c_str()); //load image
IplImage *img_grayscale = NULL;
img_grayscale = cvLoadImage(src_Path.c_str(), 0);
if (img_grayscale == NULL)
{
return 0;
} IplImage *img_color = cvLoadImage(src_Path.c_str(), 1);
int pts_num = 5;
int im_width = img_grayscale->width;
int im_height = img_grayscale->height;
unsigned char* data = new unsigned char[im_width * im_height];
unsigned char* data_ptr = data;
unsigned char* image_data_ptr = (unsigned char*)img_grayscale->imageData;
int h = 0;
for (h = 0; h < im_height; h++) 
{
memcpy(data_ptr, image_data_ptr, im_width);
data_ptr += im_width;
image_data_ptr += img_grayscale->widthStep;
} seeta::ImageData image_data;
image_data.data = data;
image_data.width = im_width;
image_data.height = im_height;
image_data.num_channels = 1; // Detect faces
std::vector<seeta::FaceInfo> faces = detector.Detect(image_data);
int32_t face_num = static_cast<int32_t>(faces.size()); if (face_num == 0)
{
delete[]data;
cvReleaseImage(&img_grayscale);
cvReleaseImage(&img_color);
return 0;
} // Detect 5 facial landmarks
seeta::FacialLandmark points[5];
point_detector.PointDetectLandmarks(image_data, faces[0], points); // Visualize the results
cvRectangle(img_color, cvPoint(faces[0].bbox.x, faces[0].bbox.y), cvPoint(faces[0].bbox.x + faces[0].bbox.width - 1, faces[0].bbox.y + faces[0].bbox.height - 1), CV_RGB(255, 0, 0));
for (int i = 0; i < pts_num; i++)
{
cvCircle(img_color, cvPoint(points[i].x, points[i].y), 2, CV_RGB(0, 255, 0), CV_FILLED);
}
//  cvSaveImage("result.jpg", img_color);
cvShowImage("dst", img_color);
cvWaitKey(0); // Release memory
cvReleaseImage(&img_color);
cvReleaseImage(&img_grayscale);
delete[]data;
}

关键点检测的结果:

桃源一向绝风尘柳市南头访隐沦。

到门不敢题凡鸟,看竹何须问主人。

城上青山如屋里,东家流水入西邻。

闭户著书多岁月,种松皆老作龙鳞。

-- 王维 《春日与裴迪过新昌里访吕逸人不遇》

SeetaFaceEngine系列2:Face Alignment编译和使用的更多相关文章

  1. SeetaFaceEngine系列3:Face Identification编译和使用

    前面两篇介绍了怎样编译SeetaFace的前两部分,现在就来讲下第三部分Face Identification的编译和使用. 其实,步骤基本上是一直的,如下: 1.新建一个空的DLL工程: 2.修改配 ...

  2. SeetaFaceEngine系列1:Face Detection编译和使用

    SeetaFace,根据GitHub上的介绍,就是一个开源的人脸检测.矫正和识别的开源库,是采用C++来编写的,并且是在CPU上执行的,没有用到GPU,但是可以用SSE或者OpenMP来加速.整个库分 ...

  3. Linux Kernel系列三:Kernel编译和链接中的linker script语法详解

    先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...

  4. spring源代码系列(一)sring源代码编译 spring源代码下载 spring源代码阅读

    想对spring框架进行深入的学习一下,看看源码,提升和沉淀下自己,工欲善其事必先利其器,还是先搭建好开发环境吧. 环境搭建 sping源代码之前是svn管理,如今已经迁移到了github中了.新版本 ...

  5. [ffmpeg 扩展第三方库编译系列] 关于libopenjpeg mingw32编译问题

    在mingw32如果想编译libopenjpeg 会比较麻烦 会出现undefined reference to `_imp__opj_destroy_cstr_info@4' 等错误 因此编译时候需 ...

  6. [ffmpeg 扩展第三方库编译系列] 关于libvpx mingw32编译问题

    在编译libvpx的时候遇到挺多的问题, 1.[STRIP] libvpx.a < libvpx_g.a strip: Bad file number   这个错误也是比较难搞的,一开始以为只是 ...

  7. [ffmpeg 扩展第三方库编译系列] frei0r mingw32 下编译问题

    在编译安装frei0r的时候遇到两个错误地方, 两个都是在install的时候. 一开始编译都很顺利,输入了 make install之后就走开了,回来一看,报错误. 提示mkdir -p //usr ...

  8. [ffmpeg 扩展第三方库编译系列] 关于 mingw32 下编译libcaca

    在编译前最好先看一下帮助 ./configure --help 开始编译 ./configure  --disable-shared --disable-cxx \ --disable-csharp ...

  9. 初识google多语言通信框架gRPC系列(二)编译gRPC

    目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要 ...

随机推荐

  1. Echarts词云图

    今天使用Echarts写了个词云图,之前使用pycharts生成的html就是echarts.主要代码如下,另外Echarts需要到https://www.echartsjs.com/下载,开发时使用 ...

  2. Vulkan 之 Layers

    Layers 暴露给api层,不像传统图形API集成在驱动里面,开发者根据自己的需要进行开启,最终目的还是为了提高性能. The Loader he loader is the central arb ...

  3. 148-PHP strip_tags函数,剥去字符串中的 HTML 标签(二)

    <?php //定义一段包含PHP代码的字符串 $php=<<<PHP 这里是PHP代码的开始 <?php echo "hello!"; PHP; $ ...

  4. Spark 2.x Troubleshooting Guide

    IBM在spark summit上分享的内容,包括编译spark源码,运行spark时候常见问题(缺包.OOM.GC问题.hdfs数据分布不均匀等),spark任务堆/thread dump 目录 编 ...

  5. kubernter相关内容

    1. Kubernetes 第一章:互联网架构的演变 随着1946年世界上第一台电子计算机的问世网络就随之出现了,只不过当初只是为了解决多个终端之间的连接,这就是局域网的雏形.后来,随着美国国防部高级 ...

  6. windows driver 映射大文件

    //如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射 NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING( ...

  7. weex 随笔

    1.三大模块: <template>:样板,内容区 <style>:css <script>: js <script> export default{ ...

  8. Java IO 乱码

    InputStreamReader isr = new InputStreamReader(new FileInputStream("./test/垃圾短信训练集80W条.txt" ...

  9. @SpringBootApplication-exclude和扫描并装配其他包下的bean(@AliasFor)

    1.exclude 不装配指定bean @SpringBootApplication(exclude={com.ebc.User.class}) 2.scanBasePackages package ...

  10. 【转】centos7轻松搭建文件服务器

    1.安装apache服务器 yum install httpd 2:启动httpd服务 service httpd start 3:查看httpd服务器的版本 4:修改访问端口和文件路径,以防端口冲突 ...