1. 程式人生 > >C++下使用OpenCV實現人臉檢測

C++下使用OpenCV實現人臉檢測

沒有安裝OpenCV的可以找個教程安裝一下,然後安裝一下visual studio2015或2017

人臉識別主要有三個步驟:

  1. 人臉影象採集及檢測
  2. 人臉影象預處理
  3. 人臉影象特徵提取以及匹配與識別

以下程式碼實現了讀取本地影象,進行人臉檢測

#include <iostream>
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/calib3d/calib3d.hpp>



using namespace std;
using namespace cv;

int main()
{
	Mat image, image_gray;       //定義兩個Mat變數,用於儲存每一幀的影象

	image = imread("../test.jpg");
	imshow("原圖", image);

	//waitKey(0);

	cvtColor(image, image_gray, CV_BGR2GRAY);   //轉為灰度圖
	equalizeHist(image_gray, image_gray);       //直髮圖均化,增強對比度方便處理

	CascadeClassifier eye_Classifier;            //載入分類器
	CascadeClassifier face_cascade;              //載入分類器

	
	//載入分類訓練器,OpenCV官方文件的xml文件,可以直接呼叫
	//我的xml的路徑D:\OpenCV\opencv\build\etc\haarcascades  

	if (!eye_Classifier.load("./haarcascade_eye.xml"))    //把xml文件複製到了當前專案的路徑下
	{
		cout << "匯入haarcascade_eye.xml時出錯 !" << endl;
		return 0;

	}

	if (!face_cascade.load("./haarcascade_frontalface_alt.xml"))    //把xml文件複製到了當前專案的路徑下
	{
		cout << "匯入haarcascade_frontalface_alt.xml時出錯 !" << endl;
		return 0;

	}


	//vector 是個類模板 需要提供明確的模板實參  vector<Rect>則是個確定的類 模板的例項化
	
	vector<Rect> eyeRect;
	vector<Rect> faceRect;
	

	//檢測眼睛的位置
	eye_Classifier.detectMultiScale(image_gray,eyeRect,1.1,2,0 | CV_HAAR_SCALE_IMAGE,Size(30,30));
	for (size_t eyeIdx = 0;eyeIdx < eyeRect.size();eyeIdx++) 
	{

		rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255));    //用矩形畫出檢測到的眼睛的位置

	}
	/*
	CV_WRAP virtual void detectMultiScale(
								   const Mat& image,  
                                   CV_OUT vector<Rect>& objects,  
                                   double scaleFactor=1.1,  
                                   int minNeighbors=3, int flags=0,  
                                   Size minSize=Size(),  
                                   Size maxSize=Size() 
								   );  


	各引數含義:
	const Mat& image: 需要被檢測的影象(灰度圖)
	vector<Rect>& objects: 儲存被檢測出的人臉位置座標序列
	double scaleFactor: 每次圖片縮放的比例
	int minNeighbors: 每一個人臉至少要檢測到多少次才算是真的人臉
	int flags: 決定是縮放分類器來檢測,還是縮放影象
	Size(): 表示人臉的最大最小尺寸
	
	*/

	//檢測關於臉部的位置

	face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
	for (size_t i = 0; i < faceRect.size(); i++)
	{
		rectangle(image, faceRect[i], Scalar(0, 0, 255));           //用矩形畫出檢測到臉部的位置
	}

	imshow("人臉識別",image);         //顯示當前
	waitKey(0);


	return 0;


}

 結果是這樣子的

出現的問題以及解決方法

丟擲了異常

出現上圖所示的異常時,建議檢查以下幾點

  1. OpenCV是否加入到環境變數中
  2. visual studio中配置是否正確 (網上看教程再檢查檢查)
  3. 圖片路徑以及圖片名

我是第三種情況,圖片找不到了,建議寫成 image = imread("../test.jpg");

../是表示當前路徑的上一級,主要看圖片路徑和當前專案路徑的關係

若是在同一級路徑 就寫為"./test.jpg"