目录
实现效果:
本程序可以将下图第二张照片进行人脸识别,发现相片是否是正向,如果不是就进行相片转正形成下图第一张图。
安装配置
模型下载
首先在我的这篇文件下载相应的人脸识别模型,一般 64标记点就够用,当然你也可以换成68位
人脸识别模型 shape_predictor_68_face_landmarks.dat 和81位下载_shape_predictor_68_face_landmarks.dat下载-CSDN博客
依赖下载
需要pip install 安装下面依赖
opencv-python
opencv-contrib-python
numpy
cmake
boost
imutils
dlib
问题解决
安装dlib这个可能遇到问题
python安装dlib报ERROR: Failed building wheel for dlib-CSDN博客
源码
# 安装cv2 安装的全名为:opencv-python同时还要按个指示包:opencv-contrib-python
import cv2 as cv
# 安装numpy,numPy 是 Python 科学计算的基础包。NumPy 包的核心是 ndarray 对象,他封装了同构数据类型的 n 维数组。
import numpy as np
# 安装dlib 需要先安装cmake包,否则可能造成报错
import dlib
# 安装imutils from和import意思是导入imutils包,但是在这个同级py文件中没有无需要的函数,我需要到对应下级py文件中的face_utils这个功能块或函数
from imutils import face_utils
class PhotoCorrect:
# datapath:人脸数据文件位置路径,人脸识别的68个特征点检测库dat文件
# inpath:人脸图片输入路径
# outpath:纠正后输出路径
def photoCorrect(datapath, inpath, outpath):
try:
# opencv读取图片
image = cv.imread(inpath)
# 读取的图片先存一张原图,用于原图旋转
FirstImage = image
result = 0
for i in range(4):
# 加载人脸数据
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(datapath)
# 图片转灰(用于提高人脸识别度)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 获取特征集合
rects = detector(gray, 1)
for (i, rect) in enumerate(rects):
# 如果存在shape说明人脸已经识别出来了
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
# 然后根据result就知道需要旋转几次
# 然后再使用opencv旋转保存之前的备份图片即可,这样就不会更改原有的图片
for (x, y) in shape:
if result == 0:
cv.imwrite(outpath, FirstImage, [int(cv.IMWRITE_JPEG_QUALITY), 70])
elif result == 1:
cv.imwrite(outpath, np.rot90(FirstImage), [int(cv.IMWRITE_JPEG_QUALITY), 70])
elif result == 2:
cv.imwrite(outpath, np.rot90(np.rot90(FirstImage)), [int(cv.IMWRITE_JPEG_QUALITY), 70])
elif result == 3:
cv.imwrite(outpath, np.rot90(np.rot90(np.rot90(FirstImage))),
[int(cv.IMWRITE_JPEG_QUALITY), 70])
return True
# 如果不具备相应特征,旋转图片90°
image = np.rot90(image)
# 记录旋转次数加1
result += 1
# 进程结束,退出代码
return False
except Exception as e:
print(e)
return False
if __name__ == '__main__':
PhotoCorrect.photoCorrect(r'F:\exercise\py\AI\dat\shape_predictor_68_face_landmarks.dat', r'F:\testResource\Test\photo\testPhoto1.jpg',
r'F:\testResource\Test\photo\right1.jpg')
调用主方法,这个有点慢 莫要着急
讲解
依赖解析
OpenCV (cv2):
- OpenCV 是一个开源的计算机视觉和机器学习软件库。
- 它提供了各种处理图像和视频的工具,比如读取和写入图像、图像变换、特征检测等。
- 在我的代码中,OpenCV 用于读取图片 (
cv.imread
), 转换图像到灰度 (cv.cvtColor
),以及保存处理后的图像 (cv.imwrite
)。
NumPy (np):
- NumPy 是一个强大的 Python 库,用于数学计算,尤其擅长处理大型多维数组和矩阵。
- NumPy 在这个代码中用于图像旋转 (
np.rot90
),因为图像在 OpenCV 中以 NumPy 数组的形式表示。
imutils:
- imutils 是一个简化图像处理操作的 Python 库。
- 这段代码中的
from imutils import face_utils
是导入 imutils 库的一部分功能,这里具体用于将 dlib 的面部标志点转换为 NumPy 数组(face_utils.shape_to_np
)。
openCv和dlib的技术选型
每段代码注释其实都在注释已经写了,但是你肯定好奇,为何用dlib做人脸识别,而不是用opencv?
其实这并不意味着 OpenCV 无法做到,而是 dlib 在某些方面,特别是面部特征点检测方面,通常被认为更为准确和高效。
OpenCV 的人脸识别和特征点检测:
- OpenCV 提供了面部检测功能,可以使用 Haar 或 LBP 级联分类器。
- 对于面部特征点检测,OpenCV 支持使用包括但不限于 DNN 模块。
- OpenCV 更加通用,适用于多种不同的图像处理和计算机视觉任务。
dlib 的人脸识别和特征点检测:
- dlib 提供了一种基于 HOG (Histogram of Oriented Gradients) 和线性分类器的人脸检测方法,该方法对于正面人脸检测非常有效。
- dlib 还提供了一个预训练的面部特征点检测器,能够检测出 68 个面部特征点,这在许多应用中非常有用,比如面部姿态估计、面部标记等。
- dlib 在面部特征点的检测精度方面通常被认为优于 OpenCV。
dlib 的面部检测和特征点检测的性能可能优于 OpenCV。然而,OpenCV 在其他方面(如更广泛的图像处理功能)可能更加强大。所以,选择使用哪个库通常取决于具体的应用需求和开发者的偏好。
------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!
混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!