目录
一 使用opencv进行人脸检测
二 使用face_recognition进行人脸检测
一 使用opencv进行人脸检测
1 haarcascade_frontalface_default.xml
方法① 下载
地址:https://github.com/opencv/opencv/tree/master/data/haarcascades
点击haarcascade_frontalface_default.xml文件
对着Raw右键,选择“链接另存为”,选择代码所在的路径即可,就可以下载这个文件啦。
方法② 文件路径
如果已经安装OpenCV,那么可以在安装OpenCV的环境中找到这个文件。
/anaconda3/envs/python/lib/python/site-packages/cv2/data/haarcascade_frontalface_default.xml
具体的情况按照实际的去对照哈。
如果没有安装OpenCV的话,可以使用如下命令安装:
pip install opencv-python
找对应文件路径的方法如上。
2 涉及的函数
objects = cv2.CascadeClassifier.detectMultiScale( image[,
scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]] )
输入:
①image:输入图像
②scaleFactor:搜索窗口的缩放比例大小。
③minNeighbors:默认值为3,意味着有3个以上的检测标记存在时,才认为人脸存在。如果希望提高检测的准确率,可以将该值设置的更大,但同时可能会让一些人脸无法被检测到。小于该值的目标将被忽略。
④flags:该参数通常被省略。
⑤minSize:目标的最小尺寸,小于这个尺寸的目标将被忽略。
⑥maxSize:最大目标的尺寸。大于该值的目标将被忽略。
返回:
①objects:目标对象的矩形框组。
3 实践
- 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
b, g, r = cv2.split(img)
img_rgb = cv2.merge([r, g, b])
return img_rgb
def dealImageResult(img_path):
im = cv2.imread(img_path)
img = im.copy()
# 加载预训练的人脸级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用级联分类器检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(200, 200))
# 为每个检测到的人脸绘制一个矩形(标记人脸)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 255, 0), 10)
fig = plt.figure(figsize=(10, 10))
im = dealImg(im)
img = dealImg(img)
titles = ["img", "result"]
images = [im, img]
for i in range(2):
plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
plt.title("{}".format(titles[i]), fontsize=20, ha='center')
plt.xticks([]), plt.yticks([])
# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
# plt.tight_layout()
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("Test.jpg")
pass
- 效果图
二 使用face_recognition进行人脸检测
1 安装face_recognition
pip install face_recognition
或者
pip --default-timeout=100 install face_recognition -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
第二种方式安装得更快。
2 涉及的函数
- face_recognition.api.load_image_file()函数
face_recognition.api.load_image_file(file, mode='RGB')
函数功能:下载图片文件(.jpg .png等)转成numpy array。
输入:
①file:要加载的图像文件名或文件对象
②mode:将图像转换成的格式。支持“RGB”(8位,3通道)和“L”(黑白)
返回:
①Numpy array 的图像内容。
- face_recognition.api.face_locations()函数
face_recognition.api.face_locations(img, number_of_times_to_upsample=1, model='hog')
函数功能:返回图片中所有人脸的Bbox(array)
输入:
①img:输入的图片(numpy array)
②number_of_times_to_upsample:上采样的次数,次数越多越能找到更小的人脸。
③model:“hog”为默认;“hog”在上不精准,但是快。“cnn”是更精准的深度学习模型,需要GPU/CUDA加速。
返回:
①人脸定位元组(top, right, bottom, left)的List。
face_recognition的其他函数介绍,可以看:简述 face_recognition 包。
3 实践
①使用hog
- 代码
import face_recognition
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
b, g, r = cv2.split(img)
img_rgb = cv2.merge([r, g, b])
return img_rgb
def dealImageResult(img_path):
im = cv2.imread(img_path)
# RGB
img = face_recognition.load_image_file(img_path)
face_locations = face_recognition.api.face_locations(img, 1, 'hog')
# 遍历每个人脸,并标注
faceNum = len(face_locations)
for i in range(0, faceNum):
top = face_locations[i][0]
right = face_locations[i][1]
bottom = face_locations[i][2]
left = face_locations[i][3]
start = (left, top)
end = (right, bottom)
cv2.rectangle(img, start, end, (0, 255, 255), 20)
fig = plt.figure(figsize=(10, 10))
im = dealImg(im)
titles = ["img", "hog_result"]
images = [im, img]
for i in range(2):
plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
plt.title("{}".format(titles[i]), fontsize=20, ha='center')
plt.xticks([]), plt.yticks([])
# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
# plt.tight_layout()
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("Test.jpg")
pass
- 效果图
②使用cnn
- 代码
import face_recognition
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
b, g, r = cv2.split(img)
img_rgb = cv2.merge([r, g, b])
return img_rgb
def dealImageResult(img_path):
im = cv2.imread(img_path)
# RGB
img = face_recognition.load_image_file(img_path)
face_locations = face_recognition.api.face_locations(img, 1, 'cnn')
# 遍历每个人脸,并标注
faceNum = len(face_locations)
for i in range(0, faceNum):
top = face_locations[i][0]
right = face_locations[i][1]
bottom = face_locations[i][2]
left = face_locations[i][3]
start = (left, top)
end = (right, bottom)
cv2.rectangle(img, start, end, (0, 255, 255), 20)
fig = plt.figure(figsize=(10, 10))
im = dealImg(im)
titles = ["img", "cnn_result"]
images = [im, img]
for i in range(2):
plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
plt.title("{}".format(titles[i]), fontsize=20, ha='center')
plt.xticks([]), plt.yticks([])
# plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
# plt.tight_layout()
plt.show()
fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
dealImageResult("Test.jpg")
pass
- 效果图
前文回顾
入门篇目录
数字图像处理(入门篇)一 图像的数字化与表示
数字图像处理(入门篇)二 颜色空间
数字图像处理(入门篇)三 灰度化
数字图像处理(入门篇)四 像素关系
数字图像处理(入门篇)五 图像数据预处理之颜色空间转换
数字图像处理(入门篇)六 图像数据预处理之坐标变化
数字图像处理(入门篇)七 图像数据预处理之灰度变化
数字图像处理(入门篇)八 图像数据预处理之直方图
数字图像处理(入门篇)九 图像数据预处理之滤波
数字图像处理(入门篇)十 边缘检测
数字图像处理(入门篇)十一 形态学处理
数字图像处理(入门篇)十二 自适应阈值分割
数字图像处理(入门篇)十三 仿射变换
数字图像处理(入门篇)十四 透视变换
实践篇目录
数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!
数字图像处理(实践篇)二 画出图像中目标的轮廓
数字图像处理(实践篇)三 将两张图像按照指定比例融合
数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法
数字图像处理(实践篇)五 使用Grabcut算法进行物体分割
数字图像处理(实践篇)六 利用hough变换进行直线检测
数字图像处理(实践篇)七 利用霍夫变换进行圆环检测
数字图像处理(实践篇)八 Harris角点检测
数字图像处理(实践篇)九 基于边缘的模板匹配
数字图像处理(实践篇)十 图像质量检测
数字图像处理(实践篇)十一 图像中的条形码解析
数字图像处理(实践篇)十二 基于小波变换的图像降噪
数字图像处理(实践篇)十三 数据增强之给图像添加噪声!
数字图像处理(实践篇)十四 图像金字塔
数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波
数字图像处理(实践篇)十六 基于分水岭算法的图像分割
数字图像处理(实践篇)十七 Shi-Tomasi 角点检测