在本文中,我们探索OpenCV和Python在创建强大的人脸识别系统方面的巨大潜力。从而逐步实现识别图像和视频中的人脸的整个过程。凭借清晰的解释和实际示例,希望您深入了解计算机视觉和人脸识别。 下载OpenCV库 访问官网进行下载并安装:https:opencv。orgpipinstallopencvpython 安装完成之后我们可以在文件夹下看到这些文件sourcesdatahaarcascades 包含了强大的识别算法,如眼睛识别和面部识别人脸检测报警系统(可用于:家庭监控、人脸门禁、人脸考勤等) 抓拍人脸功能模块。 首先导入cv库。importcv2 然后调用我们的摄像头(0代表本地摄像头,其他数字代表外置摄像头)。capcv2。VideoCapture(0) 使用while循环来确定它是否处于打开状态。while(cap。isOpened()): 获取每一帧的图像。retflag,Vshowcap。read() 调用控制键盘函数来控制和确定按键。kcv2。waitKey(1)0xFF 使用imshow函数显示捕获的图像。cv2。imshow(ceshi,Vshow) 监听键盘输入,按s键保存。ifkord(s): 保存捕获图像的格式并打印提示文本。cv2。imwrite(tmpstr(num)。name。jpg,Vshow)print(savestr(num)。jpg)print()num1 释放摄像头和内存。cap。release()cv2。destroyAllWindows() 完整的代码片段importcv2capcv2。VideoCapture(0)falg1num1while(cap。isOpened()):retflag,Vshowcap。read()kcv2。waitKey(1)0xFFcv2。imshow(ceshi,Vshow)ifkord(s):cv2。imwrite(tmpstr(num)。name。jpg,Vshow)print(savestr(num)。jpg)print()num1elifkord():breakcap。release()cv2。destroyAllWindows()录人脸功能模块 在编写这个功能模块之前,我们需要在Pycharm或者cmd中在这个文件的根目录下使用如下命令安装人脸模块pipinstallopencvcontribpython 导入依赖importosimportcv2fromPILimportImageimportnumpyasnp 存储人脸数据facesSamples〔〕 存储名称数据ids〔〕 存储图片的信息imagePaths〔os。path。join(path,f)forfinos。listdir(path)〕 加载分类器facecascadecv2。CascadeClassifier(haarcascadefrontalfacedefault。xml) 遍历图像forimagePathinimagePaths: 将打开的图像转换为灰度PILimgImage。open(imagePath)。convert(L) 将图像转换为数组imgnumpynp。array(PILimg,uint8) 获取图片中的人脸特征facesfacedetector。detectMultiScale(imgnumpy) 获取每张抓拍图片的id和nameidint(os。path。split(imagePath)〔1〕。split(。)〔0〕) 防止无脸拍照forx,y,w,hinfaces:ids。append(id)facesSamples。append(imgnumpy〔y:yh,x:xw〕) 打印面部特征和ID,并返回数据print(id,id)print(fs:,facesSamples)returnfacesSamples,ids 调用图片路径(步骤1抓脸后按s键保存到tmp路径下的图片)pathtmp 检索图像数组和ID标签数组和名称faces,idsgetImageAndLabels(path) 加载识别器recognizercv2。face。LBPHFaceRecognizercreate() 训练数据recognizer。train(faces,np。array(ids)) 创建一个目录存放读取到的人脸信息recognizer。write(tmptupian。yml) 完整的代码片段importosimportcv2fromPILimportImageimportnumpyasnpdefgetImageAndLabels(path):facesSamples〔〕ids〔〕imagePaths〔os。path。join(path,f)forfinos。listdir(path)〕facedetectorcv2。CascadeClassifier(opencvinstalledpathsourcesdatahaarcascadeshaarcascadefrontalfacedefault。xml)forimagePathinimagePaths:PILimgImage。open(imagePath)。convert(L)imgnumpynp。array(PILimg,uint8)facesfacedetector。detectMultiScale(imgnumpy)idint(os。path。split(imagePath)〔1〕。split(。)〔0〕)forx,y,w,hinfaces:ids。append(id)facesSamples。append(imgnumpy〔y:yh,x:xw〕)print(id,id)print(fs:,facesSamples)returnfacesSamples,idsifnamemain:pathtmpfaces,idsgetImageAndLabels(path)recognizercv2。face。LBPHFaceRecognizercreate()recognizer。train(faces,np。array(ids))recognizer。write(tmptupian。yml)人脸识别功能模块 导入依赖importcv2importos 加载训练好的数据文件recogizercv2。face。LBPHFaceRecognizercreate() 加载保存的面部信息recogizer。read(tmptupian。yml) 定义名称数组names〔〕 定义用于识别的全局变量warningtime0 视频模块中的人脸识别deffacedetectdemo(img):graycv2。cvtColor(img,cv2。COLORBGR2GRAY)facedetectorcv2。CascadeClassifier(opencvinstalledpathsourcesdatahaarcascadeshaarcascadefrontalfacedefault。xml)facefacedetector。detectMultiScale(gray)forx,y,w,hinface:cv2。rectangle(img,(x,y),(xw,yh),color(0,0,255),thickness2)cv2。circle(img,center(xw2,yh2),radiusw2,color(0,255,0),thickness1)ids,confidencerecogizer。predict(gray〔y:yh,x:xw〕)ifconfidence80:globalwarningtimewarningtime1ifwarningtime100:warning()warningtime0cv2。putText(img,unknown,(x10,y10),cv2。FONTHERSHEYSIMPLEX,0。75,(0,255,0),1)else:cv2。putText(img,str(names〔ids1〕),(x10,y10),cv2。FONTHERSHEYSIMPLEX,0。75,(0,255,0),1)cv2。imshow(result,img) 导入存储的图像名称标签defname():pathtmpnames〔〕imagePaths〔os。path。join(path,f)forfinos。listdir(path)〕forimagePathinimagePaths:namestr(os。path。split(imagePath)〔1〕。split(。,2)〔1〕)names。append(name) 加载视频capcv2。VideoCapture(1。mp4)name()whileTrue:flag,framecap。read()ifnotflag:breakfacedetectdemo(frame)iford()cv2。waitKey(10):break 释放内存和视频cv2。destroyAllWindows()cap。release() 完整的代码片段importcv2importosrecogizercv2。face。LBPHFaceRecognizercreate()recogizer。read(tupiantupian。yml)names〔〕warningtime0deffacedetectdemo(img):graycv2。cvtColor(img,cv2。COLORBGR2GRAY)facedetectorcv2。CascadeClassifier(opencvinstalledpathsourcesdatahaarcascadeshaarcascadefrontalfacedefault。xml)facefacedetector。detectMultiScale(gray)forx,y,w,hinface:cv2。rectangle(img,(x,y),(xw,yh),color(0,0,255),thickness2)cv2。circle(img,center(xw2,yh2),radiusw2,color(0,255,0),thickness1)ids,confidencerecogizer。predict(gray〔y:yh,x:xw〕)ifconfidence80:globalwarningtimewarningtime1ifwarningtime100:warning()warningtime0cv2。putText(img,unkonw,(x10,y10),cv2。FONTHERSHEYSIMPLEX,0。75,(0,255,0),1)else:cv2。putText(img,str(names〔ids1〕),(x10,y10),cv2。FONTHERSHEYSIMPLEX,0。75,(0,255,0),1)cv2。imshow(result,img)defname():pathtmpnames〔〕imagePaths〔os。path。join(path,f)forfinos。listdir(path)〕forimagePathinimagePaths:namestr(os。path。split(imagePath)〔1〕。split(。,2)〔1〕)names。append(name)capcv2。VideoCapture(1。mp4)name()whileTrue:flag,framecap。read()ifnotflag:breakfacedetectdemo(frame)iford()cv2。waitKey(10):breakcv2。destroyAllWindows()cap。release() 最后,希望这些示例代码对您的项目有所帮助!