opencv 利用Haar 人脸识别

 

 

#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <Windows.h>  
using namespace std;
int main()
{
    // 加载Haar特征检测分类器
    // haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
    const char *pstrCascadeFileName = "D:\\opencv\\opencv2.4.10\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
    CvHaarClassifierCascade *pHaarCascade = NULL;
    pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);

    // 载入图像
    const char *pstrImageName = "D:\\721.jpg";
    IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
    
    IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
    cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);

    // 人脸识别与标记
    if (pHaarCascade != NULL)
    {        
        CvScalar FaceCirclecolors[] = 
        {
            {{0, 0, 255}},
            {{0, 128, 255}},
            {{0, 255, 255}},
            {{0, 255, 0}},
            {{255, 128, 0}},
            {{255, 255, 0}},
            {{255, 0, 0}},
            {{255, 0, 255}}
        };

        CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
        cvClearMemStorage(pcvMStorage);
        DWORD dwTimeBegin, dwTimeEnd;
        dwTimeBegin = GetTickCount();
        CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
        dwTimeEnd = GetTickCount();

        printf("人脸个数: %d   识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
        
        for(int i = 0; i <pcvSeqFaces->total; i++)
        {
            CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
            CvPoint center;
            int radius;
            center.x = cvRound((r->x + r->width * 0.5));
            center.y = cvRound((r->y + r->height * 0.5));
            radius = cvRound((r->width + r->height) * 0.25);
            cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
        }
        cvReleaseMemStorage(&pcvMStorage);
    }
    
    const char *pstrWindowsTitle = "人脸识别";
    cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
    cvShowImage(pstrWindowsTitle, pSrcImage);

    cvWaitKey(0);

    cvDestroyWindow(pstrWindowsTitle);
    cvReleaseImage(&pSrcImage);    
    cvReleaseImage(&pGrayImage);
    return 0;
}

 

posted @ 2015-01-11 15:31  qscqesze  阅读(1278)  评论(0编辑  收藏  举报