1说明 1。1准备篇《Dlib库教程(1):介绍、linux下的安装与避坑》。 1。2本次讲解Dlib库的强大的联合python的人脸检测、标记和识别功能。 1。3熟悉Dlib库的python的API功能函数。 1。4熟悉python编程相关知识,讲解思路清晰,注释仔细,干货满满,由浅入深,一秒入门。 1。5图片来自今日头条正版免费图库,表示对女神的喜爱,致敬,仅供学习。 1。6环境:python3。8dlib19。21。99opencv4。4。0deepinlinux操作系统。 1。jpeg 2。jpeg 2dlibopencvpython的人脸检测、识别和标示 2。1代码:人脸检测,画框和画68点特征显示第1步:导入模块importdlibimportcv2第2步:模型加载这是人脸68点特征检测器模型,提前官网下载好shapepredictorpathhomexgjDesktopdlibshapepredictor68facelandmarks。dat获取人脸分类器detectordlib。getfrontalfacedetector()获取人脸68点特征检测器,进行人脸面部轮廓特征提取:predictordlib。shapepredictor(shapepredictorpath)第3步:被检测图片载入被检测图片路径imgpathhomexgjDesktopdlibpic2。jpeg读图片,cv。imread()共两个参数,第二个为如何读取图片,包括cv2。IMREADCOLOR:读入一个彩色图片imgcv2。imread(imgpath,cv2。IMREADCOLOR)imgcv2。imread(imgpath)默认,等同于上面读取彩色图片这个是cv2特有的图片读取,需要转换,否则不是原图b,g,rcv2。split(img)img2cv2。merge(〔r,g,b〕)侦测人脸detsdetector(img2,1)第4步:forindex,faceinenumerate(dets):leftface。left()topface。top()rightface。right()bottomface。bottom()在人脸上标示绿色方框cv2。rectangle(img,(left,top),(right,bottom),(0,255,0),1)shapepredictor(img,face)forindex,ptinenumerate(shape。parts()):ptpos(pt。x,pt。y)标示人脸68个特征圆点cv2。circle(img,ptpos,1,(255,0,0),1)第5步:展示已经人脸识别后的带有标示图片cv2。imshow(pic,img)cv2。namedWindow(pic,cv2。WINDOWAUTOSIZE)窗口关闭设置kcv2。waitKey(0)cv2。destroyAllWindows() 2。2图 3dlibcv2numpy法人脸检测和识别 3。1代码encoding:utf8代码来源https:blog。csdn。netliuxiao214articledetails83411820?utmmediumdistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai21。channelparamdepth1utmsourcedistribute。pcrelevant。nonetaskblogBlogCommendFromMachineLearnPai21。channelparam人脸检测,画框importdlibimportnumpyasnpimportcv2获得人脸矩形的坐标信息函数defrecttobb(rect):xrect。left()yrect。top()wrect。right()xhrect。bottom()yreturn(x,y,w,h)图片大小调整函数defresize(image,width1200):将待检测的image进行resizerwidth1。0image。shape〔1〕dim(width,int(image。shape〔0〕r))resizedcv2。resize(image,dim,interpolationcv2。INTERAREA)returnresized人脸检测函数defdetect():加载待检测的图片imagefilehomexgjDesktopdlibpic1。jpegimagecv2。imread(imagefile)调整大小imageresize(image,width1200)灰度转换graycv2。cvtColor(image,cv2。COLORBGR2GRAY)dlib人脸检测器和人脸检测画框detectordlib。getfrontalfacedetector()dlib人脸检测矩形框4点坐标和对图像画人脸框rectsdetector(gray,1)画框和输出文字for(i,rect)inenumerate(rects):(x,y,w,h)recttobb(rect)cv2。rectangle(image,(x,y),(xw,yh),(0,255,0),2)cv2。putText(image,Face:{}。format(i1),(x10,y10),cv2。FONTHERSHEYSIMPLEX,0。5,(0,255,0),2)图片展示cv2。imshow(Output,image)cv2。waitKey(0)ifnamemain:detect() 3。2图 3。3增加功能,标注68人脸特征点 3。3。1代码encoding:utf8importdlibimportnumpyasnpimportcv2获得人脸矩形的坐标信息defrecttobb(rect):xrect。left()yrect。top()wrect。right()xhrect。bottom()yreturn(x,y,w,h)将包含68个特征的的shape转换为numpyarray格式defshapetonp(shape,dtypeint):coordsnp。zeros((68,2),dtypedtype)foriinrange(0,68):coords〔i〕(shape。part(i)。x,shape。part(i)。y)returncoords将待检测的image进行resizedefresize(image,width1200):rwidth1。0image。shape〔1〕dim(width,int(image。shape〔0〕r))resizedcv2。resize(image,dim,interpolationcv2。INTERAREA)returnresized人脸检测、识别、标注68特征点deffeature():加载被检测图片imagefilehomexgjDesktopdlibpic2。jpegimagecv2。imread(imagefile)imageresize(image,width1200)graycv2。cvtColor(image,cv2。COLORBGR2GRAY)加载dlib功能函数detectordlib。getfrontalfacedetector()predictordlib。shapepredictor(homexgjDesktopdlibshapepredictor68facelandmarks。dat)rectsdetector(gray,1)shapes〔〕人脸检测、识别和画框for(i,rect)inenumerate(rects):shapepredictor(gray,rect)获取特征点shapeshapetonp(shape)存入列表中shapes。append(shape)(x,y,w,h)recttobb(rect)cv2。rectangle(image,(x,y),(xw,yh),(0,255,0),2)cv2。putText(image,Face:{}。format(i1),(x10,y10),cv2。FONTHERSHEYSIMPLEX,0。5,(0,255,0),2)获取68关键点并画圈标注forshapeinshapes:for(x,y)inshape:cv2。circle(image,(x,y),2,(0,0,255),1)cv2。imshow(Output,image)cv2。waitKey(0)ifnamemain:feature() 3。3。2图 4高级一点:视频实时检测人脸和标注 4。1代码:codingutf8参考文章https:blog。csdn。netm037477175articledetails78151320?locationNum2fps1utmmediumdistribute。pcrelevant。nonetaskblogtitle6spm1001。2101。3001。4242摄像头实时,人脸检测和画框和画弧,默认红色框和蓝色人脸特征线importcv2importdlibdlib模型加载predictorpathhomexgjDesktopdlibshapepredictor68facelandmarks。dat初始化landmarkpredictordlib。shapepredictor(predictorpath)初始化dlib人脸检测器detectordlib。getfrontalfacedetector()初始化dlib自带显示窗口windlib。imagewindow()opencv加载视频文件capcv2。VideoCapture(homexxx。mp4)摄像头读取capcv2。VideoCapture(0)ifcap。isOpened():print(Unabletoconnecttocamera!)循环whilecap。isOpened():ret,cvimgcap。read()ifcvimgisNone:breakRGBTOBGRimgcv2。cvtColor(cvimg,cv2。COLORRGB2BGR)侦测和检测人脸detsdetector(img,0)shapes〔〕fori,dinenumerate(dets):shapepredictor(img,d)shapes。append(shape)win。clearoverlay()win。setimage(img)iflen(shapes)!0:foriinrange(len(shapes)):win。addoverlay(shapes〔i〕)win。addoverlay(dets)cap。release() 4。2再高级一点的代码调用摄像头,进行人脸捕获,和68个特征点的追踪参考原作者,感谢原作者Author:coneypoBlog:http:www。cnblogs。comAdaminXieGitHub:https:github。comconeypoDlibfacedetectionfromcamera第1步:导入模块importdlibimportnumpyasnpimportcv2时间模块用于截图保存后生成的文件名importtimeimporttimeit第2步:初始化储存截图的目录pathscreenshotshomexgjDesktopdlibdatascreenshotsdlib模块加载detectordlib。getfrontalfacedetector()predictordlib。shapepredictor(homexgjDesktopdlibshapepredictor68facelandmarks。dat)创建cv2摄像头对象capcv2。VideoCapture(0)cap。set(propId,value)设置视频参数,propId设置的视频参数,value设置的参数值cap。set(3,480)截图screenshots的计数器cnt0时间列表timecostlist〔〕第3步:cap。isOpened()返回truefalse检查初始化是否成功whilecap。isOpened():cap。read()返回两个值:一个布尔值truefalse,用来判断读取视频是否成功是否到视频末尾图像对象,图像的三维矩阵flag,imrdcap。read()每帧数据延时1ms,延时为0读取的是静态帧kcv2。waitKey(1)取灰度imggraycv2。cvtColor(imrd,cv2。COLORRGB2GRAY)startpointstarttimeit。defaulttimer()人脸数facesdetector(imggray,0)待会要写的字体fontcv2。FONTHERSHEYSIMPLEX标68个点iflen(faces)!0:检测到人脸foriinrange(len(faces)):landmarksnp。matrix(〔〔p。x,p。y〕forpinpredictor(imrd,faces〔i〕)。parts()〕)foridx,pointinenumerate(landmarks):68点的坐标pos(point〔0,0〕,point〔0,1〕)利用cv2。circle给每个特征点画一个圈,共68个cv2。circle(imrd,pos,2,color(139,0,0))利用cv2。putText输出168cv2。putText(imrd,str(idx1),pos,font,0。2,(187,255,255),1,cv2。LINEAA)cv2。putText(imrd,faces:str(len(faces)),(20,50),font,1,(0,0,0),1,cv2。LINEAA)endpointstoptimeit。defaulttimer()timecostlist。append(stopstart)else:没有检测到人脸cv2。putText(imrd,noface,(20,50),font,1,(0,0,0),1,cv2。LINEAA)添加说明imrdcv2。putText(imrd,pressS:screenshot,(20,400),font,0。8,(255,255,255),1,cv2。LINEAA)imrdcv2。putText(imrd,pressQ:quit,(20,450),font,0。8,(255,255,255),1,cv2。LINEAA)按下s键保存ifkord(s):cnt1cv2。imwrite(pathscreenshotsscreenshotstr(cnt)time。strftime(YmdHMS,time。localtime())。jpg,imrd)按下q键退出ifkord(q):break窗口显示参数取0可以拖动缩放窗口,为1不可以cv2。namedWindow(camera,0)cv2。namedWindow(camera,1)cv2。imshow(camera,imrd)释放摄像头cap。release()删除建立的窗口cv2。destroyAllWindows() 5备注:附注学习和复习opencv的色彩转换问题 5。1代码coding:utf8熟悉opencv色彩转换问题代码所在终端打开输入python3。811。pyhomexgjDesktopdlibpic1。jpegimportsysimportcv2importdlib采用skimage读取图片代码简单些,img全部为imgfromskimageimportioadd1detectordlib。getfrontalfacedetector()windlib。imagewindow()forfinsys。argv〔1:〕:imgio。imread(f)add2imgcv2。imread(f)opencv的增加色彩转换,增加2行b,g,rcv2。split(img)img1cv2。merge(〔r,g,b〕)detsdetector(img1,1)使用detector进行人脸检测fori,dinenumerate(dets):xd。left()yd。top()wd。right()hd。bottom()cv2。rectangle(img1,(x,y),(w,h),(0,255,0))print(({},{},{},{})。format(x,y,(wx),(hy)))win。setimage(img1)io。imsave(homexgjDesktopdlibPDlibtest。jpg,img)增加2行色彩转换r,g,bcv2。split(img1)img2cv2。merge(〔b,g,r〕)cv2。imwrite(homexgjDesktopdlibPDlibtest。jpg,img2)等待点击dlib。hitentertocontinue() 5。2操作效果图 下一次讲,dlib的目标检测和实时视频的行人计数。