1. 程式人生 > >【機器學習】最容易實現的基於OpenCV的人臉檢測程式碼、檢測器及檢測效果

【機器學習】最容易實現的基於OpenCV的人臉檢測程式碼、檢測器及檢測效果

基於opencv自帶的人臉檢測模型,實現簡單的人臉檢測功能,可作為機器學習初學者練手使用。簡單易學,具體的方法及程式碼如下。

1、執行結果

輸入原圖

輸出結果

2、工程需要載入的opencv庫如下:

3、用到的人臉檢測器

4、具體實現程式碼

#include <opencv.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define  MULTI_TARGET  //控制切換檢測目標數

int main()
{
	CascadeClassifier faceDetector;
	string faceCascadeFilename = "haarcascade_frontalface_default.xml";
	faceDetector.load(faceCascadeFilename);     //載入人臉檢測器

	if (faceDetector.empty())
	{
		cout<<"load faceDetector failed!"<<endl;
		return -1;
	}

	Mat srcImg = imread("..\\srcImg.jpg");
	if(srcImg.empty())
	{
		cout<<"read image failed!"<<endl;
		return -1;
	}
	imshow("srcImg", srcImg);

	Mat grayImg;
	cvtColor(srcImg, grayImg, CV_RGB2GRAY);   //轉成灰度圖

	vector<Rect> detectionResults;
	float searchScaleFactor = 1.1f;
	int minNeighbors = 3;
	Size minFeatureSize(25, 25);

#ifdef MULTI_TARGET
	int flags = CASCADE_SCALE_IMAGE;	     //檢測多個目標
#else
	int flags = CASCADE_FIND_BIGGEST_OBJECT|CASCADE_DO_ROUGH_SEARCH;	//只檢測最大目標
#endif

	faceDetector.detectMultiScale(grayImg, detectionResults, searchScaleFactor, minNeighbors, flags, minFeatureSize);  //進行人臉檢測

	Mat dstImg = srcImg.clone();
	Mat detectionRect;
	for (int i = 0; i < detectionResults.size(); i++)
	{
		if (detectionResults[i].height > 0 && detectionResults[i].width > 0)
		{
			detectionRect = grayImg(detectionResults[i]);
			rectangle(dstImg, detectionResults[i], CV_RGB(0, 255, 0), 2, 8, 0);   //畫檢測框
		}
	}

	imshow("dstImg", dstImg);
	waitKey(0);
	return 0;
}