健康码颜色识别和信息提取

Elastic搜索者
• 阅读 740

背景

疫情已经持续很久,打算做一个健康码颜色识别和信息提取的应用。本文采用opencv和PaddleOCR、Flask来完成

PaddleOCR

PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力开发者训练出更好的模型,并应用落地。

OpenCV

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1]  它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

Flask

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

微信二维码识别

结合传统计算机视觉和深度学习技术,微信扫码引擎解决了一图多码、大图小码、鲁棒解码等业务痛点和技术难点。只需3行代码,轻松拥有微信的扫码能力。

import cv2

detector = cv2.wechat_qrcode_WeChatQRCode("detect.prototxt", "detect.caffemodel", "sr.prototxt", "sr.caffemodel")
img = cv2.imread("img.jpg")
res, points = detector.detectAndDecode(img)

print(res, points)

从上面的代码中可获取二维码的范围,接下来主要使用预定好的颜色范围去生成等值线,判断是否存在


# 检测颜色
def detect_color(image, color):
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)  # HSV
    inRange_hsv = cv2.inRange(hsv, color_dist[color]['Lower'], color_dist[color]['Upper'])
    contours = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    if len(contours) > 0 and draw_color_area(image, contours) > 0:
        return True
    else:
        return False

# 标记颜色区域
def draw_color_area(image, contours):
    allarea, index = 0, -1
    for i in range(len(contours)):
        area = cv2.contourArea(contours[i])
        allarea = area + allarea
    return allarea

文字识别

文字识别中主要使用了paddleocr,目前用的笨办法全部识别出来以后再去用正则表达式去匹配出合适的文字,主要是关注核酸时间和是否阴性。为了能离线使用,最好提前下载好模型文件。 初始化代码:

ocr = PaddleOCR(rec_model_dir='./ocr/rec/ch/ch_PP-OCRv3_rec_infer',det_model_dir='./ocr/det/ch/ch_PP-OCRv3_det_infer', cls_model_dir='./ocr/cls/ch_ppocr_mobile_v2.0_cls_infer')

文字识别代码:

def getText(img):
    res = ocr.ocr(img, det=True, cls=False)
    pattern = re.compile('[0-9]+')
    qgtime = '暂无数据'
    isYin = ''
    for i in res:
        #print(i)
        match= pattern.findall(i[1][0])
        if (i[1][0].find(u"小时")>-1 or i[1][0].find(u"天")>-1) and match:
            qgtime=i[1][0]
        if (i[1][0].find(u"阴")>-1 or i[1][0].find(u"阳")>-1) and i[1][0].find(u"性")>-1:
            isYin=i[1][0]
    return qgtime,isYin

上传文件接口

用户要通过上传图片文件来完成识别操作,这时候就需要使用flask。 上传接口需要简单设置下跨域(方便调试)以及路由接口,同时要验证文件后缀名,以保证上传指定的文件。

# 判断文件是否合法
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

@app.route('/detect', methods=['POST'], strict_slashes=False)
@cross_origin(supports_credentials=True)
def dataDectect():
    #print(datetime.datetime.now())
    starttime = datetime.datetime.now()
    file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])  # 拼接成合法文件夹地址

    file_dir = app.config['UPLOAD_FOLDER']  # 拼接成合法文件夹地址
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)  # 文件夹不存在就创建
    f = request.files['img']  # 从表单的file字段获取文件,myfile为该表单的name值
    if f and allowed_file(f.filename):  # 判断是否是允许上传的文件类型
        fname = f.filename
        ext = fname.rsplit('.', 1)[1]  # 获取文件后缀
        unix_time = int(time.time())
        new_filename = str(unix_time) + '.' + ext  # 修改文件名
        filePath = os.path.join(file_dir, new_filename)
        #print(datetime.datetime.now())
        f.save(filePath)  # 保存文件到upload目录

        #print(datetime.datetime.now())
        img = cv2.imread(filePath)
        codeName = webchatQrDetect(img)

        qrtime,isYin=getText(img)
        endtime = datetime.datetime.now()
        duringtime = endtime - starttime
        os.remove(filePath)
        #print(datetime.datetime.now())
        #print('the work use ', duringtime. microseconds/1000000)
        # print('the work end', datetime.datetime.now(), datetime.datetime.now())
        return jsonify({ "运行时间":str(round(duringtime. seconds,3))+'s',"msg": "上传成功",u"核酸时间": qrtime,u'状态':isYin, u"健康码": codeName})
    else:
        return jsonify({"msg": "上传失败"})

项目效果
    

通过postman可以调用接口进行测试

健康码颜色识别和信息提取

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Android CameraX NDK OpenCV(四)
学更好的别人,做更好的自己。——《微卡智享》本文长度为1999字,预计阅读5分钟前言OpenCV在4的版本后就有了二维码QRCode的检测和识别功能,当时刚出的时候效率及识别效果都还一般,在4.1.2的版本中也改善了精度和速度,然后后面4.3版
Stella981 Stella981
3年前
Opencv颜色识别与追踪
这是基于颜色识别的物体追踪不废话直接看代码这是Opencv3的代码//【头文件、命名空间包含部分】//描述:包含程序所使用的头文件和命名空间//
数据堂 数据堂
1年前
语音识别技术在医疗健康领域的应用与挑战
一、引言随着医疗健康领域的发展和人工智能技术的进步,语音识别技术在医疗健康领域的应用越来越广泛。本文将探讨语音识别技术在医疗健康领域的应用以及面临的挑战。二、语音识别技术在医疗健康领域的应用1.语音病历:通过语音识别技术,医生可以快速、准确地获取患者的病历
数据堂 数据堂
1年前
语音识别技术在医疗健康领域的应用与挑战
一、引言随着医疗健康领域的发展和人工智能技术的进步,语音识别技术在医疗健康领域的应用越来越广泛。本文将探讨语音识别技术在医疗健康领域的应用以及面临的挑战。二、语音识别技术在医疗健康领域的应用1.智能问诊:通过语音识别技术,可以将患者的症状和问题转化为文字信
数据堂 数据堂
1年前
情感语音识别技术在心理健康领域的应用与挑战
一、引言情感语音识别技术是一种通过分析人类语音中的情感信息来评估和监测心理健康状况的技术。近年来,随着人工智能和心理医学的快速发展,情感语音识别技术在心理健康领域的应用越来越广泛。本文将探讨情感语音识别技术在心理健康领域的应用以及面临的挑战。二、情感语音识
曼成 曼成
1年前
二维码识别OCR接口:智能化信息获取的新篇章
在信息爆炸的时代,快速、准确地获取数据变得尤为重要。二维码(QRCode)作为一种高效的信息传输工具,已经广泛应用于各个领域。二维码识别OCR(光学字符识别)接口的诞生,不仅极大地简化了数据输入的过程,还为智能化管理和信息交互开辟了新的道路。本文将探讨二维码识别OCR接口的工作原理、应用场景以及它在现代社会中的重要性。
马尚 马尚
1年前
使用Python和OpenCV识别英文字符验证码
在这个项目中,我们将展示如何使用Python和OpenCV库来识别英文字符验证码。英文字符验证码通常包含大小写字母和数字字符,我们可以利用图像处理和机器学习技术来识别这些字符。首先,我们需要导入所需的库:pythonimportcv2importnumpy
马尚 马尚
1年前
使用OpenCV和Tesseract识别英文数字验证码
在这个项目中,我们将展示如何使用OpenCV和Tesseract来识别英文数字验证码。验证码是一种常见的安全措施,用于防止机器人或恶意软件的访问。英文数字验证码通常包含了随机生成的字母和数字,我们将利用OpenCV进行图像处理,并使用Tesseract来进
马尚 马尚
1年前
探究验证码识别技术与实践方法
验证码识别技术在网络爬虫和自动化测试等领域有着广泛的应用,但是验证码的复杂性和多样性也给识别带来了挑战。本文将深入探讨验证码识别的技术原理和实践方法,为读者提供全面的认识和应用指南。1.深度学习方法:深度学习在验证码识别领域有着广泛的应用,通过神经网络模型
马尚 马尚
1年前
实战验证码识别:Python与OpenCV
验证码是网络应用中常见的安全工具,用于区分人类用户和机器人。在许多情况下,我们需要自动化程序来处理验证码以完成特定任务,例如注册、登录或数据采集。本文将介绍如何使用Python和OpenCV库实现验证码识别的实战项目。项目概述我们将创建一个Python脚本
京东平台内容合规的技术与挑战
1、内容合规域介绍合规域在电商平台中扮演着重要的角色,它相当于电商体系中的“免疫系统”,通过识别恶意的商品、商家以及UGC内容,确保电商生态的健康、有序和可持续发展。因此我们部门致力于打造业内领先的内容理解与审核平台,在具体工作中,通过识别并治理商家在产品