OCR实现微信截图改名

news2024/12/26 23:37:37
pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple/                                                                                   ──(Sat,Nov30)─┘
pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install easyocr 
import easyocr
import os
import cv2
import time
from paddleocr import PaddleOCR

def get_photo_paths(photos_folder_path):
    return [ f"{photos_folder_path}{os.sep}{photo_name}" for photo_name in os.listdir(photos_folder_path) if ".PNG" in photo_name]


def preprocess_image(image):
    # 转为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 二值化
    _, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    # 去噪声
    denoised = cv2.medianBlur(binary, 3)
    return denoised

def image_cutting(image_path
                  ,up_ratio=0.03
                  ,down_ratio=0.13):
    image = cv2.imread(image_path)
    # 计算切割的宽度和高度
    width = int(image.shape[1] * 1)
    down = int(image.shape[0] * down_ratio)
    up = int(image.shape[0] * up_ratio)
    # 切割图片
    cropped_image = image[up:down, :width]
    # 显示切割后的图片
    # cv2.imshow('Cropped Image', cropped_image)
    preprocessed_image = preprocess_image(cropped_image)
    # plt.imshow(preprocessed_image)
    return preprocessed_image


def get_key_fields_from_easyorc(image,keyword=''):
    res = Ereader.readtext(image)
    texts = []
    if keyword != '':
        for fields in res:
            boundaries = fields[0] ## 边界坐标
            text = fields[1] ## 文字内容
            if keyword in text:
                return {True:text}
            else:
                texts.append(text)
        return {False:texts}
    else:
        text = res[0][1]
        return text 
    

def get_key_fields_from_PaddleOCR(image,keyword=''):
    res = Preader.ocr(image, cls=True)[0]
    texts = []
    if keyword != '':
        for fields in res:
            boundaries = fields[0] ## 边界坐标
            text = fields[1][0] ## 文字内容
            if keyword in text:
                return {True:text}
            else:
                texts.append(text)
        return {False:texts}
    else:
        text = res[0][1][0]
        return {True:text} 
    # res = Preader.ocr(image, cls=True)[0]
    # texts = []
    # for fields in res:
    #     boundaries = fields[0] ## 边界坐标
    #     text = fields[1][0] ## 文字内容
    #     if keyword in text:
    #         return {True:text}
    #     else:
    #         texts.append(text)
    # return {False:texts}

def time_counter(begin_time, end_time):
    # 根据传入的时间计算,通过run_time.round()函数取整
    runtime = round(end_time - begin_time)
    # 计算时分秒
    hour = runtime // 3600
    minute = (runtime - 3600 * hour) // 60
    second = runtime - 3600 * hour - 60 * minute
    # 输出
    return f'用时:{hour}小时{minute}分钟{second}秒'

def change_wechat_photo_name_logic(photos_folder_path
                                   ,keyword = '22级实习-'
                                   ,up_ratio=0.05
                                   ,down_ratio=0.13
                                   ,model_name = "paddleorc"):
    

    if model_name == "paddleorc":
        global Preader
        Preader = PaddleOCR(use_angle_cls=True,det=False, lang="ch")
    elif model_name == "easyorc":
        global Ereader
        Ereader = easyocr.Reader(['ch_sim','en']) # 只需要运行一次就可以将模型加载到内存中
    photo_paths = get_photo_paths(photos_folder_path)
    m = len(photo_paths)
    t = 0
    start_time = time.time()
    for photo_path in photo_paths:
    
        start_time_of_each_step = time.time()
        try:
            preprocessed_image = image_cutting(photo_path,up_ratio,down_ratio)
       
            if model_name == "easyorc":
                wechat_name = get_key_fields_from_easyorc(preprocessed_image,keyword) 
            elif model_name == "paddleorc":
                wechat_name = get_key_fields_from_PaddleOCR(preprocessed_image,keyword)
                
            if keyword != "":     
                split_wechate_name = wechat_name[True].split('-')
                friend_name = split_wechate_name[-1]
            else:
                friend_name = wechat_name[True]
            
            # folder_path = os.path.split(photo_path)[0]
            new_photo_path = os.path.join(photos_folder_path,f"{friend_name}.PNG")
            os.rename(photo_path,new_photo_path)
            t += 1
            end_time_of_each_step = time.time()
            time_for_this_time = time_counter(start_time_of_each_step,end_time_of_each_step)
            print(f"当前好友名为{friend_name},是第{t}个,完成{t/m*100}%,{time_for_this_time}")
        except Exception as e:
            print(f"\033[31m当前文件为:【{photo_path}】\n,错误:{e}\033[0m")
            # print(f"当前好友名为{friend_name},错误:{e}")
    print(f"总计{time_counter(start_time,end_time_of_each_step)},完成{t}个")    

if __name__ == '__main__':
    photos_folder_path = "/Users/magu/Downloads/淮职课程准备/1就业材料/就业实习留存材料/回访截图/张晶实习回访(11月1日-11月30)"
    change_wechat_photo_name_logic(photos_folder_path,keyword = '22级实习-',up_ratio=0.05,down_ratio=0.101)
    #change_wechat_photo_name_logic(photos_folder_path,keyword = '',up_ratio=0.05,down_ratio=0.10)


    



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习threejs,设置envMap环境贴图创建反光效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.CubeTextureLoader 立…

Matlab Simulink HDL Coder FPGA开发初体验—计数器

目录 一、Simulink设计及仿真二、Verilog HDL代码转换1、参数配置2、HDL代码生成 三、ModelSim仿真分析1、使用自己编写的Testbench文件进行仿真2、使用HDL Coder生成的Testbench文件进行仿真 前言 Simulink HDL Coder‌是一款将Simulink和Stateflow模型转化为可综合的Verilog和…

【C语言】扫雷游戏(一)

我们先设计一个简单的9*9棋盘并有10个雷的扫雷游戏。 1,可以用数组存放,如果有雷就用1表示,没雷就用0表示。 2,排查(2,5)这个坐标时,我们访问周围的⼀圈8个位置黄色统计周围雷的个数是1。排查(8,6)这个坐标时&#xf…

实现点名神器的pyqt6实现

利用python gui创建点名神器,包含加分、导出加分记录、清除加分记录。 点名页面 首先导入学生信息 导入成功 开始点名 点击停止 点过之后,点击加分 加完分 查看加分记录 可以直接进入导出记录和清除历史。 此文到此结束,想要源码的请私聊我&a…

【UE5 C++】判断两点连线是否穿过球体

目录 前言 原理 代码 测试 结果 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 原理 (1)设球体球心的坐标为 ,半径为r; (2)设线段中A点的坐…

【AI】数据,算力,算法和应用(3)

三、算法 算法这个词,我们都不陌生。 从接触计算机,就知道有“算法”这样一个神秘的名词存在。象征着专业、权威、神秘、高难等等。 算法是一组有序的解决问题的规则和指令,用于解决特定问题的一系列步骤。算法可以被看作是解决问题的方法…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶(Horner)多项式的错误计算。 例1. 用秦九韶(Horner)算法计算(一百零七)例1中多项式 直接贴图吧: 这样,MATLAB 给出的仍然是错误结果,因为准…

Ubuntu20.04运行R-VIO2

目录 1.环境配置2.构建项目3. 运行 VIO 模式4.结果图 1.环境配置 CMakeLists.txt中 C 使用 14、opencv使用4 2.构建项目 克隆代码库: 在终端中执行以下命令克隆项目:git clone https://github.com/rpng/R-VIO2.git编译项目: 使用 catkin_m…

【Maven系列】深入解析 Maven 常用命令

前言 在当今的软件开发过程中,项目管理是至关重要的一环。项目管理包括了项目构建、依赖管理以及发布部署等诸多方面。而在Java生态系统中,Maven已经成为了最受欢迎的项目管理工具之一。Maven 是一套用于构建、依赖管理和项目管理的工具,主要…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、SessionPage (一)SessionPage 模块的基本功能 (二)基本使…

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式(补充)例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中,定时…

Android笔记(三十四):封装带省略号图标结尾的TextView

背景 项目需求需要实现在文本末尾显示一个icon,如果文本很长时则在省略号后面显示icon,使用TextView自带的drawableEnd可以实现,但是如果文本换行了则会显示在TextView垂直居中的位置,不满足要求,于是有了本篇的自定义…

多线程篇-8--线程安全(死锁,常用保障安全的方法,安全容器,原子类,Fork/Join框架等)

1、线程安全和不安全定义 (1)、线程安全 线程安全是指一个类或方法在被多个线程访问的情况下可以正确得到结果,不会出现数据不一致或其他错误行为。 线程安全的条件 1、原子性(Atomicity) 多个操作要么全部完成&a…

Day1 生信新手笔记

生信新手笔记 生信学习第一天笔记打卡。 转录组学中: 上游分析-基于linux,包括质控、过滤、比对、定量; 下游分析-基于R语言,包括差异分析、富集分析、可视化。 1. 级别标题 一个井号加空格 就是一级标题,两个井号加…

Git远程仓库操作

文章目录 远程仓库连接Gitee克隆代码 多人协同问题说明 🏡作者主页:点击! 🤖Git专栏:点击! ⏰️创作时间:2024年12月1日13点10分 远程仓库 Git 是分布式版本控制系统,同一个 Git …

virtualbox给Ubuntu22创建共享文件夹

1.在windows上的操作,创建共享文件夹Share 2.Ubuntu22上的操作,创建共享文件夹LinuxShare 3.在virtualbox虚拟机设置里,设置共享文件夹 共享文件夹路径:选择Windows系统中你需要共享的文件夹 共享文件夹名称:挂载至wi…

人工智能-深度学习-BP算法

BP算法的核心思想是通过计算损失函数对网络参数的梯度,然后使用梯度下降法来更新网络参数,从而最小化损失函数。 误差反向传播算法(BP)的基本步骤: 前向传播:正向计算得到预测值。 计算损失:通过损失函数计算预测值和真实值的差…