基于opencv实现人脸猫脸图像检测(python)
目录
1、方法流程如下
2 、导入相关库
这里我们只用到了opencv,所以只需要导入相关的库即可。
安装相关库方法
pip install opencv-python pillow
代码导入
import cv2
3、 导入级联分类器
OpenCV已经包含许多针对面部,眼睛,微笑等进行过预训练的分类器。这些.xml文件存储在GitHub文件夹中。 这里可以使用猫脸检测和人脸检测模型。
猫脸和人脸的链接如下
猫脸:
https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalcatface_extended.xml
人脸:
https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml
python导入分类器:cv2.CascadeClassifier()
CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器。并且既可以使用Haar,也可以使用LBP特征。
Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。这样就可以进行区分人脸。
catface_cascade = cv2.CascadeClassifier('E:\\car\\catface_detector.xml')
humanface_cascade = cv2.CascadeClassifier('E:\\car\\humanface_detector.xml')
4、调整图像大小
cv2.resize(原图像,(w,h))函数,w,h代表长和宽。
将原始图像调整到大小为(600,600)
img_1=cv2.resize(img1,(600,600))
5、彩色图像灰度化
关于彩色图像灰度化部分,这里不在多说,在python中使用cv2.cvtColor()和cv2.COLOR_BGR2GRAY()可以达到想要的目的。
img1=cv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY)
图像灰度化结果:
6、图像面部识别
关于图像面部识别,这里就需要利用我们之前下载好的级联分类器了。 humanface_cascade和 catface_cascade。
调用detectMultiScale()函数检测:
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
5.minSize为目标的最小尺寸
6.minSize为目标的最大尺寸
code:
human_faces = humanface_cascade.detectMultiScale(img1,
scaleFactor=1.3, minNeighbors=5, minSize=(75, 75))
cat_faces = catface_cascade.detectMultiScale(img2, scaleFactor=1.3,
minNeighbors=5, minSize=(75, 75))
7、绘制脸部矩形区域
绘制检测区域用到了 cv2.rectangle(),cv2.putText()两个函数。
然后利用cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)画出矩行
参数解释
第一个参数:img是原图
第二个参数:(x,y)是矩阵的左上点坐标
第三个参数:(x+w,y+h)是矩阵的右下点坐标
第四个参数:(0,255,0)是画线对应的rgb颜色
第五个参数:2是所画的线的宽度
cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
for (i, (x, y, w, h)) in enumerate(human_faces):
cv2.rectangle(img1, (x, y), (x+1*w, y+1*h), (220, 90, 230), 3)
cv2.putText(img1, "Human Face - #{}".format(i + 1), (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.55, (220, 90, 230), 2)
for (i, (x, y, w, h)) in enumerate(cat_faces):
cv2.rectangle(img2, (x, y), (x+1*w, y+1*h), (0,255, 0), 3)
cv2.putText(img2, "Cat Faces - #{}".format(i + 1), (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)
绘制结果:
完整Code:
import cv2
#Load the cascades
catface_cascade = cv2.CascadeClassifier('E:\\car\\catface_detector.xml')
humanface_cascade = cv2.CascadeClassifier('E:\\car\\humanface_detector.xml')
#调整图像大小
img1=cv2.imread('E:/car/boy.jpg')
img_1=cv2.resize(img1,(600,600))
img2=cv2.imread('E:/car/timg.jpg')
img_2=cv2.resize(img2,(600,600))
#灰度化
img1=cv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY)
img2=cv2.cvtColor(img_2,cv2.COLOR_BGR2GRAY)
human_faces = humanface_cascade.detectMultiScale(img1,
scaleFactor=1.3, minNeighbors=5, minSize=(75, 75))
cat_faces = catface_cascade.detectMultiScale(img2, scaleFactor=1.3,
minNeighbors=5, minSize=(75, 75))
for (i, (x, y, w, h)) in enumerate(human_faces):
cv2.rectangle(img1, (x, y), (x+1*w, y+1*h), (220, 90, 230), 3)
cv2.putText(img1, "Human Face - #{}".format(i + 1), (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.55, (220, 90, 230), 2)
for (i, (x, y, w, h)) in enumerate(cat_faces):
cv2.rectangle(img2, (x, y), (x+1*w, y+1*h), (0,255, 0), 3)
cv2.putText(img2, "Cat Faces - #{}".format(i + 1), (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)
cv2.imshow("faces_detected1.png", img1)
cv2.imshow("faces_detected2.png", img2)
cv2.waitKey(0)
检测结果
二、快速实现人脸识别(15行代码)
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
face_cascade = cv2.CascadeClassifier('E:\\car\\humanface_detector.xml')
img = cv2.imread('E:/car/7.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray)
print('Number of faces detected:', len(faces))
for (i, (x, y, w, h)) in enumerate(faces):
cv2.rectangle(img, (x, y), (x+1*w, y+1*h), (220, 90, 230), 3)
cv2.putText(img, "Human Face - #{}".format(i + 1), (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.55, (220, 90, 230), 2)
cv_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(cv_rgb)
plt.show()
结果:
致谢
https://blog.csdn.net/Stray_Lambs/article/details/101123252
https://blog.csdn.net/weixin_42309501/article/details/80781293