人脸识别的算法,怎么从两张图片中找出人脸 的部分,并比较两个人是否是同一个人。

请教高手给点指教,最好是有C#的实现代码,可以将答案发到我的邮箱小弟急用。[email protected]

OPENCV里就有,我大4的时候用过。安装后,DATA目录下,haarcascades目录下,haarcascade_frontalface_default.xml就不错。这是人脸识别的数据。
用法请根据这个文件名找吧,我记得就是调用OPENCV里的某个函数(C++),用这个文件名和图作参数,返回的就是图中人脸的位置。
嘿嘿,50分么,下面是我以前的代码,这里是你用得着的部分:
const char* cascadeFile = "haarcascade_frontalface_alt.xml";
const char* folder = "C:\\Program Files\\OpenCV\\data\\haarcascades\\";
char path[1024];
sprintf(path, "%s%s", folder, cascadeFile);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad(path, 0, 0, 0);
//然后cascade就存着需要的那个CvHaarClassifierCascade了。
......
CvSeq* faces = cvHaarDetectObjects(img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
cvSize(source->getWidth() >> 7, source->getHeight() >> 7));
这句中,img是一个IplImage*,我自己的项目是从摄像头弄来的,我估计你需要直接用opencv载入图片。cascade就是载入的OPENCV的样本数据,storage是一个空间,我用的CvMemStorage* storage = cvCreateMemStorage(0)创建的,detect objects之前我还用了cvClearMemStorage(storage),1.1是缩放,2是检测像素大小,CV_HAAR_DO_CANNY_PRUNING是比较方法, 一个OPENCV自带的常量。最后cvSize的返回值是允许的最小脸部大小。每个变量都解释到了吧。
之后faces->total就是找到几个脸。用cvGetSeqElem(faces, i)来取每个脸的数据,取出来的东西是(CvRect*),要记得TYPECAST,例如CvRect face1 = *((CvRect*) cvGetSeqElem(faces, 0))。这样得到的CvRect有4个变量face1.x,face1.y,face1.width,face1.height就是人脸在图片中的位置了。追问

有没有具体的理论算法呢??

追答

当然有。如果我没记错的话,这里用到的就是简单的贝叶斯分类器。
虽然不是什么专业的人脸算法,但是我的实验证明它还不错。当然如果你要区别不同人的脸,需要用它抓到的脸的位置,在位置周围取数据,然后进一步将拿到的数据分类,第二次分类还要注意训练数据时能变化的尽量变(像发型啥的多输入点变化的数据,这样不变的脸中央的特征表现才明显)

顺便说一下,有专业的人脸算法,我见过一个找眼睛的。但是网上没见过算法公开,可能是某些公司的内部资料。

温馨提示:答案为网友推荐,仅供参考
相似回答