于仕琪老师的人脸库怎么识别68点?
opencv吧
全部回复
仅看楼主
level 1
天堂悠悠 楼主
#include <stdio.h>
#include<opencv2/opencv.hpp>
#include<facedetectcnn.h>
#include<opencv2/highgui/highgui_c.h>
//定义缓冲区大小。不要改变尺寸!
#define DETECT_BUFFER_SIZE 0x20000
using namespace cv;
int main()
{
//加载照片
Mat image = imread("D:\\test\\oldImg\\1.jpg");
cv::resize(image, image, cv::Size(image.cols*0.2, image.rows*0.2)); if (image.empty())
{
fprintf(stderr, "无法加载图像文件 %s.\n", image);
return -1;
} int * pResults = NULL;
// pBuffer用于检测功能。
//如果你在多个线程中调用函数,请为每个线程创建一个缓冲区!
unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
if (!pBuffer)
{
fprintf(stderr, "Can not alloc buffer.\n");
return -1;
}
///////////////////////////////////////////
// CNN面部检测
//最佳检测率
//////////////////////////////////////////
//! 输入图像必须是BGR(三通道)而不是RGB
//! 不要释放pResults !!!
pResults = facedetect_cnn(pBuffer, (unsigned char*)(image.ptr(0)), image.cols, image.rows, (int)image.step); printf("%d 检测到面孔.\n", (pResults ? *pResults : 0));
Mat result_cnn = image.clone();
//打印检测结果
for (int i = 0; i < (pResults ? *pResults : 0); i++)
{
short * p = ((short*)(pResults + 1)) + 142 * i;
int x = p[0];
int y = p[1];
int w = p[2];
int h = p[3];
int confidence = p[4];
int angle = p[5]; printf("face_rect=[%d, %d, %d, %d], confidence=%d, angle=%d\n", x, y, w, h, confidence, angle);
//画框
rectangle(result_cnn, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
//画68点
for (int j = 0; j < 68; j++){
circle(result_cnn, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 0, 255), 2);
}
}
imshow("result_cnn", result_cnn); waitKey(); //释放缓冲区
free(pBuffer);
return 0;
}
我根据网上的资料,但是画不出68点
2019年05月23日 04点05分 1
level 1
根本没有,网上都是乱写的。
我用dlib实现了,最好使用opencv截取出脸的部分再用dlib库定位68个特征点,毫秒级别!!
2020年01月16日 03点01分 2
你好,可以加个qq或者微信聊一下吗,我也想弄这个
2022年03月03日 12点03分
level 1
老版本的有的,也是毫秒级别的,效果还可以的
2021年08月10日 04点08分 3
1