02-12306验证码预处理(分割、转存dat、解析dat文件)

2023-11-19


import cv2 as cv
import numpy as np
import os
import binascii
temp_path = r'F:\python\StockAnalyzer\test\test.avi'
#img_path = r'F:\12306'
data_path = r'F:\python\data'
file_path = r'F:\python\StockAnalyzer\test'
img_path = file_path


def split_img(file, x, y):
    '''
    把12306图片切分,获取x,y处图片,以及图片title
    :param file:
    :param x:
    :param y:
    :return:
    '''
    try:
        img = cv.imread(file)
        img_title = img[:30, 120:270, :]
        print(img_title.shape)
        left = 5 + (5+68)*x
        top = 36 + 5 + (5+68)*y
        right = left + 68
        bottom = top + 68
        return img_title, img[top:bottom, left:right, :]
    except Exception as e:
        print(e)
        return -1

def makeFile(path,file_name):
    '''
    根据路径path创建文件夹,根据file_name查看是否存在文件,否创建新文件
    :param path:
    :param file_name:
    :return: 返回0创建成功,-1创建失败
    '''
    if not os.path.exists(path):
        os.mkdirs(path)
    if file_name in os.listdir(path):
        print('文件名已经存在')
        return 0
    else:
        try:
            f = open(path + '\\' + file_name, 'w')
            f.close()
            print('文件创建成功')
            print(path + '\\' + file_name)
            return 0
        except Exception as e:
            print(repr(e))
            print('文件创建失败')
            return -1


def write2dat(source_list, fpath, fname):

    """
    将数据列表,转为二进制写入dat文件
    :param source_list: 将要写入的一维数据列表(类型整型)
    :param fpath: 写入的文件路径
    :param fname: 写入的文件名称
    :return: -1,写入失败,0写入成功
    文件格式:@开头 \n  元素序列号 \n 像素值
    """

    if makeFile(fpath, fname) == -1:
        print('写入失败,要写入的文件创建失败')
        return -1
    file_name = fpath + '\\' + fname
    with open(file_name, 'a') as f:
        f.write('@')
        f.write(' ')
        try:
            for m, j in enumerate(source_list):
                #f.write(hex(m)[2:].zfill(4))
                #f.write(hex(m))
                #f.write(' ')
                f.write(hex(j)[2:].zfill(4))
                #f.write(hex(j))
                f.write(' ')
            print('写入成功')
            f.write('\n')
            return 0
        except:
            print('写入二进制文件失败')
            return -1


def cutterTitle_write2dat(img_path,data_path, dName):
    for file in os.listdir(img_path):
        if file.find('.png') != -1:
            file_path = img_path+ '\\'+file
            title, img_x_y = split_img(file_path, 3, 1)
            #cv.imshow('title', title)
            #cv.waitKey(0)
            #cv.imshow('img', img_x_y)
            #print(title[:, :, 0])
            title_b = title[:, :, 0].reshape(-1)
            #print(title_b)
            title_g = title[:, :, 1].reshape(-1)
            title_r = title[:, :, 2].reshape(-1)
            merge_r_g_b = np.concatenate((title_b, title_g, title_r))
            #print(merge_r_g_b.shape)
            write2dat(merge_r_g_b, data_path, dName)


def cutterImg_write2dat(img_path, data_path, fname):

    '''
    分割12306图片并存入fname.dat
    :param img_path:
    :param fname:
    :return: 成功返回0
    '''

    for file in os.listdir(img_path):
        if file.find('.png') != -1:
            file_path = img_path + '\\' + file
            for i in range(2):
                for j in range(4):
                    title, img_x_y = split_img(file_path, j, i)  #获取12306验证码x,y处的图片
                    #print(img_x_y[:, :, 0])
                    img_x_y_b = img_x_y[:, :, 0].reshape(-1)
                    #print(img_x_y_b)
                    #print(img_x_y_b.reshape((68, 68)))
                    img_x_y_g = img_x_y[:, :, 1].reshape(-1)
                    img_x_y_r = img_x_y[:, :, 2].reshape(-1)
                    merge_img_r_g_b = np.concatenate((img_x_y_b, img_x_y_g, img_x_y_r))
                    write2dat(merge_img_r_g_b, data_path, fname)
                    #print(type(img_x_y[:, :, 0][0][0]))
                    # cv.imshow('img0', img_x_y)
                    # img_b = np.array(merge_img_r_g_b[0:68 * 68]).reshape((68, 68))
                    # # print(img_b)
                    # img_g = np.array(merge_img_r_g_b[68 * 68:2 * 68 * 68]).reshape((68, 68))
                    # img_r = np.array(merge_img_r_g_b[2 * 68 * 68:]).reshape((68, 68))
                    # img = np.zeros((68, 68, 3), dtype=np.uint8)
                    # img[:, :, 0] = img_b
                    # img[:, :, 1] = img_g
                    # img[:, :, 2] = img_r
                    # print('*********************************************')
                    # print(type(img[:, :, 0][0][0]))
                    # cv.imshow('img', img)
                    # cv.waitKey(0)
    #cv.destroyAllWindows()
    return 0

def decodeImg(data_img_line):
    """
    解析二进制文件存储的图片,解析后并返回图片列表
    :param data_img_line: dat文件每行存储一张图片,图片以'@'开头,图片大小68,68
    :return:
    """

    line = data_img_line
    pix = line.split(' ')[1:-1]
    #print(pix)
    pix10 = [int(i.upper(), 16) for i in pix]
    #print(pix10)
    #print(len(pix10))
    try:
        img_b = np.array(pix10[0:68*68]).reshape((68, 68))
        #print(img_b)
        img_g = np.array(pix10[68*68:2*68*68]).reshape((68, 68))
        img_r = np.array(pix10[2*68*68:]).reshape((68, 68))
        img = np.zeros((68, 68, 3), dtype=np.uint8)
        img[:, :, 0] = img_b
        img[:, :, 1] = img_g
        img[:, :, 2] = img_r
        return img
    except Exception as e:
        print(e)
        return None

def decodeTitleImg(title_img_line):
    """
    解析二进制存储的验证码的标题,并返回图片

    :param title_img_line:
    :return:
    """
    line = title_img_line
    pix = line.split(' ')[1:-1]
    #print(pix)
    pix10 = [int(i.upper(), 16) for i in pix]
    print(pix10)
    print(len(pix10))
    try:
        img_b = np.array(pix10[0:30*150]).reshape((30, 150))
        #print(img_b)
        img_g = np.array(pix10[30*150:2*30*150]).reshape((30, 150))
        img_r = np.array(pix10[2*30*150:]).reshape((30, 150))
        img = np.zeros((30, 150, 3), dtype=np.uint8)
        img[:, :, 0] = img_b
        img[:, :, 1] = img_g
        img[:, :, 2] = img_r
        return img
    except Exception as e:
        print(e)
        return None

#np.set_printoptions(threshold=np.inf)
#cutterImg_write2dat(file_path, data_path,  '12306img' + '.dat')


def test(fname):
    """
    测试相关功能
    :param fname:
    :return:
    """
    with open(fname) as f:
        print('打开文件成功')
        for line in f.readlines():
            #print('******')
            img = decodeTitleImg(line)
            cv.imshow('img', img)
            cv.waitKey(0)
    cv.destroyAllWindows()

if __name__ == '__main__':
    print('**************')
    #cutterImg_write2dat(img_path, data_path,  '12306img' + '.dat')
    #cutterTitle_write2dat(img_path,data_path,'12306titleImg' + '.dat')
    fname = data_path + '\\' + '12306img.dat'
    title_fname = data_path + '\\' + '12306titleImg.dat'
    print(fname)
    #test(fname)
    test(title_fname)

解析图片是遇到的坑:

numpy 创建列表是默认float64位,导致解析图片是处异常,必须将元素转为unit8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02-12306验证码预处理(分割、转存dat、解析dat文件) 的相关文章

  • shell编程计算1-1000中所有3或5的倍数之和

    bin bash sum 0 int 1 while int lt 1000 do if int 3 0 int 5 0 then sum sum int fi let int done echo sum bin bash sum 0 fo
  • Spring Security 自定义用户认证

    一 PasswordEncoder 在 Configuration注解的类下注入bean import org springframework security crypto bcrypt BCryptPasswordEncoder imp
  • C++ 数据类型

    使用编程语言进行编程时 需要用到各种变量来存储各种信息 变量保留的是它所存储的值的内存位置 这意味着 当创建一个变量时 就会在内存中保留一些空间 可能需要存储各种数据类型 比如字符型 宽字符型 整型 浮点型 双浮点型 布尔型等 的信息 操作
  • AI绘图实战(六):制作一张庆祝五一劳动节的海报

    S AI能取代设计师么 I 至少在设计行业 目前AI扮演的主要角色还是超级工具 要顶替 除非甲方对设计效果无所畏惧 预先学习 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题
  • JUMPSERVER+ZABBIX二次开发

    未完待续 1 apps assets models assets py 添加字段 zabbix group id models IntegerField null True blank True verbose name Zabbix Gr
  • Rust对文件的操作

    一 文件IO操作 在类unix系统中 一切都是文件 所以说广义的文件操作 其实包括很多 Socket 管道 内存映射等等 其实文件操作无论怎么变化 主流仍然是对外设的访问 计算机本身的组成 是一系列的硬件整合在一起的 单纯的只有CPU和内存
  • WSL 2是什么

    Windows Subsystem for Linux WSL 适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能 相比前一代的WSL WSL 2提供更全的兼容性
  • 【vue2】vue2中引入jquery

    文章目录 安装 main js中引用 修改webpack配置 把以下三步做好 就不会出现 jquery is not define 的问题了 安装 npm i jquery S main js中引用 import from jquery V
  • 918. 环形子数组的最大和

    918 环形子数组的最大和 难度中等192 给定一个由整数数组 A 表示的环形数组 C 求 C 的非空子数组的最大可能和 在此处 环形数组意味着数组的末端将会与开头相连呈环状 形式上 当0 lt i lt A length 时 C i A
  • Docker安装RabbitMQ docker安装RabbitMQ完整详细教程

    Docker安装RabbitMQ docker安装RabbitMQ完整详细教程 Docker 上安装 RabbitMQ 3 12 的步骤 选择要安装的RabbitMQ 版本 1 拉取 RabbitMQ 镜像 2 创建并运行容器 3 Rabb
  • H5移动端便捷兼容测试方式

    一 准备 1 谷歌浏览器 2 H链接 3 主流设备分辨率 尺寸 二 步骤 1 打开F12 选择手机模式 2 看顶部设备信息 点击 县级弹窗最底部的edit进入编辑模式 3 添加想要测试的设备 设备的宽高需要按照手机的分辨率和像素值计算 以i
  • Oracle的三种高可用集群方案

    转载自 http www cnblogs com baiboy p orc2 html label1 Oracle的三种高可用集群方案 1 RAC Real Application Clusters 多个Oracle服务器组成一个共享的Ca
  • Java 基本数据类型之间的运算规则

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 这里只讨论七种基本数据类型变量间的运算 不包含boolean类型的 1 自动类型提升 结论 当容量小的数据类型的变量与容量大的数据
  • 水果识别系统-tensorflow项目

    介绍 水果识别系统 可识别15种水果 人工智能 机器学习 模式识别项目 编程语言Python 基于tensorflow机器学习库通过卷积神经网络对数据集进行训练 经过多次迭代训练得到模型 预测精度达到99 技术栈 python tensor
  • Spring AOP、拦截器、过滤器的区别

    一 区别与概念 Filter过滤器 拦截web访问url地址 Interceptor拦截器 拦截以 action结尾的url 拦截Action的访问 Spring AOP拦截器 只能拦截Spring管理Bean的访问 业务层Service
  • 解决dataframe格式表格的合并

    这几天遇到了一个关于表格合并的问题 其实问题很简单 对于两个表格df1和df2 取出df1的每一行特征和df2的每一行的特征合并 再将label合并 但是看了很多pandas关于表的合并 其并不适用到我这个问题 所以在此我想简单的总结一下关
  • 使用虚拟机安装ikuai软路由系统,搭建pppoe拨号服务器

    搭建pppoe拨号服务器 一 搭建ikuai软路由系统 1 VMware版本 2 ikuai官网上下载系统镜像 3 使用虚拟机安装ikuai系统 4 登录ikuai管理界面 二 安装win7虚拟机验证拨号功能 三 其他电脑要使用这个pppo
  • 【解决】使用IDEA创建springboot项目时,出现错误Cannot download ‘https://start.spring.io‘: connect timed out

    第一步创建项目 create New Project 第二步 错误的意思为 初始化失败 https start spring io 请检查URL 网络和代理设置 错误消息 无法下载 https start spring io 连接超时 解决

随机推荐

  • java数据迁移程序

    环境 mysql 目标 亿级数据迁移 最终耗时 1 2小时 服务器更佳 建议在晚上或者没人访问的情况下操作 思路 1 不能一下将所有数据 导入到目标数据表 耗时太久 且占用资源 所有就用程序批量执行 每次执行一个范围段 比如第一个线程 1
  • stm32局部变量定义过大导致栈溢出

    我在stm32做归一化以及自相关的项目时 一开始直接定义了长度为8192的数组 进行自相关 单片机一直没有反应 上位机不输出信息 然后我把点数改为128后就能正常输出了 并且在调试后 我发现最高能运行的点数是512 经过上网查询我终于发现了
  • 容器适配器 -------------- stack 、queue、priority_queue的使用以及 为什么默认使用deque作为底层容器?

    什么是适配器 适配器是一种设计模式 设计模式是一套被反复使用的 多数人知晓的 经过分类编目的 代码设计经验的总结 该种模式是将一个类的接口转换成客户希望的另外一个接口 1 为什么将stack queue和priority queue称作为容
  • 第十六次CCF认证模拟试题(201903-2):二十四点(Java完整版)

    最近在练习算法 觉得CCF的算法题都还不错 就做了一下子 试卷原题 Java版解法 import java util ArrayList import java util Scanner public class Main public s
  • 不能不熬夜了

    我知道 熬夜不好 但是 现在 白天单位被鸟事所忙 没事磨洋工也得装个样子 看不了程序了 所以 只能把工作当作工作外 把业余当作工作了 况且 家庭压力太大
  • 如何用chrome查看post get及返回的数据

    chrome浏览器按下F12打开开发者工具 点击Network 找到过滤器 筛选XHR Method那一列会显示POST GET 转载于 https www cnblogs com yancongyang p 8142669 html
  • js调用angularjs的函数

    function test txm 获得对象 var appElement document querySelector ng controller MainCtrl 获得scope var scope angular element ap
  • 抖音短视频seo源码开发部署-技术分享(四)

    一 抖音短视频seo源码开发流程 抖音短视频SEO源码开发流程如下 1 分析需求 首先需要明确你的SEO目标 分析竞争对手 了解抖音短视频平台的规则 选定目标关键词和主题 2 编写代码 根据需求编写代码 并将其集成到你的应用程序或网站中 3
  • Association Class VS Full Class

    详细分析请见 http etutorials org Programming UML Chapter 6 Class Diagrams Advanced Concepts Association Class 1 关联类的必要性 关联类隔离了
  • X210开发板(S5PV210芯片)uboot中SD卡分区分析(init_raw_area_table函数)

    1 init raw area table函数调用关系 start s start armboot mmc initialize mmc init mmc startup init raw area table 2 struct raw a
  • visio画图常见问题解答

    使用visio画图有很多优点 与office相关产品完全兼容 可随时修改 操作简单等等 这里不再多说 我们在使用这一工具的时候常常会遇到一些小问题 但是这些小问题看似小 有的时候却会让我们折腾上半天 废话少说 现在把常见的几个问题的解决方案
  • java数组求和函数_Excel表格求和,难道你只会用SUM函数?(下)

    Excel求和函数 绝大部分人只会用SUM函数 今天再来分享4个求和函数 年前集齐8个求和函数年后开运 1 使用SUMXMY2函数返回两个数组中对应值差的平方和 SUMXMY2函数用于返回两数组中对应数值之差的平方和 函数语法 SUMXMY
  • 如何给keepalived配置vip(虚拟ip)

    首先为了测试机器 准备两台服务器 host1 172 28 23 73 host2 172 28 23 96 虚拟ip 172 28 23 100 第一步 在线安装keepalived中间件 sudo yum install y keepa
  • CMake Error: Cannot determine link language for target “test“.

    问题来源 project kinodyntest LANGUAGES CXX 先指定语言c add executable 后面传入的文件是 c 文件导致cmake报错 c 文件为 cpp
  • 论文笔记:STMARL: A Spatio-Temporal Multi-AgentReinforcement Learning Approach for Cooperative Traffic

    0 abstract 智能交通灯控制系统的开发对于智能交通管理至关重要 虽然已经做出了一些努力以孤立的形式来优化单个红绿灯的使用 但相关研究在很大程度上忽略了多路口红绿灯的使用受到空间影响的事实 以及历史交通状态的时间依赖性 为此 在本文中
  • 用microPython写一个ESP32的OLED的程序

    好的 我可以给你提供一些有关使用 MicroPython 在 ESP32 上编写 OLED 显示屏程序的指导 首先 你需要在 ESP32 上安装 MicroPython 固件 你可以使用 esptool 工具将 MicroPython 固件
  • iscsi多路径配置方式

    学习一个服务的过程 1 此服务器的概述 名字 功能 特点 端口号 2 安装 3 配置文件的位置 4 服务启动关闭脚本 查看端口 5 此服务的使用方法 6 修改配置文件 实战举例 7 排错 从下到上 从内到外 内容 实战 配置IP SAN多路
  • Linux升级命令yum update

    Linux升级命令有两个分别是yum upgrade和yum update 这个两个命令是有区别的 代码如下 yum y update 升级所有包同时也升级软件和系统内核 代码如下 yum y upgrade 只升级所有包 不升级软件和系统
  • Memcach基础使用

    memcache 基础课程 使用场景 memcache 服务器端的安装 推荐使用memcached memcached是memchache的升级版本 sudo su apt get install memcached usr bin mem
  • 02-12306验证码预处理(分割、转存dat、解析dat文件)

    import cv2 as cv import numpy as np import os import binascii temp path r F python StockAnalyzer test test avi img path