Reconocimiento de color del código de salud y extracción de información

antecedentes

    La epidemia ha estado sucediendo durante mucho tiempo y planeo hacer una aplicación para el reconocimiento de colores y la extracción de información de los códigos de salud. Este artículo usa opencv y PaddleOCR, Flask para completar

PádelOCR

    PaddleOCR tiene como objetivo crear una biblioteca de herramientas OCR rica, líder y práctica para ayudar a los desarrolladores a entrenar mejores modelos e implementar sus aplicaciones.

OpenCV

OpenCV es una biblioteca de software de aprendizaje automático y visión por computadora     multiplataforma lanzada bajo la licencia Apache2.0 (código abierto), que puede ejecutarse en los sistemas operativos Linux , Windows , Android y Mac OS . [1]  Es liviano y eficiente: consta de una serie de funciones C y una pequeña cantidad de clases C ++, proporciona interfaces en lenguajes como Python, Ruby y MATLAB, e implementa muchos algoritmos generales en procesamiento de imágenes y visión por computador. 

Matraz

    Flask es un marco personalizable liviano, escrito en Python, que es más flexible, liviano, seguro y fácil de usar que otros marcos del mismo tipo. Puede desarrollarse bien en combinación con el patrón MVC , y los desarrolladores pueden trabajar juntos, y un pequeño equipo puede completar la realización de sitios web pequeños y medianos o servicios web con funciones ricas en poco tiempo . Además, Flask también tiene una fuerte personalización, los usuarios pueden agregar las funciones correspondientes de acuerdo con sus propias necesidades y realizar el enriquecimiento y la expansión de las funciones manteniendo las funciones principales simples. Su poderosa biblioteca de complementos permite a los usuarios realizar sitios web personalizados Personalizar y desarrollar un sitio web poderoso.

Reconocimiento de código QR de WeChat

    Al combinar la visión por computadora tradicional y las tecnologías de aprendizaje profundo, el motor de código de escaneo de WeChat resuelve los problemas comerciales y las dificultades técnicas, como códigos múltiples en una imagen, códigos pequeños en imágenes grandes y decodificación robusta. Con solo 3 líneas de código, es fácil tener la capacidad de escaneo de WeChat.

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)
复制代码

    El rango del código QR se puede obtener del código anterior. A continuación, el rango de color predeterminado se utiliza principalmente para generar la línea de contorno para determinar si existe.


# 检测颜色
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

复制代码

reconocimiento de texto

    Padleocr se utiliza principalmente en el reconocimiento de texto.Después de reconocer todos los métodos estúpidos que se utilizan actualmente, se utilizan expresiones regulares para hacer coincidir el texto adecuado, centrándose principalmente en el tiempo de ácido nucleico y si es negativo. Para usar sin conexión, es mejor descargar el archivo del modelo por adelantado. Código de inicialización:

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')
复制代码

Código de reconocimiento de caracteres:

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
复制代码

Subir interfaz de archivo

    Los usuarios deben usar el matraz para completar la operación de identificación cargando archivos de imagen. La interfaz de carga simplemente debe configurar la interfaz de enrutamiento y el dominio cruzado (conveniente para la depuración) y, al mismo tiempo, verificar el nombre del sufijo del archivo para asegurarse de que se cargue el archivo especificado.

# 判断文件是否合法
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": "上传失败"})
复制代码

Efecto del proyecto

    La interfaz se puede llamar a través del cartero para realizar pruebasimagen.png

Referencias:

baike.baidu.com/item/Flask/…
github.com/PaddlePaddl…
github.com/WeChatCV/op…
zhuanlan.zhihu.com/p/417226916
blog.yuanpei.me/posts/15096…
zhuanlan.zhihu.com/ p/401841723
github.com/PaddlePaddl…
ai.baidu.com/support/new… blog.csdn.net/Mrli0530/ar…
zhuanlan.zhihu.com/p/430174498
blog.csdn.net/Kukeoo/arti…
blog
. csdn.net/qq_36853469…
blog.csdn.net/juzicode00/…
zhuanlan.zhihu.com/p/348349456

Supongo que te gusta

Origin juejin.im/post/7142433372457926669
Recomendado
Clasificación