天天看點

【學習opencv】opencv人臉檢測

首先利用opencv自帶的訓練檔案haarcascade_frontalface_alt.xml和haarcascade_eye.xml檢測人臉及人眼,其次初步嘗試如何利用opencv訓練資料以及獲得訓練檔案(.xml).

一、利用opencv自帶訓練檔案檢測人臉

1. 建立級聯分類器

2. 加載訓練資料

3. 使用detectMultiScale方法檢測人臉

4. 在人臉檢測的基礎上檢測人眼

注意:在人臉的圖檔上檢測人眼,則最後在原圖畫人眼時,注意坐标的轉換

void detectMultiScale(

const Mat& image,

CV_OUT vector& objects,

double scaleFactor = 1.1,

int minNeighbors = 3,

int flags = 0,

Size minSize = Size(),

Size maxSize = Size()

);

參數1:待檢測圖檔,一般為灰階圖像加快檢測速度;

參數2:檢測結果容器;

參數3:表示在前後兩次相繼的掃描中,搜尋視窗的比例系數。預設為1.1即每次搜尋視窗依次擴大10%;

參數4:表示構成檢測目标的相鄰矩形的最小個數(預設為3個)。

參數5:flag預設值,可用預設值,也可設定CV_HAAR_DO_CANNY_PRUNING,那麼函數将會使用Canny邊緣檢測來排除邊緣過多或過少的區域。

參數6、7:minSize和maxSize用來限制得到的目标區域的範圍。

代碼:

#include<opencv2\opencv.hpp>
#include<opencv2\objdetect.hpp>
#include<opencv2\ml.hpp>
#include<iostream>
using namespace cv;
using namespace std;

string face_cascade_name = "E:\\myopencv\\install\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";
//string face_cascade_name = "F:\\opencv3.0.1\\Standard Project\\CreateXml\\Create\\xml\\cascade.xml";
//使用自己的訓練資料效果不好
string eye_cascade_name = "E:\\myopencv\\install\\etc\\haarcascades\\haarcascade_eye.xml";

int main()
{
Mat img = imread("pic\\face1.jpg",);
Mat gray(img.rows*,img.cols*,CV_8UC1);
resize(img, img, gray.size());
//建立級聯分類器對象
CascadeClassifier face_cascade, eye_cascade;
//加載級聯分類器檔案
if (!face_cascade.load(face_cascade_name))
{
cout << "face打開錯誤!" << endl;
return ;
}
if (!eye_cascade.load(eye_cascade_name))
{
cout << "eye打開錯誤!" << endl;
return ;
}

cvtColor(img,gray,CV_BGR2GRAY);
equalizeHist(gray,gray);
vector<Rect>faces;
face_cascade.detectMultiScale(gray,faces, , ,  | CV_HAAR_SCALE_IMAGE, Size(, ));
for (int i =; i < faces.size(); i++)
{
//畫矩形
rectangle(img,faces[i],Scalar(,,),,);
Mat faceROI = gray(faces[i]);
//找眼睛
vector<Rect>eyes;
eye_cascade.detectMultiScale(faceROI,eyes, , ,  | CV_HAAR_SCALE_IMAGE, Size(, ));
for (int j = ; j < eyes.size(); j++)
{
eyes[j].x = eyes[j].x + faces[i].x;
eyes[j].y = eyes[j].y + faces[i].y;
rectangle(img,eyes[j],Scalar(,,),,);
}

}
imshow("facedect",img);
waitKey();
return ;
}
           

結果圖檔

【學習opencv】opencv人臉檢測

二、利用opencv訓練的資料進行檢測人臉

具體步驟參見部落格:采用opencv_cascadetrain進行訓練的步驟及注意事項

1. 準備正負樣本

2. 生成vec檔案

3. 利用opencv_cascadetrain.exe進行訓練

注意點:負樣本數目要比正樣本數目多,而且負樣本數量不能太少

從指令視窗進入opencv_cascadetrain.exe,

參數設定:

正樣本數量為100,負樣本數量為50的具體參數

opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 10

-numNeg 50 -numStages 16 -precalcValbufSize 200 -precalcdxBufSize 1000 -featureType LBP

4.訓練好後把生成的cascade.xml替換上述程式中的opencv自帶的xml檔案

結果:

【學習opencv】opencv人臉檢測

效果不理想,正負樣本的選擇以及訓練不到位。