首先利用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 ;
}
結果圖檔
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVdsdkY1x2RiFDatVWdsdkYxgWblZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMzIzNyEDM3EzMxATM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
二、利用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檔案
結果:
效果不理想,正負樣本的選擇以及訓練不到位。