1说明: 1。1参考文章:https:www。cnblogs。comxp12345p9818435。html 1。2对原代码进行注释,调试,增加PIL法显示中文标示。 1。3获取摄像头实现动态人脸识别。 1。4分为:侦测收集训练识别。 2准备: 2。1安装opencv:pipinstallopencvpython 2。2注意:导入模块importcv2cv2不是版本号 科普一下: cv2中的2不是指定发布的版本号,而是为了区分OpenCV的C和C的版本。 OpenCV1。x使用C开发;而OpenCV2。x使用C。 2。3环境: 华为笔记本电脑、深度deepinlinux操作系统、谷歌浏览器、python3。8和微软vscode编辑器。 3文件结构: 3。1图: 3。2层次示意图: 3。3两个xml文件来自:分类器一般位于安装包cv2下比如:本机:file:usrlocalpython3。8libpython3。8sitepackagescv2data下,复制过来即可 以下代码基于笔记本电脑的摄像头,需打开,训练自己头像 4五个代码依次进行: 4。11FaceDetection。py代码:人脸检测importnumpyasnpimportcv2人脸识别分类器faceCascadecv2。CascadeClassifier(homexgjDesktopfacedehaarcascadefrontalfacedefault。xml)识别眼睛的分类器eyeCascadecv2。CascadeClassifier(homexgjDesktopfacedehaarcascadeeye。xml)开启摄像头capcv2。VideoCapture(0)okTrueresult〔〕原bug,自己补充whileok:读取摄像头中的图像,ok为是否读取成功的判断参数ok,imgcap。read()转换成灰度图像graycv2。cvtColor(img,cv2。COLORBGR2GRAY)人脸检测facesfaceCascade。detectMultiScale(gray,scaleFactor1。2,minNeighbors5,minSize(32,32))result〔〕在检测人脸的基础上检测眼睛for(x,y,w,h)infaces:facgraygray〔y:(yh),x:(xw)〕result〔〕eyeseyeCascade。detectMultiScale(facgray,1。3,2)眼睛坐标的换算,将相对位置换成绝对位置for(ex,ey,ew,eh)ineyes:result。append((xex,yey,ew,eh))画矩形框脸部for(x,y,w,h)infaces:cv2。rectangle(img,(x,y),(xw,yh),(255,0,0),2)眼睛for(ex,ey,ew,eh)inresult:cv2。rectangle(img,(ex,ey),(exew,eyeh),(0,255,0),2)显示cv2。imshow(video,img)退出定义kcv2。waitKey(1)ifk27:pressESCtoquitbreakcap。release()cv2。destroyAllWindows() 注意4。1代码不需要也没关系 4。22FaceDataCollect。py代码:FaceDataCollect,人脸数据收集importcv2importos调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2capcv2。VideoCapture(0)注意路径facedetectorcv2。CascadeClassifier(homexgjDesktopfacedehaarcascadefrontalfacedefault。xml)请输入id:0为一个人,第二个人请输入1,在4py中检测识别中idnums有用faceidinput(enteruserid:)print(Initializingfacecapture。Lookatthecameraandwait。。。)count0whileTrue:从摄像头读取图片sucess,imgcap。read()转为灰度图片graycv2。cvtColor(img,cv2。COLORBGR2GRAY)检测人脸facesfacedetector。detectMultiScale(gray,1。3,5)面部画框for(x,y,w,h)infaces:cv2。rectangle(img,(x,y),(xw,yw),(255,0,0))count1保存图像,注意路径cv2。imwrite(homexgjDesktopfacedeimguser。str(faceid)。str(count)。jpg,gray〔y:yh,x:xw〕)cv2。imshow(image,img)保持画面的持续。kcv2。waitKey(1)ifk27:通过esc键退出摄像breakelifcount1000:得到1000个样本后退出摄像,可自定义数值大小break关闭摄像头cap。release()cv2。destroyAllWindows()大概需要半个小时,收集1000张图片我自己约5分钟后暂停,期间可以做各种面部动作,我大概收集50张 4。33facetraining。py代码:facetraining,人脸数据训练importnumpyasnpfromPILimportImageimportosimportcv2人脸数据路径,上面保存的灰色照片数据集pathhomexgjDesktopfacedeimgrecognizercv2。face。LBPHFaceRecognizercreate()detectorcv2。CascadeClassifier(homexgjDesktopfacedehaarcascadefrontalfacedefault。xml)defgetImagesAndLabels(path):imagePaths〔os。path。join(path,f)forfinos。listdir(path)〕faceSamples〔〕ids〔〕forimagePathinimagePaths:PILimgImage。open(imagePath)。convert(L)convertittograyscaleimgnumpynp。array(PILimg,uint8)idint(os。path。split(imagePath)〔1〕。split(。)〔1〕)facesdetector。detectMultiScale(imgnumpy)for(x,y,w,h)infaces:faceSamples。append(imgnumpy〔y:yh,x:xw〕)ids。append(id)returnfaceSamples,idsprint(Trainingfaces。Itwilltakeafewseconds。Wait。。。)faces,idsgetImagesAndLabels(path)recognizer。train(faces,np。array(ids))保存训练好的文件recognizer。write(homexgjDesktopfacedefacetrainertrainer。yml)print({0}facestrained。ExitingProgram。format(len(np。unique(ids)))) 4。4人脸识别: 4。4。1英文版的人脸识别4facerecognition。py代码:facerecognition人脸检测并识别,显示人名importcv2recognizercv2。face。LBPHFaceRecognizercreate()recognizer。read(homexgjDesktopfacedefacetrainertrainer。yml)cascadePathhomexgjDesktopfacedehaarcascadefrontalfacedefault。xmlfaceCascadecv2。CascadeClassifier(cascadePath)fontcv2。FONTHERSHEYSIMPLEX这里为0或者1都没有关系idnum1names〔Allen,Bob〕names中存储人的名字,若该人id为0则他的名字在第一位,id位1则排在第二位,以此类推camcv2。VideoCapture(0)minW0。1cam。get(3)minH0。1cam。get(4)whileTrue:ret,imgcam。read()graycv2。cvtColor(img,cv2。COLORBGR2GRAY)facesfaceCascade。detectMultiScale(gray,scaleFactor1。2,minNeighbors5,minSize(int(minW),int(minH)))for(x,y,w,h)infaces:cv2。rectangle(img,(x,y),(xw,yh),(0,255,0),2)idnum,confidencerecognizer。predict(gray〔y:yh,x:xw〕)ifconfidence100:idnumnames〔idnum〕confidence{0}。format(round(100confidence))else:idnumunknownconfidence{0}。format(round(100confidence))cv2。putText(img,str(idnum),(x5,y5),font,1,(0,0,255),1)不能显示中文cv2。putText(img,str(confidence),(x5,yh5),font,1,(0,0,0),1)cv2。imshow(camera,img)kcv2。waitKey(10)ifk27:breakcam。release()cv2。destroyAllWindows() 4。4。2PIL法显示中文的人脸识别5facerecognitionzhPIL。py代码:自己添加的facerecognition人脸检测,PIL法显示中文人名importcv2增加的PIL法显示中文importnumpyfromPILimportImage,ImageDraw,ImageFont定义一个函数defcv2ImgAddText(img,text,left,top,textColor(0,255,0),textSize20):if(isinstance(img,numpy。ndarray)):判断是否OpenCV图片类型imgImage。fromarray(cv2。cvtColor(img,cv2。COLORBGR2RGB))创建一个可以在给定图像上绘图的对象drawImageDraw。Draw(img)字体的格式,自己下载华文仿宋字体,放在根目录下fontStyleImageFont。truetype(hwfs。ttf,textSize,encodingutf8)绘制文本draw。text((left,top),text,textColor,fontfontStyle)转换回OpenCV格式returncv2。cvtColor(numpy。asarray(img),cv2。COLORRGB2BGR)recognizercv2。face。LBPHFaceRecognizercreate()recognizer。read(homexgjDesktopfacedefacetrainertrainer。yml)cascadePathhomexgjDesktopfacedehaarcascadefrontalfacedefault。xmlfaceCascadecv2。CascadeClassifier(cascadePath)fontcv2。FONTHERSHEYSIMPLEX这里为0或者1都没有关系idnum0names〔机器人,Bob〕names中存储人的名字,若该人id为0则他的名字在第一位,id位1则排在第二位,以此类推camcv2。VideoCapture(0)minW0。1cam。get(3)minH0。1cam。get(4)whileTrue:ret,imgcam。read()graycv2。cvtColor(img,cv2。COLORBGR2GRAY)facesfaceCascade。detectMultiScale(gray,scaleFactor1。2,minNeighbors5,minSize(int(minW),int(minH)))for(x,y,w,h)infaces:cv2。rectangle(img,(x,y),(xw,yh),(0,255,0),2)idnum,confidencerecognizer。predict(gray〔y:yh,x:xw〕)ifconfidence100:idnumnames〔idnum〕confidence{0}。format(round(100confidence))else:idnumunknownconfidence{0}。format(round(100confidence))cv2。putText(img,str(idnum),(x5,y5),font,1,(0,0,255),1)不能显示中文注意下面格式,位置去掉元组格式,并int化imgcv2ImgAddText(img,str(idnum),int(x5),int(y5),(0,0,255),20)显示为中文PIL法cv2。putText(img,str(confidence),(x5,yh5),font,1,(0,0,0),1)cv2。imshow(camera,img)kcv2。waitKey(10)ifk27:breakcam。release()cv2。destroyAllWindows() 效果图 以上代码亲测可用 喜欢的人,请点赞、关注、评论、转发和收藏。 谢谢原博主。