C++下使用OpenCV實現人臉檢測
阿新 • • 發佈:2018-12-17
沒有安裝OpenCV的可以找個教程安裝一下,然後安裝一下visual studio2015或2017
人臉識別主要有三個步驟:
- 人臉影象採集及檢測
- 人臉影象預處理
- 人臉影象特徵提取以及匹配與識別
以下程式碼實現了讀取本地影象,進行人臉檢測
#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; }
結果是這樣子的
出現的問題以及解決方法
丟擲了異常
出現上圖所示的異常時,建議檢查以下幾點
- OpenCV是否加入到環境變數中
- visual studio中配置是否正確 (網上看教程再檢查檢查)
- 圖片路徑以及圖片名
我是第三種情況,圖片找不到了,建議寫成 image = imread("../test.jpg");
../是表示當前路徑的上一級,主要看圖片路徑和當前專案路徑的關係
若是在同一級路徑 就寫為"./test.jpg"