opencv人脸识别-开源库

opencv人脸识别-开源库

开源库的简介

  1. 这个开源库是深圳大学的一个教授(于仕琪)写的,其中比较有名的就是维护着opencv中文站,翻译了learning opencv等书籍;(https://github.com/ShiqiYu/libfacedetection)
  2. 其实想自己写一点的,但是又不想更改原创老师的本意,就以于老师的为准吧(A fast binary library for face detection and face landmark detection in images. The face detection speed can reach 1500FPS. )是不是很变态的数字1500fps;

导入的步奏

  1. 新建一个工程+源文件/添加/现有项+example code;

  2. 点击属性+/C/C++ +/常规+/附加包含目录/+导入的include路径名;D:\code\opencv\libfacedetection-master\libfacedetection-master\include

  3. 属性+/链接器+/输入 + /附加依赖项 libfacedetect.lib 、libfacedetect-x64.lib

  4. 此时就可以运行了,会出现错误,但同时也会生成debug文件,将那两个dll文件拷贝到这个文件夹下面 libfacedetect.dll 和 libfacedetect-x64.dll

  5. 会出现此类问题错误 error LNK1104: 无法打开文件“libfacedetect.lib” D:\code\opencv\facetest-test\facetest-test\LINK facetest-test

  6. 解决方案: 属性+/链接器+/常规 + /启用增量链接 改为是 并添加/附加库目录 +D:\code\opencv\libfacedetection-master\libfacedetection-master\lib

代码的修改

  1. 由于样例代码是做单张图片的识别并标注的,若是想要实时的识别必须改为摄像头实时获取到的图像,
  2. 由于代码中涉及到了四种方法,可以分别注释的方式来看运行的速度fps;

直接上代码

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "facedetect-dll.h"

//#pragma comment(lib,"libfacedetect.lib")
#pragma comment(lib,"libfacedetect-x64.lib")

//define the buffer size. Do not change the size!
#define DETECT_BUFFER_SIZE 0x20000
using namespace cv;
//unsigned char * pBuffer1=NULL;
//unsigned char * pBuffer2 = NULL;
//unsigned char * pBuffer3 = NULL;
unsigned char * pBuffer4 = NULL;


void  detectAndDraw(Mat image);
int main(int argc, char* argv[])
{
 /*   if(argc != 2)
{
    printf("Usage: %s <image_file_name>\n", argv[0]);
    return -1;
}*/

cv::VideoCapture camera(CV_CAP_ANY);
if (!camera.isOpened())
    return -1;



//load an image and convert it to gray (single-channel)
//Mat image = imread(argv[1]); 
Mat image;

while (true){

    if (!camera.read(image))break;
        detectAndDraw(image);
        int c = waitKey(20);
        if ((char)c == 27)break;
}




//cvDestroyWindow("result");
camera.release();

//release the buffer
//free(pBuffer1);
//free(pBuffer2);
//free(pBuffer3);
free(pBuffer4);
return 0;
}


void  detectAndDraw(Mat image){
Mat gray;
cvtColor(image, gray, CV_BGR2GRAY);


int * pResults = NULL;
//pBuffer is used in the detection functions.
//If you call functions in multiple threads, please create one buffer for each thread!
int doLandmark = 1;

//if (pBuffer1)
//{
//  //fprintf(stderr, "Can not alloc buffer.\n");
//  //return -1;
//}
//else{
//  pBuffer1 = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
//}



///////////////////////////////////////////
// frontal face detection / 68 landmark detection
// it's fast, but cannot detect side view faces
//////////////////////////////////////////
//!!! The input image must be a gray one (single-channel)
//!!! DO NOT RELEASE pResults !!!
//pResults = facedetect_frontal(pBuffer1, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
//  1.2f, 2, 48, 0, doLandmark);

//printf("%d faces detected.\n", (pResults ? *pResults : 0));
//Mat result_frontal = image.clone();
////print the detection results
//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 neighbors = p[4];
//  int angle = p[5];

//  printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x, y, w, h, neighbors, angle);
//  rectangle(result_frontal, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
//  if (doLandmark)
//  {
//      for (int j = 0; j < 68; j++)
//          circle(result_frontal, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 255, 0));
//  }
//}
//imshow("Results_frontal", result_frontal);


/////////////////////////////////////////////
//// frontal face detection designed for video surveillance / 68 landmark detection
//// it can detect faces with bad illumination.
////////////////////////////////////////////
////!!! The input image must be a gray one (single-channel)
////!!! DO NOT RELEASE pResults !!!

//if (pBuffer2)
//{
//  //fprintf(stderr, "Can not alloc buffer.\n");
//  //return -1;
//}
//else{
//   pBuffer2 = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
//}
//pResults = facedetect_frontal_surveillance(pBuffer2, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
//  1.2f, 2, 48, 0, doLandmark);
//printf("%d faces detected.\n", (pResults ? *pResults : 0));
//Mat result_frontal_surveillance = image.clone();;
////print the detection results
//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 neighbors = p[4];
//  int angle = p[5];

//  printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x, y, w, h, neighbors, angle);
//  rectangle(result_frontal_surveillance, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
//  if (doLandmark)
//  {
//      for (int j = 0; j < 68; j++)
//          circle(result_frontal_surveillance, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 255, 0));
//  }
//}
//imshow("Results_frontal_surveillance", result_frontal_surveillance);


/////////////////////////////////////////////
//// multiview face detection / 68 landmark detection
//// it can detect side view faces, but slower than facedetect_frontal().
////////////////////////////////////////////
////!!! The input image must be a gray one (single-channel)
////!!! DO NOT RELEASE pResults !!!

//if (pBuffer3)
//{
//  //fprintf(stderr, "Can not alloc buffer.\n");
//  //return -1;
//}
//else{
//   pBuffer3 = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
//}
//pResults = facedetect_multiview(pBuffer3, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
//  1.2f, 2, 48, 0, doLandmark);

//printf("%d faces detected.\n", (pResults ? *pResults : 0));
//Mat result_multiview = image.clone();;
////print the detection results
//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 neighbors = p[4];
//  int angle = p[5];

//  printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x, y, w, h, neighbors, angle);
//  rectangle(result_multiview, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
//  if (doLandmark)
//  {
//      for (int j = 0; j < 68; j++)
//          circle(result_multiview, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 255, 0));
//  }
//}
//imshow("Results_multiview", result_multiview);


/////////////////////////////////////////////
//// reinforced multiview face detection / 68 landmark detection
//// it can detect side view faces, better but slower than facedetect_multiview().
////////////////////////////////////////////
////!!! The input image must be a gray one (single-channel)
////!!! DO NOT RELEASE pResults !!!

if (pBuffer4)
{
    //fprintf(stderr, "Can not alloc buffer.\n");
    //return -1;
}
else{
    pBuffer4 = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
}
pResults = facedetect_multiview_reinforce(pBuffer4, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
    1.2f, 3, 48, 0, doLandmark);

printf("%d faces detected.\n", (pResults ? *pResults : 0));
Mat result_multiview_reinforce = image.clone();;
//print the detection results
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 neighbors = p[4];
    int angle = p[5];

    printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x, y, w, h, neighbors, angle);
    rectangle(result_multiview_reinforce, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
    if (doLandmark)
    {
        for (int j = 0; j < 68; j++)
            circle(result_multiview_reinforce, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 255, 0));
    }
}
imshow("Results_multiview_reinforce", result_multiview_reinforce);

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容