2024年10月opencv人脸识别算法(opencv人脸识别)

 更新时间:2024-10-10 16:51:56

  ⑴opencv人脸识别算法(opencv人脸识别

  ⑵opencv人脸识别

  ⑶#include“cv.h“#include“highgui.h“#include《stdio.h》#include《stdlib.h》#include《string.h》#include《assert.h》#include《math.h》#include《float.h》#include《limits.h》#include《time.h》#include《ctype.h》#ifdef_EiC#defineWIN#endifstativMemStorage*storage=;stativHaarClassifierCascade*cascade=;voiddetect_and_draw(IplImage*image);constchar*cascade_name=“haarcascade_frontalface_alt.xml“;/*“haarcascade_profileface.xml“;*/intmain(intargc,char**argv){cascade_name=“haarcascade_frontalface_alt.xml“;cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,,,);if(!cascade){fprintf(stderr,“ERROR:Couldnotloadclassifiercascade

  ⑷“);return-;}storage=cvCreateMemStorage();cvNamedWindow(“result“,);constchar*filename=“Lena.jpg“;IplImage*image=cvLoadImage(filename,);if(image){detect_and_draw(image);cvWaitKey();cvReleaseImage(?);}cvDestroyWindow(“result“);return;}voiddetect_and_draw(IplImage*img){doublescale=.;stativScalarcolors={{{,,}},{{,,}},{{,,}},{{,,}},{{,,}},{{,,}},{{,,}},{{,,}}};//Justsomeprettycolorstodrawwith//ImagePreparation//IplImage*gray=cvCreateImage(cvSize(img-》width,img-》height),,);IplImage*small_img=cvCreateImage(cvSize(cvRound(img-》width/scale),cvRound(img-》height/scale)),,);cvCvtColor(img,gray,CV_BGRGRAY);cvResize(gray,small_img,CV_INTER_LINEAR);cvEqualizeHist(small_img,small_img);//直方图均衡//Detectobjectsifany//cvClearMemStorage(storage);doublet=(double)cvGetTickCount();CvSeq*objects=cvHaarDetectObjects(small_img,cascade,storage,.,,/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(,));t=(double)cvGetTickCount()-t;printf(“detectiontime=%gms

  ⑸“,t/((double)cvGetTickFrequency()*.));//Loopthroughfoundobjectsanddrawboxesaroundthemfor(inti=;i《(objects?objects-》total:);++i){CvRect*r=(CvRect*)cvGetSeqElem(objects,i);cvRectangle(img,cvPoint(r-》x*scale,r-》y*scale),cvPoint((r-》x+r-》width)*scale,(r-》y+r-》height)*scale),colors[i%]);}for(inti=;i《(objects?objects-》total:);i++){CvRect*r=(CvRect*)cvGetSeqElem(objects,i);CvPointcenter;intradius;center.x=cvRound((r-》x+r-》width*.)*scale);center.y=cvRound((r-》y+r-》height*.)*scale);radius=cvRound((r-》width+r-》height)*.*scale);cvCircle(img,center,radius,colors[i%],,,);}cvShowImage(“result“,img);cvReleaseImage(&gray);cvReleaseImage(&small_img);}需要说明的几点:.图像和.xml文件要放在该程序的bin目录下(.sln所在的目录。.《学习OpenCV》里面就是用矩形表示,但是书里面的代码不太对,原因是忽略了缩放因子,即voiddetect_and_draw(IplImage*img)里面的doublescale=.;这个缩放因子的作用是:拿到一个图像,首先将它缩放(scale=.即变为一个小图像,然后在缩放后的小图像上检测人脸,这样会比较快。最基本的就这么多吧。

  ⑹怎样使用OpenCV进行人脸识别

  ⑺不知道你说的人脸识别是识别出来是某个人还是只是在图像中检测出人脸。

  ⑻刚用opencv完成对自己的人脸识别,但是还需要继续优化。说一下大致步骤吧:

  ⑼首先就是数据的准备,你要从网络上下载一些人脸库,后面用来训练人脸识别模型。人脸检测模型opencv是自带的,但是识别模型需要自己训练。下载人脸库之后需要对人脸进行标记,这是一个繁琐的工作,不过网上有脚本或者自己写个程序简化工作量。

  ⑽把数据标记好之后就是opencv的事情。训练的函数非常简单。只有下面这三句:

  ⑾Ptr《FaceRecognizer》?model?=?createEigenFaceRecognizer(); model-》train(images,?labels); model-》save(“MyFacePCAModel.xml“);

  ⑿然后打开摄像头进行人脸检测,就是框出人脸的位置。人脸检测模型是opencv自带的。

  ⒀CascadeClassifier?cascade; cascade.load(“haarcascade_frontalface_alt.xml“);

  ⒁cascade.detectMultiScale(gray,?faces, .,?,? //|CV_HAAR_FIND_BIGGEST_OBJECT //|CV_HAAR_DO_ROUGH_SEARCH |?CV_HAAR_SCALE_IMAGE, Size(,?));

  ⒂这是检测的方法。这里检测得到的就是一个一个的人脸的矩形框,然后用画矩形的方法把它们画出来就行了。

  ⒃然后就是对检测到的人脸进行识别了,用我们刚才训练好的人脸模型。加载:

  ⒄Ptr《FaceRecognizer》?modelPCA?=?createEigenFaceRecognizer(); modelPCA-》load(“MyFacePCAModel.xml“);

  ⒅int?predictPCA?=?; if?(face.rows?》=?) { resize(face,?face_test,?Size(,?)); } if?(!face_test.empty()) { predictPCA?=?modelPCA-》predict(face_test); }

  ⒆如果预测结果等于标记结果,说明识别正确。

  ⒇大致流程就这样了,如果你对opencv有了一定的了解,应该能看懂了。没看懂只能私聊了。

  ⒈第一次回答这么长,自己都有点不习惯。

  ⒉新人弱弱的问一下opencv的人脸识别率怎么样

  ⒊还行的。其实有很多办法,我说一种简单办法的思路吧,如果编码的话,代码量有些大。[思路]识别出某个人的脸(你先准备好这个人的几张或几十张的图片让程序来“学习”([程序分为两部分]第一部分:[学习这个人的脸]把这些图片逐个读入程序,然后对每个图片进行以下处理:a.初步降噪:可以用cvErode或更好级别的算法来对图像完成初步降噪(opencv这块有几个挺好的算法,自己是依据需求和场景来定用哪个吧b.用ROI或其他方法划定出人脸区域c.为ROI圈定的区域建立histogram(这样你就有了几十个histogram,然后自己写个算法来提取这几十张histogram的通用特点[也就是模糊的找到这个人的脸部特征](然后再依据提取的特征建立一个histogram([程序第二部分]:[识别人脸]a.从摄像头,读入人脸b.初步降噪c.ROI划定区域d.建立一个histograme.用这个histogram与之前[学习中]的histogram进行比较,如果差异小于你规定的阀值,则确定识别成功。---------------------------------------------------------------------------------以上功能只能做到:如果这个人出现在摄像头前,则能认出这个人来了,如果其他人出现在摄像头前则输出“这个人不是要找的人”。---------------------------------------------------------------------------------上面的算法应该算是最简单的啦,所以效果应该不会太好,opencv中还可以对图像进行划分,然后定点五官,这个方法可能更好一些。---------------------------------------------------------------------------------如果你要让它能识别出多人,那么思路一样,只不过要对每个人进行上面提到的“机器学习”的过程,也就是建立一个自己的识别库的过程。

  ⒋openCV人脸识别的问题

  ⒌其实有很多办法,我说一种简单办法的思路吧,如果编码的话,代码量有些大。[思路]识别出某个人的脸(你先准备好这个人的几张或几十张的图片让程序来“学习”([程序分为两部分]第一部分:[学习这个人的脸]把这些图片逐个读入程序,然后对每个图片进行以下处理:a.初步降噪:可以用cvErode或更好级别的算法来对图像完成初步降噪(opencv这块有几个挺好的算法,自己是依据需求和场景来定用哪个吧b.用ROI或其他方法划定出人脸区域c.为ROI圈定的区域建立histogram(这样你就有了几十个histogram,然后自己写个算法来提取这几十张histogram的通用特点[也就是模糊的找到这个人的脸部特征](然后再依据提取的特征建立一个histogram([程序第二部分]:[识别人脸]a.从摄像头,读入人脸b.初步降噪c.ROI划定区域d.建立一个histograme.用这个histogram与之前[学习中]的histogram进行比较,如果差异小于你规定的阀值,则确定识别成功。---------------------------------------------------------------------------------以上功能只能做到:如果这个人出现在摄像头前,则能认出这个人来了,如果其他人出现在摄像头前则输出“这个人不是要找的人”。---------------------------------------------------------------------------------上面的算法应该算是最简单的啦,所以效果应该不会太好,opencv中还可以对图像进行划分,然后定点五官,这个方法可能更好一些。---------------------------------------------------------------------------------如果你要让它能识别出多人,那么思路一样,只不过要对每个人进行上面提到的“机器学习”的过程,也就是建立一个自己的识别库的过程。

  ⒍opencv的人脸识别基于什么特征

  ⒎基于几何特征的人脸识别方法

  ⒏基于特征的方法是一种自下而上的人脸检测方法,由于人眼可以将人脸在不此研究人员认为有一个潜在的假设:人脸或人脸的部件可能具有在各种条件下都不会改变的特征或属性,如形状、肤色、纹理、边缘信息等。基于特征的方法的目标就是寻找上述这些不变特征,并利用这些特征来定位入脸。这类方法在特定的环境下非常有效且检测速度较高,对人脸姿态、表情、旋转都不敏感。但是由于人脸部件的提取通常都借助于边缘算子,因此,这类方法对图像质量要求较高,对光照和背景等有较高的要求,因为光照、噪音、阴影都极有可能破坏人脸部件的边缘,从而影响算法的有效性。

  ⒐模板匹配算法首先需要人TN作标准模板(固定模板)或将模板先行参数化(可变模板),然后在检测人脸时,计算输入图像与模板之间的相关值,这个相关值通常都是独立计算脸部轮廓、眼睛、鼻子和嘴各自的匹配程度后得出的综合描述,最后再根据相关值和预先设定的阈值来确定图像中是否存在人脸。基于可变模板的人脸检测算法比固定模板算法检测效果要好很多,但是它仍不能有效地处理人脸尺度、姿态和形状等方面的变化。

  ⒑基于外观形状的方法并不对输入图像进行复杂的预处理,也不需要人工的对人脸特征进行分析或是抽取模板,而是通过使用特定的方法(如主成分分析方法(PCA)、支持向量机(SVM)、神经网络方法(ANN)等)对大量的人脸和非人脸样本组成的训练集(一般为了保证训练得到的检测器精度,非人脸样本集的容量要为人脸样本集的两倍以上)进行学习,再将学习而成的模板或者说分类器用于人脸检测。因此,这也是j种自下而上的方法。这种方法的优点是利用强大的机器学习算法快速稳定地实现了很好的检测结果,并且该方法在复杂背景下,多姿态的人脸图像中也能得到有效的检测结果。但是这种方法通常需要遍历整个图片才能得到检测结果,并且在训练过程中需要大量的人脸与非人脸样本,以及较长的训练时间。近几年来,针对该方法的人脸检测研究相对比较活跃。

  ⒒基于代数特征的人脸识别方法

  ⒓在基于代数特征的人脸识别中,每一幅人脸图像被看成是以像素点灰度为元素的矩阵,用反映某些性质的数据特征来表示人脸的特征。设人脸图像),(yxI为二维NM×灰度图像,同样可以看成是NMn×=维列向量,可视为NM×维空间中的一个点。但这样的一个空间中,并不是空间中的每一部分都包含有价值的信息,故一般情况下,需要通过某种变换,将如此巨大的空间中的这些点映射到一个维数较低的空间中去。然后利用对图像投影间的某种度量来确定图像间的相似度,最常见的就是各种距离度量。在基于代数特征的人脸识别方法中,主成分分析法(PCA和Fisher线性判别分析(LDA是研究最多的方法。本章简要介绍介绍了PCA。

  ⒔完整的PCA(PrincipalponentAnalysis)人脸识别的应用包括四个步骤:人脸图像预处理;读入人脸库,训练形成特征子空间;把训练图像和测试图像投影的上一步骤中得到的子空间上;选择一定的距离函数进行识别。详细描述如下:

  ⒕一归一化人脸库后,将库中的每个人选择一定数量的图像构成训练集,设归一化后的图像是n×n,按列相连就构成n维矢量,可视为n维空间中的一个点,可以通过K-L变换用一个低维子空间描述这个图像。

  ⒖计算K.L变换的生成矩阵

  ⒗训练样本集的总体散布矩阵为产生矩阵,即

  ⒘式中xi为第i个训练样本的图像向量,|l为训练样本的均值向量,M为训练样本的总数。为了求n×n维矩阵∑的特征值和正交归一化的特征向量,要直接计算的话,计算量太大,由此引入奇异值分解定理来解决维数过高的问题。

  ⒙利用奇异值分解(AVD)定理计算图像的特征值和特征向量

  ⒚设A是一个秩为r的行n×r维矩阵,则存在两个正交矩阵和对角阵:

  ⒛其中凡则这两个正交矩阵和对角矩阵满足下式:

  其中为矩阵的非零特征值,

  把训练图像和测试图像投影到特征空间每一副人脸图像向特征脸子空间投影,得到一组坐标系数,就对应于子空间中的一个点。同样,子空间中的任一点也对应于~副图像。这组系数便可作为人脸识别的依据,也就是这张人脸图像的特征脸特征。也就是说任何一幅人脸图像都可以表示为这组特征脸的线性组合,各个加权系数就是K.L变换的展开系数,可以作为图像的识别特征,表明了该图像在子空间的位置,也就是向量

  可用于人脸检测,如果它大于某个阈值,可以认为f是人脸图像,否则就认为不是。这样原来的人脸图象识别问题就转化为依据子空间的训练样本点进行分类的问题。

  基于连接机制的人脸识别方法

  基于连接机制的识别方法的代表性有神经网络和弹性匹配法。

  神经网络(ANN)在人工智能领域近年来是一个研究热门,基于神经网络技术来进行人脸特征提取和特征识别是一个积极的研究方向。神经网络通过大量简单神经元互联来构成复杂系统,在人脸识别中取得了较好的效果,特别是正面人脸图像。常用的神经网络有:BP网络、卷积网络、径向基函数网络、自组织网络以及模糊神经网络等n¨。BP网络的运算量较小耗时也短,它的自适应功能使系统的鲁棒性增强。神经网络用于人脸识别,相比较其他方法,其可以获得识别规则的隐性表达,缺点是训练时间长、运算量大、收敛速度慢且容易陷入局部极小点等。Gutta等人结合RBF与树型分类器的混合分类器模型来进行人脸识别乜螂。Lin等人采用虚拟样本进行强化和反强化学习,采用模块化的网络结构网络的学习加快,实现了基于概率决策的神经网络方法获得了较理想结果,。此种方法能较好的应用于人脸检测和识别的各步骤中。弹性匹配法采用属性拓扑图代表人脸,拓扑图的每个顶点包含一个特征向量,以此来记录人脸在该顶点位置周围的特征信息¨引。拓扑图的顶点是采用小波变换特征,对光线、角度和尺寸都具有一定的适应性,且能适应表情和视角的变化,其在理论上改进了特征脸算法的一些缺点。

  基于三维数据的人脸识别方法

  一个完整的人脸识别系统包括人脸面部数据的获取、数据分析处理和最终结果输出三个部分。图-显示了三维人脸识别的基本步骤:、通过三维数据采集设备获得人脸面部的三维形状信息;、对获取的三维数据进行平滑去噪和提取面部区域等预处理;、从三维数据中提取人脸面部特征,通过与人脸库中的数据进行比对;、用分类器做分类判别,输出最后决策结果。

  基于三维数据的方法的代表性是基于模型合成的方法和基于曲率的方法。

  基于模型合成的方法,它的基本思想为:输入人脸图像的二维的,用某种技术恢复(或部分恢复)人脸的三维信息,再重新合成指定条件下的人脸图像。典型代表是D可变形模型和基于形状恢复的D增强人脸识别算法。D可变形模型首先通过个高精度的D人脸模型构建一个可变形的D人脸模型,用这个模型来对给定的人脸图像拟合,获得一组特定的参数,再合成任何姿态和光照的人脸图像n卜捌。基于形状恢复的D增强人脸识别算法是利用通用的D人脸模型合成新的人脸图像,合成过程改变了一定的姿态与光源情况。

  曲率是最基本的表达曲面信息的局部特征,因而最早用来处理D人脸识别问题的是人脸曲面的曲率。Lee禾lJ用平均曲率和高斯曲率值,将人脸深度图中凸的区域分割出来。

  如果你是开发者的话,可以去Tel一下colorreco,更好地技术解答。

  怎样使用OpenCV进行人脸识别

  首先就是数据的准备,你要从网络上下载一些人脸库,后面用来训练人脸识别模型。人脸检测模型opencv是自带的,但是识别模型需要自己训练。下载人脸库之后需要对人脸进行标记,这是一个繁琐的工作,不过网上有脚本或者自己写个程序简化工作量。、把数据标记好之后就是opencv的事情。训练的函数非常简单。只有下面这三句:Ptr《FaceRecognizer》model=createEigenFaceRecognizer();model-》train(images,labels);model-》save(“MyFacePCAModel.xml“);、然后打开摄像头进行人脸检测,就是框出人脸的位置。人脸检测模型是opencv自带的。CascadeClassifiercascade;cascade.load(“haarcascade_frontalface_alt.xml“);这是加载的方法。cascade.detectMultiScale(gray,faces,.,,//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(,));这是检测的方法。这里检测得到的就是一个一个的人脸的矩形框,然后用画矩形的方法把它们画出来就行了。、然后就是对检测到的人脸进行识别了,用我们刚才训练好的人脸模型。加载:Ptr《FaceRecognizer》modelPCA=createEigenFaceRecognizer();modelPCA-》load(“MyFacePCAModel.xml“);检测:intpredictPCA=;if(face.rows》=){resize(face,face_test,Size(,));}if(!face_test.empty()){predictPCA=modelPCA-》predict(face_test);}如果预测结果等于标记结果,说明识别正确。大致流程就这样了,如果你对opencv有了一定的了解,应该能看懂了。

  opencv实现人脸识别有多少种算法

  OpenCV在..以后的版本中开始自带人脸识别,共有三种人脸识别算法的实现,分别是PCA,LDA,LBPH.OpenCV创建方法如下:cv::Ptr《cv::FaceRecognizer》facerPCA,facerLDA;cv::Ptr《cv::FaceRecognizer》facerLBPH=cv::createLBPHFaceRecognizer();facerPCA=cv::Algorithm::create《cv::FaceRecognizer》(“FaceRecognizer.Eigenfaces“);facerLDA=cv::Algorithm::create《cv::FaceRecognizer》(“FaceRecognizer.Fisherfaces“);在OpenCV中,人脸识别的实现被移动到第三方库opencv_contrib中,而且OpenCV版本的各个版本..,..,..的创建方法均不同,且都被移动到cv::face::名字空间下.

  opencv的人脸识别算法只能是HMM吗

  其实主要是用LBP其他所谓的新算法无非就是在LBP的基础上做一些求导什么的,或者在最后的卡方距离计算上做手脚但是精准度个人觉得还是LBP比较好,其他的未必是改进,也许是改差版当然也有一些国外大学自己有秘密的算法,据说只需要大致轮廓以及双眼就能识别出人,其他特征可有可无,但是只有论文还是算法没有公布

您可能感兴趣的文章:

相关文章