opencv人臉識(shí)別-開源庫(kù)

opencv人臉識(shí)別-開源庫(kù)

開源庫(kù)的簡(jiǎn)介

  1. 這個(gè)開源庫(kù)是深圳大學(xué)的一個(gè)教授(于仕琪)寫的季俩,其中比較有名的就是維護(hù)著opencv中文站,翻譯了learning opencv等書籍聊闯;(https://github.com/ShiqiYu/libfacedetection)
  2. 其實(shí)想自己寫一點(diǎn)的麦向,但是又不想更改原創(chuàng)老師的本意子檀,就以于老師的為準(zhǔn)吧(A fast binary library for face detection and face landmark detection in images. The face detection speed can reach 1500FPS. )是不是很變態(tài)的數(shù)字1500fps;

導(dǎo)入的步奏

  1. 新建一個(gè)工程+源文件/添加/現(xiàn)有項(xiàng)+example code陶衅;

  2. 點(diǎn)擊屬性+/C/C++ +/常規(guī)+/附加包含目錄/+導(dǎo)入的include路徑名屡立;D:\code\opencv\libfacedetection-master\libfacedetection-master\include

  3. 屬性+/鏈接器+/輸入 + /附加依賴項(xiàng) libfacedetect.lib 、libfacedetect-x64.lib

  4. 此時(shí)就可以運(yùn)行了搀军,會(huì)出現(xiàn)錯(cuò)誤膨俐,但同時(shí)也會(huì)生成debug文件,將那兩個(gè)dll文件拷貝到這個(gè)文件夾下面 libfacedetect.dll 和 libfacedetect-x64.dll

  5. 會(huì)出現(xiàn)此類問題錯(cuò)誤 error LNK1104: 無法打開文件“l(fā)ibfacedetect.lib” D:\code\opencv\facetest-test\facetest-test\LINK facetest-test

  6. 解決方案: 屬性+/鏈接器+/常規(guī) + /啟用增量鏈接 改為是 并添加/附加庫(kù)目錄 +D:\code\opencv\libfacedetection-master\libfacedetection-master\lib

代碼的修改

  1. 由于樣例代碼是做單張圖片的識(shí)別并標(biāo)注的罩句,若是想要實(shí)時(shí)的識(shí)別必須改為攝像頭實(shí)時(shí)獲取到的圖像焚刺,
  2. 由于代碼中涉及到了四種方法,可以分別注釋的方式來看運(yùn)行的速度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);

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市门烂,隨后出現(xiàn)的幾起案子乳愉,更是在濱河造成了極大的恐慌,老刑警劉巖屯远,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔓姚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡慨丐,警方通過查閱死者的電腦和手機(jī)坡脐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來房揭,“玉大人备闲,你說我怎么就攤上這事晌端。” “怎么了恬砂?”我有些...
    開封第一講書人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵咧纠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我泻骤,道長(zhǎng)惧盹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任瞪讼,我火速辦了婚禮,結(jié)果婚禮上粹断,老公的妹妹穿的比我還像新娘符欠。我一直安慰自己,他們只是感情好瓶埋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開白布希柿。 她就那樣靜靜地躺著,像睡著了一般养筒。 火紅的嫁衣襯著肌膚如雪曾撤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評(píng)論 1 291
  • 那天晕粪,我揣著相機(jī)與錄音挤悉,去河邊找鬼。 笑死巫湘,一個(gè)胖子當(dāng)著我的面吹牛装悲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尚氛,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诀诊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了阅嘶?” 一聲冷哼從身側(cè)響起属瓣,我...
    開封第一講書人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讯柔,沒想到半個(gè)月后抡蛙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷杏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年溜畅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极祸。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慈格,死狀恐怖怠晴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浴捆,我是刑警寧澤蒜田,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站选泻,受9級(jí)特大地震影響冲粤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜页眯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一梯捕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窝撵,春花似錦傀顾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赐劣,卻和暖如春嫉拐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魁兼。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工婉徘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咐汞。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓判哥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碉考。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塌计,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容