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

实现效果:

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

 代码

安装配置

模型下载

首先在我的这篇文件下载相应的人脸识别模型,一般 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')

调用主方法,这个有点慢 莫要着急

------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!小弟在这拜谢了!
如果您觉得我的文章在某些地方写的不尽人意或者写的不对,从而让你对你人生观产生颠覆(概不负责),需要斧正,麻烦在评论区不吝赐教,作者看到后会根据您的提示查阅文章进行修改,还这世间一个公理一片蓝天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/285554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1月2日代码随想录二叉树的最小深度及层序遍历总结

个人认为这么一个层序遍历的章节放这么多基本一样的题目算是很没意思的了 填充每个节点的下一个右侧节点和二叉树最大深度和前面的代码几乎完全一样,所以我就跳过了 代码随想录 (programmercarl.com) 代码随想录 (programmercarl.com) 111.二叉树的最小深度 给…

android开发百度地图api实现定位图标随手机方向转动

该功能的实现依赖于手机中的传感器元件如陀螺仪、加速度计等,具体开发详见android的官方开发文档: 传感器概览 | Android 开发者 | Android Developershttps://developer.android.com/guide/topics/sensors/sensors_overview?hlzh-cn要自定义一个传…

全网最详细的鼠标点击效果与禁用页面缩小放大

一、文章引导 #mermaid-svg-vObupkPcCxdB8hCq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vObupkPcCxdB8hCq .error-icon{fill:#552222;}#mermaid-svg-vObupkPcCxdB8hCq .error-text{fill:#552222;stroke:#55222…

c语言:设计投票小程序|练习题

一、题目 设计一个投票小程序 如图&#xff1a; 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<string.h> void win(int,int,int); int main() { char ch[5]; int countLili0; int countjp0; int countzx0; int …

代表团坐车 - 华为OD统一考试

OD统一考试&#xff08;B卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 某组织举行会议&#xff0c;来了多个代表团同时到达&#xff0c;接待处只有一辆汽车可以同时接待多个代表团&#xff0c;为了提高车辆利用率&#xff0c;请帮接待…

MongoDB vs MySQL:项目选择哪一个数据库系统?

由于市场上有各种可用的数据库&#xff0c;用户经常会就MongoDB与MySQL进行辩论&#xff0c;以找出更好的选择。 使用MySQL等关系数据库的组织在根据不断变化的需求管理和存储数据时可能会面临一定的困难。同时&#xff0c;新公司想知道选择什么数据库&#xff0c;这样他们就不…

微功耗遥测终端机RTU:守护城市生命线的智能卫士

在城市的繁华背后&#xff0c;隐藏着一套高效运转的“生命线”——排水系统。而在这条生命线上&#xff0c;微功耗遥测终端机RTU(MGTR-W4131U)发挥着不可或缺的作用&#xff0c;为城市的正常运转提供了坚实保障。 微功耗遥测终端机RTU(MGTR-W4131U)&#xff0c;顾名思义&#…

星友提问:本科与硕士的区别是什么?

本科阶段: 主要以学习成绩寄点为主&#xff0c;学习知识的来源更像“大锅饭”&#xff0c;所有同学一起上课&#xff0c;一起考试&#xff0c;以学习为主。硕士阶段: 论文实验科研为主&#xff0c;相对于本来说&#xff0c;成绩弱化的厉害&#xff0c;甚至导师直接说&#xff0…

信号量机制的实际使用-第二十九天

目录 回顾旧知 实现进程互斥 实现进程同步 实现进程的前驱关系 本节思维导图 回顾旧知 1、一个信号量对应一种资源 2、信号量的值 该种资源的剩余数量&#xff08;信号量值小于0&#xff0c;说明此时有进程在等待这种资源&#xff09; 3、P(S)&#xff1a;申请一个资源S&…

三层架构概述

三层架构就是把整个软件的代码分为三个层次&#xff0c;分层的目的是&#xff1a;规范代码&#xff0c;大型软件需要团队配合的时候问题就来了&#xff0c;由于每个程序员风格不一样&#xff0c;而开发软件大量的代码风格不统一就会造成后期调试和维护出现问题&#xff0c;然而…

Dryad数据库学习

从一篇science论文中看到数据存储在了这个平台&#xff0c;这里分享一下&#xff1a;datadryad.org 亲测无需注册&#xff0c;可以直接下载&#xff0c;从一个数据测试看&#xff0c;数据存储在亚马逊云&#xff0c;下载速度还可以&#xff0c;6M/s的样子。 Dryad 是一个开放的…

把类成员函数作为参数传递给thread类......

(1)把类成员函数作为参数传递给thread类 一般地&#xff0c;在调用类的非静态函数时&#xff0c;编译器会隐式添加一参数&#xff0c;它是所操作对象的地址&#xff0c; 用于绑定对象和成员函数&#xff0c;并且位于所有其他实际参数之前。例如&#xff0c;类example具有成员函…

SMD NTC Thermistor NTC热敏电阻(贴片式)

热敏电阻器&#xff08;Thermistor&#xff09;是一种电阻值对温度极为灵敏的半导体元件&#xff0c;又可分为负温度系数&#xff08;NTC&#xff09;热敏电阻和正温度系数&#xff08;PTC&#xff09; NTC热敏电阻用于温度测量&#xff0c;温度控制&#xff0c;温度补偿等&…

单片机快速入门

参考连接&#xff1a; 安装MinGW-64&#xff08;在win10上搭建C/C开发环境&#xff09;https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接&#xff1a;https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码&#xff1a;y1mz --来自百度网盘超级会员V7的分享野…

【力扣100】【好题】79.单词搜索

添加链接描述 class Solution(object):# 定义上下左右四个行走方向directs [(0, 1), (0, -1), (1, 0), (-1, 0)]def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""m len(board)if m 0:return Fa…

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知&#xff0c;我们已经进入了大数据时代&#xff0c;每天都有PB级的数据需要处理、分析&#xff0c;从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目&#xff0c;受Google两篇论文的启发&#xff0c;采用分布式的文件…

怎么给直播录屏?超简单教程,一学就会!

随着直播行业的兴起&#xff0c;许多玩家和观众都希望能够录制直播内容以方便随时回顾或与他人分享。可是怎么给直播录屏呢&#xff1f;本文将详细介绍两种流行的直播录屏方法。通过学习这两种工具&#xff0c;你可以轻松实现直播录屏&#xff0c;记录并分享你的直播内容。 怎么…

一种安防场景下融合注意力机制和时空图卷积神经网络的人体动作识别方法与流程

本发明涉及模式识别与计算机视觉领域&#xff0c;尤其涉及一种安防场景下融合注意力机制和时空图卷积神经网络的人体动作识别方法。 背景技术&#xff1a; 视觉一直是人类获取外界信息的最重要、最直观的途径&#xff0c;据有关统计&#xff0c;人类获取信息的80&#xff05;都…

2024-01-01 力扣高频SQL50题目 练习笔记

1. 1661求机器平均运行时间 在做这道题的时候&#xff0c;我遇到了4个问题 # 求平均的问题 如何找到个数? -> 相减对应列值后,直接average 就行。因为avg就是自动确定要除的个数&#xff08;当然要联合正确的group by 分组&#xff09; # 怎么根据machine_id和process_id…

主流大语言模型集体曝出训练数据泄露漏洞

内容概要&#xff1a; 安全研究人员发现&#xff0c;黑客可利用新的数据提取攻击方法从当今主流的大语言模型&#xff08;包括开源和封闭&#xff0c;对齐和未对齐模型&#xff09;中大规模提取训练数据。当前绝大多数大语言模型的记忆&#xff08;训练数据&#xff09;可被恢…