使用 SeetaFace 实现人脸识别

      SeetaFace中科院山世光老师开源的人脸识别引擎,其实这个是一个相当不错的人脸识别引擎,自己实测之后,发现的确是比OpenCV自带的强很多。但是实话实说,SeetaFace自带的demo 程序就有点复杂了,太多细节要用户关注之后,把三个工程重新编译好之后,才能自己运行起来看效果,特别本民工这种开发环境一大堆,机器上同时配置了三个版本OpenCV的,的确是有点麻烦。另外还有那三个模型文件。完全跑出一个效果来,真是要烦死人。

       为此本民工在把SeetaFace的工程全部编译好之后,重新做了一个新的Demo,并把编译环境一起整合到工程中,界面如下。


         程序的主要代码如下:

voidCR2FaceRecDlg::initRecObj(){

    //初始化识别对象

    gpFaceDetect= new seeta::FaceDetection("seeta_fd_frontal_v1.0.bin");

 

    gpFaceDetect->SetMinFaceSize(40);

    gpFaceDetect->SetScoreThresh(2.f);

    gpFaceDetect->SetImagePyramidScaleFactor(0.8f);

    gpFaceDetect->SetWindowStep(4,4);

 

    gpFacePoint= new seeta::FaceAlignment("seeta_fa_v1.1.bin");

 

    gpFaceIdent= new seeta::FaceIdentification("seeta_fr_v1.0.bin");

}

 

// 调用测试方法

voidCR2FaceRecDlg::runImgTest(){

    //比较两张图片的相似度

    if((NULL != gpFaceDetect)

        &&(NULL != gpFacePoint)

        &&(NULL != gpFaceIdent)){

       

        clock_t start = clock();

 

        //转换灰度

        cv::Mat gallery_img_gray;

        cv::cvtColor(mSrcImage1,gallery_img_gray, CV_BGR2GRAY);

 

        cv::Mat probe_img_gray;

        cv::cvtColor(mSrcImage2,probe_img_gray, CV_BGR2GRAY);

 

        ImageData gallery_img_data_color(mSrcImage1.cols, mSrcImage1.rows,mSrcImage1.channels());

        gallery_img_data_color.data= mSrcImage1.data;

 

        ImageData gallery_img_data_gray(gallery_img_gray.cols,gallery_img_gray.rows, gallery_img_gray.channels());

        gallery_img_data_gray.data= gallery_img_gray.data;

 

        ImageData probe_img_data_color(mSrcImage2.cols, mSrcImage2.rows,mSrcImage2.channels());

        probe_img_data_color.data= mSrcImage2.data;

 

        ImageData probe_img_data_gray(probe_img_gray.cols,probe_img_gray.rows, probe_img_gray.channels());

        probe_img_data_gray.data= probe_img_gray.data;

 

        //Detect faces

        std::vector<seeta::FaceInfo>gallery_faces = gpFaceDetect->Detect(gallery_img_data_gray);

        int32_t gallery_face_num = static_cast<int32_t>(gallery_faces.size());

 

        std::vector<seeta::FaceInfo>probe_faces = gpFaceDetect->Detect(probe_img_data_gray);

        int32_t probe_face_num = static_cast<int32_t>(probe_faces.size());

 

        if(gallery_face_num == 0 || probe_face_num == 0)

        {

            ::MessageBox(NULL, _T("未发现人脸"), _T("提示"), MB_OK);

            return;

        }

         

 

        //Detect 5 facial landmarks

        seeta::FacialLandmark gallery_points[5];

        gpFacePoint->PointDetectLandmarks(gallery_img_data_gray,gallery_faces[0], gallery_points);

 

        seeta::FacialLandmark probe_points[5];

        gpFacePoint->PointDetectLandmarks(probe_img_data_gray,probe_faces[0], probe_points);

 

        //Extract face identity feature

        floatgallery_fea[2048];

        floatprobe_fea[2048];

        gpFaceIdent->ExtractFeatureWithCrop(gallery_img_data_color,gallery_points, gallery_fea);

        gpFaceIdent->ExtractFeatureWithCrop(probe_img_data_color,probe_points, probe_fea);

 

        //计算相似度

        floatsim = gpFaceIdent->CalcSimilarity(gallery_fea, probe_fea);

 

        clock_t count = clock();

        doubledTime = (double)(count - start) / 1000.0;

 

        mstrCmpResult.Format(_T("图像处理时间:%.4f, 两张图片的相似度是:%.5f "),dTime, sim);

 

 

        UpdateData(FALSE);

    }

}


      好了,废话少说,再说一下程序运行环境配置,开发环境是VS2013,openCV2.4.13。为什么这样用VC12,而且OpenCV2.4.13其实只有VC14的库,其实一点关系都没有影响,本民工之前还有VS2012上开发OpenCV3.4的工程,另外还把SeetaFace2.4.9上编译好了,还好好玩了几下。


源码工程下载地址:

www.r2funny.com/ R2FaceRec.rar

别外说一下,模型的bin文件可以去Seeta的github上下载,因为那个文件太大了,其它的lib和dll本民工已经编译好放在demo工程里。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值