#导入人脸识别模块mpFace=mp.solutions.face_detection#导入绘图模块mpDraw=mp.solutions.drawing_utils#自定义人脸识别方法 。最小的人脸检测置信度0.5faceDetection=mpFace.FaceDetection(min_detection_confidence=0.5)#(1)导入视频filepath='C:\GameDownload\DeepLearning\face.mp4'cap=cv2.VideoCapture(filepath)pTime=0#记录每帧图像处理的起始时间boxlist=[]#保存每帧图像每个框的信息#(2)处理每一帧图像whileTrue:#每次取出一帧图像 。返回是否读取成功(True/False) 。以及读取的图像数据success,img=cap.read()#将opencv导入的BGR图像转为RGB图像imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#将每一帧图像传给人脸识别模块results=faceDetection.process(imgRGB)#如果检测不到人脸那就返回Noneifresults.detections:#返回人脸索引index(第几张脸) 。和关键点的坐标信息forindex,detectioninenumerate(results.detections):#遍历每一帧图像并打印结果#print(index,detection)#每帧图像返回一次是人脸的几率 。以及识别框的xywh 。后续返回关键点的xy坐标print(detection.score)#是人脸的的可能性print(detection.location_data.relative_bounding_box)#识别框的xywh#设置一个边界框 。接收所有的框的xywh及关键点信息bboxC=detection.location_data.relative_bounding_box#接收每一帧图像的宽、高、通道数ih,iw,ic=img.shape#将边界框的坐标点从比例坐标转换成像素坐标#将边界框的宽和高从比例长度转换为像素长度bbox=(int(bboxC.xmin*iw),int(bboxC.ymin*ih),int(bboxC.width*iw),int(bboxC.height*ih))#有了识别框的xywh就可以在每一帧图像上把框画出来#cv2.rectangle(img,bbox,(255,0,0),5)#自定义绘制函数 。不适用官方的mpDraw.draw_detection#把人脸的概率显示在检测框上,img画板 。概率值*100保留两位小数变成百分数 。再变成字符串cv2.putText(img,f'{str(round(detection.score[0]*100,2))}%',(bbox[0],bbox[1]-20),#文本显示的位置 。-20是为了不和框重合cv2.FONT_HERSHEY_PLAIN,#文本字体类型2,(0,0,255),2)#字体大小;字体颜色;线条粗细#保存索引 。人脸概率 。识别框的x/y/w/hboxlist.append([index,detection.score,bbox])#(3)修改识别框样式x,y,w,h=bbox#获取识别框的信息,xy为左上角坐标点x1,y1=x+w,y+h#右下角坐标点#绘制比矩形框粗的线段 。img画板 。线段起始点坐标 。线段颜色 。线宽为8cv2.line(img,(x,y),(x+20,y),(255,0,255),4)cv2.line(img,(x,y),(x,y+20),(255,0,255),4)cv2.line(img,(x1,y1),(x1-20,y1),(255,0,255),4)cv2.line(img,(x1,y1),(x1,y1-20),(255,0,255),4)cv2.line(img,(x1,y),(x1-20,y),(255,0,255),4)cv2.line(img,(x1,y),(x1,y+20),(255,0,255),4)cv2.line(img,(x,y1),(x+20,y1),(255,0,255),4)cv2.line(img,(x,y1),(x,y1-20),(255,0,255),4)#在每一帧图像上绘制矩形框cv2.rectangle(img,bbox,(255,0,255),1)#自定义绘制函数#记录每帧图像处理所花的时间cTime=time.time()fps=1/(cTime-pTime)#计算fps值pTime=cTime#更新每张图像处理的初始时间#把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细cv2.putText(img,f'FPS:{str(int(fps))}',(10,50),cv2.FONT_HERSHEY_PLAIN,3,(0,255,0),3)#显示图像 。输入窗口名及图像数据cv2.imshow('image',img)ifcv2.waitKey(50)&0xFF==27:#每帧滞留50毫秒后消失 。ESC键退出break#释放视频资源cap.release()cv2.destroyAllWindows()
修改后的检测框效果如下
文章插图
文章插图
我们将坐标信息存放在了boxlist中 。boxlist.append([index, detection.score, bbox]) 存放人脸索引、评分、检测框信息 。把它打印出来看一下 。比如某帧图像所在的视频有3张脸 。每一帧都会输出0、1、2三个识别框的概率 。左上角坐标xy 。框的宽高wh
【免费人脸识别软件 人脸识别软件app推荐】 。。。。。。。。。。。。。。。。。。。。。。。。。[0,[0.9619430303573608],(98,100,96,96)],[1,[0.9173532128334045],(457,65,118,118)],[2,[0.8985080122947693],(268,52,123,123)],[0,[0.9615015983581543],(98,100,97,97)],[1,[0.9164762496948242],(457,65,118,118)],[2,[0.9118367433547974],(269,53,123,123)],[0,[0.9616674780845642],(97,100,97,97)],[1,[0.9218802452087402],(272,53,122,122)],[2,[0.9176990389823914],(456,65,118,118)],[0,[0.9638006091117859],(97,101,97,97)],[1,[0.9180505275726318],(276,56,119,119)],[2,[0.9177079796791077],(456,64,118,118)], 。。。。。。。。。。。。。。。。。。。。。。。。。。
推荐阅读
- 孩子从几岁开始识字比较合适?
- 到底是六七十年代的冬天冷,还是现在的冬天冷?
- 如何理解王阳明的“四句教”?“无善无恶是心之体,有善有恶是意之动,知善知恶是良知,为善去恶是格物”?
- 包包链条掉色怎么补救 包包链条褪色了怎么变新
- 六七十年代家里有20000块钱,算什么家庭?
- 小孩子现在学习的国学到底是什么?如果学校教授三从四德,你会同意吗?为什么?
- 五十、六十、七十年代出生的朋友,穿过手工做的布鞋吗?还记得是谁做的吗?
- 属虎的人性格怎么样?
- 好看的校园言情小说甜文 高质量甜宠文青春校园