基于opencv实现人脸猫脸图像检测(python)

基于opencv实现人脸猫脸图像检测(python)

目录

基于opencv实现人脸猫脸图像检测(python)

1、方法流程如下

2 、导入相关库

3、 导入级联分类器

4、调整图像大小

 5、彩色图像灰度化

6、图像面部识别

7、绘制脸部矩形区域

完整Code:

 致谢


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()

结果:

 

 致谢

Python实现猫脸识别 | 喵主子福利

https://blog.csdn.net/Stray_Lambs/article/details/101123252

https://blog.csdn.net/weixin_42309501/article/details/80781293

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月蹉跎的一杯酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值