本文共 4451 字,大约阅读时间需要 14 分钟。
关于libfacedetection库的配置及使用,以及用cmake来编译第三方开源库
这是一个基于cnn的图像人脸检测开源库。CNN 模型已转换为 C 源文件中的静态变量。源代码不依赖于任何其他库。您需要的只是一个C++编译器。您可以使用一个数据库的编译器在 Windows、Linux、ARM 和任何平台C++源代码。
将目录 src/ 中的文件复制到项目中,并将它们编译为项目中的其他文件。源代码以标准 C/C++。应在支持 C/C++ 的任何平台上编译。
在这个链接中,我们能看到libfacedetection库的所有内容,并下载、解压:
下载方式如下:
#include <iostream>#include <opencv2/opencv.hpp>#include <facedetectcnn.h>#define DETECT_BUFFER_SIZE 0x20000 //定义缓冲区大小#define FACEDETECTION_EXPORTusing namespace std;using namespace cv;int main() { Mat src, dst; src = imread("D:\\Myfile\\素材照片\\opencv素材照片\\7.jpg"); //导入需要识别的图像 if (!src.data) { //若不存在就返回 could not load your image! cout << "could not load your image!" << endl; return 0; } //pBuffer用来检测人脸 unsigned char* pBuffer = new unsigned char[DETECT_BUFFER_SIZE]; //multiple threads //是多线程时,要分配内存空间 if (!pBuffer) { //如果无法分配内存,就返回could not alloc buffer! cout << "could not alloc buffer!" << endl; return 0; } dst = src.clone(); //将src原图像复制给dst TickMeter myClock; //计时器 myClock.start(); int* pResults = NULL; //用来检测人脸 pResults = facedetect_cnn(pBuffer, (unsigned char*)(src.ptr(0)), src.cols, src.rows, src.step); //利用facedetect_cnn函数来获取人脸,用于存储人脸检测结果的缓冲存储器!其大小必须为0x20000字节 //facedetect_cnn函数识别的图像必须为BGR三通道的图像,而非rgb图像 myClock.stop(); cout << myClock.getTimeSec() << "s" << endl; //输出检测人脸耗费时长 for (int i = 0; i < (pResults ? (*pResults) : 0); i++) { //如果pResult为NULL,即pResult没有检测到人脸,就返回0,for循环结束 short* p = ((short*)(pResults + 1)) + (142 * i); //p指针用来指向 int confidence = p[0]; int x = p[1]; int y = p[2]; int w = p[3]; int h = p[4]; //显示脸的分数。其范围为[0-100] char sScore[256]; snprintf(sScore, 256, "%d", confidence); /*从给定位置加载数据,转换为字符串等价版本,并将结果写入各种池。 1) 写结果到 stdout 。2) 写结果到文件流 stream 。3) 写结果到字符串 buffer 。 4) 写结果到字符串 buffer 。至多写 buf_size - 1 个字符。产生的字符串会以空字符终止,除非 buf_size 为零。 若buf_size为零,则不写入任何内容,且buffer可以是空指针,然而依旧计算返回值(会写入的字符数,不包含空终止符)并返回。 若调用 sprintf 或 snprintf 导致在重叠的对象间发生复制,则行为未定义。 (例如 sprintf(buf, "%s text", buf); )*/ putText(dst, sScore, Point(x, y - 3), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1); //计算文本字符串的宽度和高度。 //把脸用矩形画出来 rectangle(dst, Rect(x, y, w, h), Scalar(0, 255, 0), 2); //画五个不同颜色的面部标志 circle(dst, Point(p[5], p[5 + 1]), 1, Scalar(255, 0, 0), 2); circle(dst, Point(p[5 + 2], p[5 + 3]), 1, Scalar(0, 0, 255), 2); circle(dst, Point(p[5 + 4], p[5 + 5]), 1, Scalar(0, 255, 0), 2); circle(dst, Point(p[5 + 6], p[5 + 7]), 1, Scalar(255, 0, 255), 2); circle(dst, Point(p[5 + 8], p[5 + 9]), 1, Scalar(0, 255, 255), 2); //circle()绘制简单或粗椭圆弧或填充椭圆扇区。 /* Point类的实例可以与C结构、CvPoint和CvPoint2D32f互换。 还有一个cast操作符将点坐标转换为指定的类型。 从浮点坐标到整数坐标的转换是通过舍入完成的。 通常,转换对每个坐标都使用此操作。 */ } namedWindow("output_detect_image", WINDOW_AUTOSIZE); imshow("output_detect_image", dst); //输出识别后的图像 waitKey(0); return 0;}
我们打开 facedetectcnn.h 的错误内容, 并修改.
在cmd中输入cmake,检查是否配置完成:
cd D:\\OpenCV4.5.1\\libfacedetection-master
mkdir build
cdbuild
cmake G "Visual Studio 15 2019 Win64" -T host=x64 ..
cmake --build . --config Release
输入时不能省略一个符号。
执行完后的结果:
1)facedetection_export.h 是运行cmake之后产生出来的2)先用cmake编译本项目,然后把生成的 facedetection_export.h 和源码一起复制到其它项目。3)增加 facedetection_export.h 文件,在其中定义宏 FACEDETECTION_EXPORT #define FACEDETECTION_EXPORT
效果如下:
方法 | 时间 | Fps | 时间 | Fps |
---|---|---|---|---|
X64 | X64 | X64 | ||
单线程 | 单线程 | 多线程 | ||
cnn (CPU, 640x480) | 58.03毫秒 | 17.23 | 13.85毫秒 | 72.20 |
cnn (CPU, 320x240) | 14.18毫秒 | 70.51 | 3.38 毫秒 | 296.21 |
cnn (CPU, 160x120) | 3.25 毫秒 | 308.15 | 0.82毫秒 | 1226.56 |
cnn (CPU, 128x96) | 2.11毫秒 | 474.38 | 0.52毫秒 | 1929.60 |
最小面尺寸 ±10x10
英特尔(R)核心(TM) i7-1065G7 CPU = 1.3GHz
本文讲述了libfacedetection库的定义及安装,在vs2019中配置;
讲述了如何用cmake来编译第三方开源库。
如有疑问,请留言!
如有错误,敬请指教!
转载地址:http://mlnwz.baihongyu.com/