源代码来源:
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<Rect>& 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 cv2
from cv2 import *
import numpy as np
import cv2
import mediapipe as mp
import time
mpFaceDetection=mp.solutions.face_detection
mpDraw=mp.solutions.drawing_utils
faceDetection=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")