SeetaFace中科院山世光老师开源的人脸识别引擎,其实这个是一个相当不错的人脸识别引擎,自己实测之后,发现的确是比OpenCV自带的强很多。但是实话实说,SeetaFace自带的demo 程序就有点复杂了,太多细节要用户关注之后,把三个工程重新编译好之后,才能自己运行起来看效果,特别本民工这种开发环境一大堆,机器上同时配置了三个版本OpenCV的,的确是有点麻烦。另外还有那三个模型文件。真是烦死人
为此本民工在把SeetaFace的工程全部编译好之后,重新做了一个新的Demo,并把编译环境一起整合到工程中,界面如下。
程序的主要代码如下:
void CR2FaceRecDlg::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");
}
// 调用测试方法
void CR2FaceRecDlg::runImgTest(){
//比较两张图片的相似度
if((NULL!= gpFaceDetect)
&&(NULL!= gpFacePoint)
&&(NULL!= gpFaceIdent)){
clock_tstart = clock();
//转换灰度
cv::Matgallery_img_gray;
cv::cvtColor(mSrcImage1,gallery_img_gray,CV_BGR2GRAY);
cv::Matprobe_img_gray;
cv::cvtColor(mSrcImage2,probe_img_gray,CV_BGR2GRAY);
ImageDatagallery_img_data_color(mSrcImage1.cols, mSrcImage1.rows,mSrcImage1.channels());
gallery_img_data_color.data= mSrcImage1.data;
ImageDatagallery_img_data_gray(gallery_img_gray.cols,gallery_img_gray.rows, gallery_img_gray.channels());
gallery_img_data_gray.data= gallery_img_gray.data;
ImageDataprobe_img_data_color(mSrcImage2.cols, mSrcImage2.rows,mSrcImage2.channels());
probe_img_data_color.data= mSrcImage2.data;
ImageDataprobe_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::vectorgallery_faces = gpFaceDetect->Detect(gallery_img_data_gray);
int32_t gallery_face_num = static_cast(gallery_faces.size());
std::vectorprobe_faces = gpFaceDetect->Detect(probe_img_data_gray);
int32_t probe_face_num = static_cast(probe_faces.size());
if(gallery_face_num == 0 || probe_face_num == 0)
{
::MessageBox(NULL, _T("未发现人脸"), _T("提示"), MB_OK);
return;
}
//
Detect 5 facial landmarks
seeta::FacialLandmarkgallery_points[5];
gpFacePoint->PointDetectLandmarks(gallery_img_data_gray,gallery_faces[0], gallery_points);
seeta::FacialLandmarkprobe_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_tcount = clock();
doubledTime = (double)(count - start) / 1000.0;
mstrCmpResult.Format(_T("图像处理时间:%.4f, 两张图片的相似度是:%.5f "),dTime, sim);
UpdateData(FALSE);
}
}
好了,废话少说,再说一下程序运行环境配置,开发环境是VS2013,openCV是2.4.13。为什么这样用VC12,而且OpenCV2.4.13其实只有VC14的库,其实一点关系都没有影响,本民工之前还有VS2012上开发OpenCV3.4的工程,另外还把SeetaFace在2.4.9上编译好了,还好好玩了几下。
源码工程下载地址:
www.r2funny.com/ R2FaceRec.rar