opencv结合MFC进行人脸检测

注:笔者使用的开发环境为VS2013+opencv2.4.10

调用于仕琪老师提供的人脸检测库库文件:
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=34155&extra=page%3D1


1、在工程中导入facedetect-dll.h和CvvImage.h


2、在Dlg.cpp中添加
#pragma comment(lib,”libfacedetect.lib”)

在Dlg.h中添加
VideoCapture cap;
IplImage* m_frame;


3、添加将图像显示到picture控件的DrawToMFC函数
(可参考笔者的另一个教程:opencv结合MFC打开图片 )


4、添加检测人脸的定时器

void CFaceObjectDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
{
    Mat image;
    cap >> image;
    Mat gray;
    cvtColor(image, gray, CV_BGR2GRAY);
    int * pResults = NULL;
    //pBuffer是用于检测功能.
    //如果在多个线程中调用函数,请为每个线程创建一个缓冲区!
    unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
    int doLandmark = 1;
        // 正面人脸检测
        //检测人脸的速度快,但不能检测侧视图面
        //输入图像必须是灰色的(单通道)
        pResults = facedetect_frontal(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
            1.2f, 2, 48, 0, doLandmark);
        Mat result_frontal = image.clone();
        //输出检测结果
        for (int i = 0; i < (pResults ? *pResults : 0); i++)
        {
            short * p = ((short*)(pResults + 1)) + 142 * i;
            int x = p[0];
            int y = p[1];
            int w = p[2];
            int h = p[3];
            int neighbors = p[4];
            int angle = p[5];
            rectangle(result_frontal, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
        }
        //将Mat转换为Iplimage用于显示
        m_frame = &result_frontal.operator IplImage();
        DrawToMFC(IDC_PIC,m_frame);
        //释放缓存
        free(pBuffer);
}break;
default:
    break;
}
CDialogEx::OnTimer(nIDEvent);
}

5、打开摄像头进行人脸检测

void CFaceObjectDlg::OnBnClickedFaceObject()
{
    cap.open(0);
    SetTimer(1,20,NULL);
}

6、关闭摄像头停止人脸检测

void CFaceObjectDlg::OnBnClickedStopObject()
{
    KillTimer(1);
    cap.release();
}

检测结果:

这里写图片描述

哈哈哈,笔者不露脸啦,就用计算机视觉里的一副插图来检测^_^


源码下载:http://download.csdn.net/detail/lwqbrell/9826816

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值