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

好了,这一篇就介绍下第一部分Face Detection的编译和使用。

首先是编译工具,这里SeetaFace要用到OpenCV,编译用的VS2013;然后是下载GitHub的源码,GitHub上已经有seetaFace2了,但是我打开之后好像只有一些文件夹,没有具体的文件,所以,估计是暂时还没有吧,所以还是用的seetaFace。

这个编译过程还是比较简单的,步骤如下:

1、打开VS2013后创建一个空的DLL工程:

更改编译其设置为x64,这个看自己需求了,我基本上大部分程序都告别win32了,所以用的x64:

添加include:

添加OpenCV的lib路径和依赖项文件

添加detection的源文件到工程中:

也就是SeetaFaceEngine\FaceDetection\src下的所有文件和文件夹(除了test)复制到工程下,并添加到工程中,然后修改预编译器设置:

然后打开OpenMP设置:

然后就编译工程就可以了,同样Release下也是这样设置。

2、使用例程:

这里用的是SeetaFace的例子:FaceDetection\src\test的facedetection_test.cpp

    
int testFaceDetection(std::string src_Path)    
{
    std::string path = "D:/SeetaFaceEngine/include_lib/model/FaceDetection/seeta_fd_frontal_v1.0.bin";
seeta::FaceDetection detector(); detector.SetMinFaceSize(40);
detector.SetScoreThresh(2.f);
detector.SetImagePyramidScaleFactor(0.8f);
detector.SetWindowStep(4, 4); cv::Mat img = cv::imread(src_Path, cv::IMREAD_UNCHANGED);
cv::Mat img_gray; if (img.channels() != 1)
cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY);
else
img_gray = img; seeta::ImageData img_data;
img_data.data = img_gray.data;
img_data.width = img_gray.cols;
img_data.height = img_gray.rows;
img_data.num_channels = 1; long t0 = cv::getTickCount();
std::vector<seeta::FaceInfo> faces = detector.Detect(img_data);
long t1 = cv::getTickCount();
double secs = (t1 - t0) / cv::getTickFrequency(); std::cout << "Detections takes " << secs << " seconds " << std::endl;
#ifdef USE_OPENMP
std::cout << "OpenMP is used." << std::endl;
#else
std::cout << "OpenMP is not used. " << std::endl;
#endif #ifdef USE_SSE
std::cout << "SSE is used." << std::endl;
#else
std::cout << "SSE is not used." << std::endl;
#endif std::cout << "Image size (wxh): " << img_data.width << "x" << img_data.height << std::endl; cv::Rect face_rect;
int32_t num_face = static_cast<int32_t>(faces.size()); for (int32_t i = 0; i < num_face; i++) 
{
face_rect.x = faces[i].bbox.x;
face_rect.y = faces[i].bbox.y;
face_rect.width = faces[i].bbox.width;
face_rect.height = faces[i].bbox.height; cv::rectangle(img, face_rect, CV_RGB(0, 0, 255), 2, 8, 0);
} cv::namedWindow("Test", cv::WINDOW_AUTOSIZE);
cv::imshow("Test", img);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}

人脸检测结果如下:

速度上还是慢了一点,可能还跟前面的参数设置有关。

玉阶生白露,夜久侵罗袜。

却下水晶帘,玲珑望秋月。

--李白 《玉阶怨》

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

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

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

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

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

  3. 读论文系列:Object Detection CVPR2016 YOLO

    CVPR2016: You Only Look Once:Unified, Real-Time Object Detection 转载请注明作者:梦里茶 YOLO,You Only Look Once ...

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

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

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

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

  6. JVM系列之二:编译过程

    1. Java的编译和执行 编译包括两种情况: 1,源码编译成字节码2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行2,字节码解释执行 解释和编译执行的 ...

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

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

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

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

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

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

随机推荐

  1. HihoCoder第十三周:最近公共祖先 一

    #1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? "为什么呢?& ...

  2. Web前端开发CSS规范总结

    作为Web前端开发必备语言,CSS为大家广为熟知,今天就跟大家分享下CSS规范总结,Web前端的小伙伴们看过来吧! CSS样式的权值(权重) 权值等级的定义 第一等:代表内联样式,如: style=” ...

  3. JavaScript获取当前日期前后7天的日期

    function fun_date(aa){ var date1 = new Date(), time1=date1.getFullYear()+"-"+(date1.getMon ...

  4. kibana下载与安装

    目录 简介 下载 安装 测试 简介 Kibana是一个为ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作.安装之前有话说: 安装路径不要 ...

  5. python---函数作用域

    1.作用域 local:局部作用域 E(Enclosing):闭包函数外的函数中     G(global): 全局作用域 B(Build-in):內建作用域 查找变量的顺序,从上到下 2.函数内的变 ...

  6. mybaits的注解方式与配置文件方式比较

    注解方式比配置文件方式简单了更多. 俩种配置 一个是制定配置文件路径,一个直接class指向dao层接口 只需加一个注解@**** 就能够实现 比写一个xml的配置文件简单更多.

  7. 基于UWB技术的DW1000芯片简单解析

    近些年来随着物联网和机器人技术的大发展,精确定位技术的热度也随之攀升.目前精确定位的技术有很多,如基于wifi.RFID.zigbee.超声波.UWB等技术都可以实现精准定位.由于技术的不同,精度也不 ...

  8. 2.7 app的本地化(根据手机的系统进行语言切换)

    首先设计一个基本的界面:系统默认为英文 如图所示: 找到如下路径: res/values/strings/strings.xml 如图所示: 然后点击右上方的open editor 添加需要的字符串如 ...

  9. ACM蒟蒻防bug专用 ( •̀ ω •́ )✧

    /*********************************************** * _ooOoo_ * * o8888888o * * 88" . "88 * * ...

  10. jQuery中的一些方法 19.5.20课上笔记

    after() insertAfter():特定元素后面插入新的节点 before() insertBefore():特定元素前面插入新的节点 append() appendTo():向特定元素元素内 ...