6g下載網
當前位置: 主頁 > 軟件教程 > 編程開發 >

于仕祺老師人臉檢測操作實戰教程

時間: 2016-09-06 23:04 來源: 本站整理

分享到:

今天小編整理一篇于仕祺老師人臉檢測操作實戰教程的文章和大家分享,希望能給大家提供幫助。

前言

本次編寫所用的庫為于仕祺老師免費提供的人臉檢測庫。真心好用,識別率和識別速度完全不是Opencv自帶的程序能夠比擬的。將其配合Opencv的EigenFace算法,基本上可以形成一個小型的畢業設計。

準備工作

1、下載在GitHub上的人臉檢測庫。我不提供百度云,只提供網址:https://github.com/ShiqiYu/libfacedetection。

2、配置好Opencv。

配置人臉檢測庫

1、新建一個MFC程序。

于仕祺老師人臉檢測操作實戰教程

2、添加Opencv的屬性表。(即配置Opencv)

于仕祺老師人臉檢測操作實戰教程

3、新建一個屬性表,命名為libfacedetect。需要注意的是,libfacedetect只可用Win32平臺。在VC++目錄添加libfacedetect_master中include文件夾和lib庫的位置。

于仕祺老師人臉檢測操作實戰教程

4、在鏈接器中添加附加依賴項。

于仕祺老師人臉檢測操作實戰教程

試編寫

1、向MFC中添加一個picture控件,一個button控件,兩個Static Text控件。而后向其中一個Static Text添加變量。

于仕祺老師人臉檢測操作實戰教程

2、雙擊button控件,進行代碼頁面,編寫代碼。

添加頭文件:

  1. #include <opencv.hpp>  
  2. #include "facedetect-dll.h"  
  3. #pragma comment(lib,"libfacedetect.lib")  
  4. sing namespace cv; 

增添一個函數:

  1. void detectAndDisplay(Mat frame)  
  2. {  
  3.         Mat gray;  
  4.         cvtColor(frame, gray, CV_BGR2GRAY);  
  5.         int * pResults = NULL;  
  6.         pResults = facedetect_frontal_tmp((unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, gray.step,  
  7.             1.2f, 5, 24);  
  8.         printf("%d faces detected.\n", (pResults ? *pResults : 0));//重復運行  
  9.         //print the detection results  
  10.         for (int i = 0; i < (pResults ? *pResults : 0); i++)  
  11.         {  
  12.  
  13.             short * p = ((short*)(pResults + 1)) + 6 * i;  
  14.             int x = p[0];  
  15.             int y = p[1];  
  16.             int w = p[2];  
  17.             int h = p[3];  
  18.             int neighbors = p[4];  
  19.  
  20.             printf("face_rect=[%d, %d, %d, %d], neighbors=%d\n", x, y, w, h, neighbors);  
  21.             Point left(x, y);  
  22.             Point right(x + w, y + h);  
  23.             rectangle(frame, left, right, Scalar(230, 255, 0), 4);  
  24.  
  25.         }  
  26.         imshow("ss", frame);  
  27.     } 

在按鈕事件中填寫代碼:

  1. VideoCapture cap(0);  
  2.     Mat frame;  
  3.     while (1)  
  4.     {  
  5.         //load an image and convert it to gray (single-channel)  
  6.         //Mat gray = imread("lena.png");//it is necessary that must have CV_LOAD_IMAGE_GRAYSCALE  
  7.         //cvtColor(gray, gray, CV_BGR2GRAY);//CV_LOAD_IMAGE_GRAYSCALE IS SAME AS CV_BGR2GRAY  
  8.         cap >> frame;  
  9.         if (!frame.empty())  
  10.         {  
  11.             detectAndDisplay(frame);  
  12.         }  
  13.         int c = waitKey(10);  
  14.         if ((char)c == 'c') { break; }  
  15.     } 

可以看到,已經檢測成功,不過沒有在控件上顯示。

于仕祺老師人臉檢測操作實戰教程

可以通過添加來讓其顯示到框上。

  1. namedWindow("view", WINDOW_AUTOSIZE);  
  2.     HWND hWnd = (HWND)cvGetWindowHandle("view");  
  3.     HWND hParent = ::GetParent(hWnd);  
  4.     ::SetParent(hWnd, GetDlgItem(ID_FACE)->m_hWnd); 

于仕祺老師人臉檢測操作實戰教程

我們來看看這個函數逆天的檢測時間:增添檢測時間的代碼:

  1. t = (double)cvGetTickCount();  
  2. t = (double)cvGetTickCount() - t;  
  3. detect_time = t / 1000 / ((double)cvGetTickFrequency()*1000.);  
  4. UpdateData(FALSE); 

于仕祺老師人臉檢測操作實戰教程

于老師最近有一篇文章中寫到,他的這個人臉檢測庫是基于LBP與Boost相結合的。所以如果我們選取了足夠多,足夠好的樣本,參數設置正確的話,識別效果從理論上也能遠遠高于Opencv自帶的。此外就是在最近做項目的過程中,發現人臉檢測這一端還是不能用深度學習的方法,其一是DL目前還沒有能夠很方面移植的硬件,其二是如果在云端進行的話,傳輸速度將會對識別效率造成影響。

于仕祺老師人臉檢測操作實戰教程的文章和大家分享結束,感謝閱讀!

(責任編輯:6g下載網)

分享到:

------分隔線----------------------------
? 35选7福利彩票