【OpenCV之Haar特征检测人脸识别】


本测试的人脸识别使用Opencv自带的Haar特征检测的,存在的路径在安装包opencv\sources\data\haarcascades下

  • Haar特征检测是怎么检测出的人脸 -
  • 如何使用Haar特征检测进行人脸识别

Haar特征检测是怎么检测出的人脸

Haar特征检测,存在的路径在安装包opencv\sources\data\haarcascades下

【OpenCV之Haar特征检测人脸识别】_第1张图片
从这些文件可以看出使用的Haar特征检测文件都是xml文档。里面存储的是一些脸部特征的信息:眼睛,身体,嘴巴等特征、还可以自己通过大量的训练来进行更多特征的识别,比如笑脸、哭泣等面部表情的识别。

如何使用Haar特征检测进行人脸识别

原型函数介绍

使用cvHaarDetectObjects

CVAPI(CvSeq*) cvHaarDetectObjects(
  const CvArr* image,
  CvHaarClassifierCascade* cascade,
  CvMemStorage* storage,
  double scale_factor CV_DEFAULT(1.1),
  int min_neighbors CV_DEFAULT(3),
  int flags CV_DEFAULT(0),
  CvSize min_size CV_DEFAULT(cvSize(0,0)),
  CvSize max_size CV_DEFAULT(cvSize(0,0))
);

我们对函数进行一下说明
函数说明:

  • **第一个参数表示输入的图像,使用灰度图可以加快检测速度。
  • **第二个参数表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载Haar相应的xml文件作为Haar特征分类器。
  • **第三个参数为CvMemStorage类型,A storage for various OpenCV dynamic data structures
  • **第四个参数表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%
  • **第五个参数表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
  • **第六个参数要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。
  • **第七个,第八个参数表示检测窗口的最小值和最大值,一般设置为默认即可。
  • **函数返回值:
    函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。

    • Haar特征检测是怎么检测出的人脸
    • 如何使用Haar特征检测进行人脸识别
      • 原型函数介绍
      • 代码实例
      • 结果展示

代码实例


// Haar特征检测 - 人脸识别
//Code by lei
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    // 加载Haar特征检测分类器
    // OpenCV自带的分类器
    const char *pstrCascadeFileName = "E:\\OpenCV\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";
    CvHaarClassifierCascade *pHaarCascade = NULL;
    pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);

    // 载入图像
    const char *pstrImageName = "face1.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;
}

结果展示

【OpenCV之Haar特征检测人脸识别】_第2张图片


可以看到结果不是很近人意,在日常我们使用的app中人脸识别准确度要比这高的多

你可能感兴趣的:(OpenCV,图像处理)