人脸检测常见方式---视频,图片
前言
寒假放假了,在家太无聊。学着写个人脸检测玩玩。。
提示:以下是本篇文章正文内容,下面案例可供参考
一、opencv是什么?
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。
总而言之,我们需要用到opencv里面的库进行人脸检测。另外,如果你没有安装,还需要先安装。
conda install opencv-python
二、人脸检测—摄像头版
1.引入库
代码如下:
import cv2
2.具体代码
代码如下:
import cv2
#人脸检测---摄像头版
def video_demo():
capture=cv2.VideoCapture(0) #参数为0,表示默认摄像头
while(True):
#读取摄像头里的内容
ret,frame=capture.read() #返回ret和frame,ret表示有没有抓取到图片,frame代表一帧图片
frame=cv2.flip(frame,1) #对图像进行翻转,0代表垂直,1代表水平,-1代表垂直水平
#显示每一帧
face_patterns=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml') #是一个分类器,有haar和lbp两种特征;自带人脸检测器
#人脸检测函数,frame是图片,scaleFactor表示从minSize开始,每次窗口扩大10%知道默认最大值;minNeighbor表示一个物体最少多少标记认为是人脸
faces=face_patterns.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4,minSize=(100,100)) #返回值为左上角坐标以及长和宽
print(faces)
for(x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #在图像上绘制矩形 (x,y)左上坐标,(x+w,y+h)右下坐标,(0,255,0)颜色,2矩阵厚度
cv2.imshow("jiemain",frame) #图形界面一闪而过
c = cv2.waitKey(1) # 延迟,来保证图片显示
if c == 27:
break
video_demo()
3.解析
face_patterns=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml') #是一个分类器,有haar和lbp两种特征;自带人脸检测器
opencv中有一个分类器CascadeClassifier,在这个分类器里面有很多已经训练好的检测模型,不仅有关于脸的,还有鼻子,眼睛,身体等等。(在文章结尾附上链接)
faces=face_patterns.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=4,minSize=(100,100))
detectMultiScale是分类下的一个检测器,里面的参数以及返回结果会稍微难懂一点,但是不用担心我会尽可能简单描述出来。
frame:代表要检测的图片;
scaleFactor:代表每次检测范围扩大10%;(这个要和minSize一起理解)
minSize:代表最初检测时范围大小;(此处设置为100x100)
scaleFactor 就是从第一次在minSize规定大小上每次扩大10%扫描范围,直到大于macSize值为止
minNeighbors:代表最小邻居个数,他的值直接关系你检测的质量。
当minNeighbors为0时,代表它只要检测出一个符合模型特征的就判定为正确结果,而这样做的代价就是它会有很多个结果,此时的结果质量并不高;当minNeighbors为3时,代表当在临近区域至少有三个检测结果时,才判定为正确检测结果,此时的检测质量相比之前大大提升。
这个minNeighbors为0时
这个minNeighbors为3时
for(x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #在图像上绘制矩形 (x,y)左上坐标,(x+w,y+h)右下坐标,(0,255,0)颜色,2矩阵厚度
cv2.imshow("jiemain",frame) #图形界面一闪而过
c = cv2.waitKey(1) # 延迟,来保证图片显示
这段代码主要是用来绘制长方形边框,当然你也可以绘制圆形边框,后面关于图片检测会使用圆形边框。
这里主要注意两点:
1,imshow的两个参数都不能少;
2,imshow的作用是展示一个图形界面,但是每一帧都非常快,如果没有后面的waitkey,你只能看见一个黑色边框,后面的waitkey是用来延迟展示,1代表延迟一毫秒,0代表无限制延迟。
# 三、人脸检测---图片版 ## 1.引入库
代码如下:
import cv2
2.具体代码
代码如下:
import sys
import cv2
# imagepath='C:\\Users\\Administrator\\Desktop\\huren.jpeg'
imagepath='C:\\Users\\Administrator\\Desktop\\zhao.jpeg'
def picture_demo():
image=cv2.imread(imagepath) #需要sys才能使用路径
image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
face_pattern=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml')
faces=face_pattern.detectMultiScale(image_gray,scaleFactor=1.1,minNeighbors=4,minSize=(100,100))
print(faces)
for (x,y,w,h) in faces:
cv2.circle(image,(int((x+x+w)/2),int((y+y+h)/2)),int(w/2),(0,0,255),2) #需要整型,不能使用浮点型
cv2.imshow("picture",image) #两个参数都能少
cv2.waitKey(0) #0表示无限制等待
picture_demo()
3.解析
image=cv2.imread(imagepath) #需要sys才能使用路径
image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
这里相较于上面,我们需要导入图片,并且将图片进行灰度处理
face_pattern=cv2.CascadeClassifier('.\cascades\haarcascade_frontalface_alt.xml')
faces=face_pattern.detectMultiScale(image_gray,scaleFactor=1.1,minNeighbors=4,minSize=(100,100))
这里的解释与上面相同,这里不再赘述
for (x,y,w,h) in faces:
cv2.circle(image,(int((x+x+w)/2),int((y+y+h)/2)),int(w/2),(0,0,255),2) #需要整型,不能使用浮点型
这里就是上面提到的进行圆框检测
4.结果展示
总结
整体来说不是很难,大家可以动手试试玩一玩。以前经常刷到上班摸鱼,使用人脸识别自动切屏的视频,下一篇文章准备学着做一个人脸识别。。。。
识别器模型
https://pan.baidu.com/s/1fWuFDlWhYFXA6OjEQQcaUw
提取码:0mrr