Python程序教程

您现在的位置是:首页 >  Python

当前栏目

Python || 皖事通安康码截图信息简易识别采集

Python,皖事通,安康,截图,信息,简易,识别,采集
2025-03-20 08:49:00 时间

概述

为了收集大家的健康码信息,工作人员要依据大家的截图将数据一一录入,繁琐复杂。基于此问题,想到写段程序解决这个繁杂无聊的工作。

调库

1.图像处理模块 opencv

2.文字识别模块 百度API

3.数据处理模块 numpy

4.信息汇总模块 xlwt

模块化

图片信息识别提取

调用百度API通用文字识别高精度版,具体使用方法见Python || 实现实时截图文字内容识别OCR

文字信息处理

提取到的信息会被存储在contentList中,依据健康码是否为“安康码”进一步提取用户信息,这里只提取时间和姓名。

if "皖事通·安康码" in contentList:
   isextra = 1
   codeType = "安康码"
   codeName,codeTime = collecPersonData(contentList)
   
def collecPersonData(result):
    prevIndex = result.index('办事')
    nextIndex = result.index('点击认证网证助手')

    if nextIndex - prevIndex == 2:
        codeName = result[prevIndex + 1]
    else:
        codeName = "未找到姓名"

    for i in range(20, 23):
        timeString = result[i]
        if "2022" in timeString:
            currentTime = timeString[0:10]
            currentDay =timeString[10:]
            codeTime = currentDay + " "+currentTime
    return codeName,codeTime

健康码颜色提取

颜色分为“红色”、“黄色”和“绿色”,依据HSV颜色空间的三种颜色的分布进行提取。

def getCodeColor(frame):
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    maxsum = -100
    color = None
    color_dict = getColorList()
    for d in color_dict:
        mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1])
        binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]
        binary = cv2.dilate(binary, None, iterations=2)
        cnts, hiera = cv2.findContours(binary.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        sum = 0
        for c in cnts:
            sum += cv2.contourArea(c)
        if sum > maxsum:
            maxsum = sum
            color = d
    return color

其中,三种颜色的颜色值范围如下。

def getColorList():
    dict = collections.defaultdict(list)

    # 红色
    lower_red = np.array([0, 60, 60])
    upper_red = np.array([6, 255, 255])
    color_list = []
    color_list.append(lower_red)
    color_list.append(upper_red)
    dict['red'] = color_list

    # 黄色
    lower_yellow = np.array([26, 43, 46])
    upper_yellow = np.array([34, 255, 255])
    color_list = []
    color_list.append(lower_yellow)
    color_list.append(upper_yellow)
    dict['yellow'] = color_list

    # 绿色
    lower_green = np.array([35, 43, 46])
    upper_green = np.array([77, 255, 255])
    color_list = []
    color_list.append(lower_green)
    color_list.append(upper_green)
    dict['green'] = color_list

    return dict

信息收集

将“安康码”信息存储在excel中,方便后期处理,具体方法见Python助力2020公务员考试 获取全国公务员职位信息

为区分“健康码”类型,对非“安康码”不做处理,对“安康码”做改名处理,名称改为“安康码”的人名。

os.rename('rootPath/' + imageName, 'rootPath' + codeName.replace(':', '--').replace('*', '') + '.jpg')  # 非法字符处理