圖像人臉檢測+人眼檢測 (opencv + c++)


摘要:實現圖像中人臉檢測,和人眼定位。輸出檢測標記圖像和定位坐標。

工具:vs2015  opencv3  C++

資源:haarcascade_frontalface_alt2.xml;haarcascade_eye_tree_eyeglasses.xml

鏈接:https://pan.baidu.com/s/1uk8P1TF7XXCoMMd0sNDGVg
提取碼:az01

實現結果:

 

實現過程:

Detect.h

 1 #pragma once
 2 #include <opencv2/opencv.hpp>
 3 #include <opencv2/highgui/highgui.hpp>
 4 #include <opencv2/core/core.hpp>
 5 #include <opencv2/imgproc/imgproc.hpp>
 6 #ifndef DETECT_H
 7 #define DETECT_H
 8 int DetectFaceEyes();    //檢測人臉定位人眼
 9 #endif // !DETECT_H

 

Detect.cpp

#include <iostream>
#include "Detect.h"

using namespace std;
using namespace cv;

int DetectFaceEyes()
{
    Mat heying = imread("./Data/heying.jpg");
    Mat hyGray = imread("./Data/heying.jpg", 0);
    equalizeHist(hyGray, hyGray);        //直方圖均勻化

    vector<Rect> faces, eyes;
    const char *faceCascadeFilename = "./Data/haarcascade_frontalface_alt2.xml";
    const char *eyeCascadeFilename = "./Data/haarcascade_eye_tree_eyeglasses.xml";
    CascadeClassifier faceCascade;
    CascadeClassifier eyeCascade;
    if (!faceCascade.load(faceCascadeFilename))
    {
        cout << "人臉檢測級聯分類器沒找到!!" << endl;
        return -1;
    }
    if (!eyeCascade.load(eyeCascadeFilename))
    {
        cout << "眼睛檢測級聯分類器沒找到!!" << endl;
        return -1;
    }
    faceCascade.detectMultiScale(hyGray, faces, 1.2, 5, 0, Size(30, 30));
    for (auto b : faces)
    {
        cout << "輸出人臉位置:(x,y):" << "(" << b.x << "," << b.y << "),\
            (width,heigh):(" << b.width << "," << b.height << ")\n";
    }
    if (faces.size() > 0)
    {
        for (size_t i = 0; i < faces.size(); i++)
        {
            // putText(heying,"xxx", cvPoint(faces[i].x, faces[i].y - 10), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 255));
            rectangle(heying, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 1, 8);
            cout << faces[i] << endl;

            Mat face_ = hyGray(faces[i]);    // 選定人臉的基礎上定位眼睛
            eyeCascade.detectMultiScale(face_, eyes, 1.2, 2, 0, Size(30, 30));
            for (size_t j = 0; j < eyes.size(); j++)
            {
                // 在原圖上標注眼睛,需要人臉在原圖上的坐標
                Point eyeCenter(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(heying, eyeCenter, radius, Scalar(65, 105, 255), 4, 8, 0);
            }
        }
    }
    imshow("result", heying);
    waitKey(5000);
    return 0;
}

 

測試:Main.cpp

#include <iostream>
#include <opencv2\opencv.hpp>
#include "Detect.h"

using namespace cv;

int main()
{
    int isFaceDetect;

    // 測試圖片中的人臉
    isFaceDetect = DetectFaceEyes();
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM