python3 识别人像照片并纠正照片正反

目录

实现效果:

 代码

安装配置

模型下载

依赖下载

问题解决

源码

依赖解析

openCv和dlib的技术选型


实现效果:

本程序可以将下图第二张照片进行人脸识别,发现相片是否是正向,如果不是就进行相片转正形成下图第一张图。

安装配置

模型下载

首先在我的这篇文件下载相应的人脸识别模型,一般 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毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

A乐神

恭喜发财啊,老板,嘻嘻!

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

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

打赏作者

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

抵扣说明:

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

余额充值