人臉檢測(opencv)

乍看人臉識別感覺很複雜,但是我們站在巨人的肩旁上,這些難題都迎刃而解,雖然實現和效果都很簡單,在opencv中自帶了很多的分類器和檢測函數,分類器在(安裝位置)\opencv\sources\data\haarcascades,當然也可以自己訓練
步驟:
1:加載分類器;
2:調用檢測函數detectMultiScale();
3:畫出相關人臉區域;
代碼實現:

#include<opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

string face_cascade_name = "D:\\Opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
string window_name = "人臉識別";

void detectAndDisplay(Mat frame);

int main(int argc, char** argv){

        Mat image=imread("1.png");
        if (!image.data){
            printf("[error] 沒有圖片\n");
            return -1;
        }

        if (!face_cascade.load(face_cascade_name)){
            printf("[error] 無法加載級聯分類器文件!\n");
            return -1;
        }

        detectAndDisplay(image);

        waitKey(0);
}

void detectAndDisplay(Mat frame){
    vector<Rect> faces;
    Mat frame_gray;

    cvtColor(frame, frame_gray, CV_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);

    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 6, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));

    for (int i = 0; i < faces.size(); i++){
        Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
        ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
        cout << "faces"<<faces.at(i)<<endl;
    }

    imshow(window_name, frame);
}

效果顯示:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章