> 文档中心 > report_one-人脸检测收集-(智能信息处理)

report_one-人脸检测收集-(智能信息处理)

源代码来源:

E:\Python\Pycharm\MYCODE\venv\my_code\AIlearning\AI_Detector\peopleAI.py

这是我的一个路径

一.算法流程:

1.导入相关库

2.视频显示窗体定义

3.打开摄像头

4.人脸识别

         4.1.构建人脸分类器并应用分类器侦测出人脸

        4.2 .在视频图像中标记处检测到的人脸,并显示图像收集进度

        4.3.保存未被标记的的视频图像帧

二.CODE详解

part_one:导入相关库

import cv2#导入cv,获取摄像头及相关图像展示与处理import numpy as np#导入数组模块import mediapipe as mp#导入媒体模块,比如人脸侦测的解决方案及函数import time#导入时间模块

插入视频:

part_two:视频显示窗体定义

cv2.namedWindow("w_img")#创建一个名叫w_img的窗体cv2.setVideo("w_img","Videos")#设置窗口标题cv2.moveWindows("w_img",0,0)#窗口移动到初始位置

part_three:打开摄像头

cap=cv2.VideoCaptrue(0)#调用设备0号摄像头while(cap.isOpened()):#判断摄像头是否是打开    status,frame=cap.read()#视频读取,并获取两个量,status,frame;    #status:获取视频状态;frame;获取视频的图像帧    #如果图像获取不成功,则直接退出循环,此次图像获取不成功    if not status: break;    cv2.imshow("w_img",frame)#w_img:窗体名称;frame:从视频获取到的图像帧;    #将从视频获取到的图像帧放入名为w_img的窗体内    #退出窗体    key=cv2.waitKey(30)#窗体获取一定的延迟    if key&0xFF==ord("q") break#释放摄像头cap.release()#释放名为w_img的窗体cv2.destoryWindow("w_img")

tips:在判断图像获取成功后要将图像转换成灰度

#图像转化成灰度,便于人脸识别;

    gray_frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)

part_four:

         4.1.构建人脸分类器并应用分类器侦测出人脸

        4.2 .在视频图像中标记处检测到的人脸,并显示图像收集进度

        4.3.保存未被标记的的视频图像帧

4.1.构建人脸分类器并应用分类器侦测出人脸

#构建一个人脸分类器#获取一个级联分类器,后面是相应的分类文件classifier=cv2.CascadeClassifier("E:/Python/Pycharm/MYCODE/venv/my_code/AIlearning/AI_Detector/haarcascade_frontalface_alt2.xml")cap=cv2.VideoCaptrue(0)#调用设备0号摄像头while(cap.isOpened()):#判断摄像头是否是打开    status,frame=cap.read()#视频读取,并获取两个量,status,frame;    #status:获取视频状态;frame;获取视频的图像帧    #如果图像获取不成功,则直接退出循环,此次图像获取不成功    if not status: break; #图像转化成灰度,便于人脸识别    gray_frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)    #侦测人脸:它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),函数由分类器对象调用    faces=classifier.detectMultiScale(gray_frame,1.2,3)    cv2.imshow("w_img",frame)#w_img:窗体名称;frame:从视频获取到的图像帧;    #将从视频获取到的图像帧放入名为w_img的窗体内    #退出窗体    key=cv2.waitKey(30)#窗体获取一定的延迟    if key&0xFF==ord("q") break#释放摄像头cap.release()#释放名为w_img的窗体cv2.destoryWindow("w_img")

tips:opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)

void detectMultiScale(const Mat& image,CV_OUT vector& objects,double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0,Size minSize = Size(),Size maxSize = Size());参数1:image--待检测图片,一般为灰度图像加快检测速度;参数2:objects--被检测物体的矩形框向量组;参数3:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。 如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框, 这种设定值一般用在用户自定义对检测结果的组合程序上;参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为 CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域, 因此这些区域通常不会是人脸所在区域;参数6、7:minSize和maxSize用来限制得到的目标区域的范围。

4.2 .在视频图像中标记处检测到的人脸,并显示图像收集进度

 #视频图像中,标记出人脸    #在得到人脸后faces后,标记出人脸(用矩形方框)    for x,y,w,h faces:     frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,255),5)    cv2.putText(frame,"Image Number:%d"%counter,(x,y-30),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),3) 

tips:cv2.rectangle函数运用

  #在图像识别中,需要地图像中某个特征进行标注,或者是显著出来。则可以使用:      方法rectangle(目标图像,边框左上角坐标,边框右下角坐标,color=BGR三基色像素值,thickness=矩阵边框的厚度)

tips:cv2.putText函数运用

cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细其中字体可以选择

4.3.保存未被标记的的视频图像帧

#在绘制矩形之前保存图像 #取出人脸,人脸是一个像素矩阵      f_img=frame[y:y+h,x:x+w] f_img=cv2.resize(f_img,(256,256)) cv2.imwrite("img/kuang/%d.jpg"%counter,f_img)#找到同级目录下的文件夹

三.全局代码资源:

import cv2from cv2 import *import numpy as npimport cv2import mediapipe as mpimport timempFaceDetection=mp.solutions.face_detectionmpDraw=mp.solutions.drawing_utilsfaceDetection=mpFaceDetection.FaceDetection(0.75)# #视频采集# #视频的显示窗体定义# cv2.namedWindow("w_img")# cv2.setWindowTitle("w_img","Video")#设置窗口标题# cv2.moveWindow("w_img",0,0)#窗口移动到初始位置cv2.namedWindow("w_img")cv2.setWindowTitle("w_img","Video")cv2.moveWindow("w_img",100,100)classifier=cv2.CascadeClassifier("E:/Python/Pycharm/MYCODE/venv/my_code/AIlearning/AI_Detector/haarcascade_frontalface_alt2.xml")#打开摄像头cap=cv2.VideoCapture(0)counter=0#循环采集每一帧图像(保存,显示)while(cap.isOpened()):    status, frame = cap.read()#此处顺序不能乱,现有状态,后有图像    #读取是否成功    if not status: break    #图像转化成灰度,便于人脸识别    gray_frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)    #侦测人脸,它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),函数由分类器对象调用    faces=classifier.detectMultiScale(gray_frame,1.2,3)    #视频图像中,标记出人脸    # for face in faces:    # #把视频帧图像显示在窗体上    #     frame=cv2.rectangle(frame,(face[0],face[1]),(face[0]+face[2],face[1]+face[3]),(255,0,0),2)    for x,y,w,h in faces: #在绘制矩形之前保存图像 #取出人脸,人脸是一个像素矩阵 f_img=frame[y:y+h,x:x+w] f_img=cv2.resize(f_img,(256,256)) cv2.imwrite("img/kuang/%d.jpg"%counter,f_img)#找到同级目录下的文件夹 counter+=1 if counter>=20:     break frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,255,0),5) # 显示采集数据进度 cv2.putText(frame,"Image Number:%d"%counter,(x,y-30),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),3)    if counter>=20: break    cv2.imshow("w_img",frame)    #退出窗体的操作    key=cv2.waitKey(30)    if key&0xFF==ord("q"): break#释放摄像头cap.release()#释放窗体cv2.destroyWindow("w_img")