由于光照、遮擋和傾斜等原因,部分人臉和眼睛并不能正確檢測。。
// 簡單的人臉檢測 #include <iostream> #include <vector> #include <opencv2\opencv.hpp> #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp"using namespace std; using namespace cv;// 把opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml和haarcascade_eye_tree_eyeglasses.xml // 這兩個文件復制到工程路徑下 String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; // 檢測物體的級聯分類器類 CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; string window_name = "Capture - Face detection";void detectAndDisplay(Mat frame) {std::vector<Rect> faces;Mat frame_gray;cvtColor(frame, frame_gray, COLOR_BGR2GRAY);// 使灰度圖象直方圖均衡化,可以將比較淡的圖像變換為比較深的圖像(即增強圖像的亮度及對比度) equalizeHist(frame_gray, frame_gray);/*CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size())參數:image – 需要檢測的 CV_8U 輸入矩陣。objects – 輸出vector載體容器用于保存被識別的物體矩陣。scaleFactor – 指定每張圖片的縮小比例的參數。minNeighbors – 指定每個候選矩陣至少包含的鄰近元素個數。 越大正確率越高flags – 與舊版級聯分類器模型函數cvHaarDetectObjects的flags相同.此參數不被用于新版模型。minSize – 最小可能的對象的大小,小于的對象將被忽略。maxSize – 最大可能的對象的大小,大于的對象將被忽略。*/// 人臉檢測face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));for (size_t i = 0; i < faces.size(); i++){// 畫橢圓標記Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(0, 255, 0), 2, 8, 0);Mat faceROI = frame_gray(faces[i]);std::vector<Rect> eyes;// 在臉中檢測眼睛eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(10, 10));for (size_t j = 0; j < eyes.size(); j++){// 畫圓標記Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);circle(frame, eye_center, radius, Scalar(255, 0, 0), 3, 8, 0);}}imshow(window_name, frame); }int main(void) {VideoCapture capture;Mat frame;frame = imread("image.jpg");// 加載級聯(cascades)if (!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; };if (!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; };// 讀取視頻//capture.open(0);//if (capture.isOpened())//{// for (;;)// {// capture >> frame;// // 對當前幀使用分類器// if (!frame.empty())// {// detectAndDisplay(frame);// }// else// {// break;// }// waitKey(5);// }//}if (!frame.empty()){detectAndDisplay(frame);}else{}waitKey(0);return 0; }
?