ヘルスコードの色認識と情報抽出

バックグラウンド

    流行は長く続いており、ヘルスコードの色認識と情報抽出のアプリを作る予定です。この記事では、opencv と PaddleOCR、Flask を使用して完了します

パドルOCR

    PaddleOCR は、開発者がより優れたモデルをトレーニングし、アプリケーションを実装するのに役立つ、豊富で先進的で実用的な OCR ツール ライブラリを作成することを目的としています。

OpenCV

    OpenCV は、クロスプラットフォームのコンピューター ビジョンおよび機械学習ソフトウェア ライブラリであり、Apache2.0 ライセンス (オープン ソース) の下でリリースされ、LinuxWindowsAndroid、およびMac OSオペレーティング システムで実行できます。[1]  軽量で効率的 - 一連の C 関数と少数の C++ クラスで構成され、Python、Ruby、MATLAB などの言語でインターフェイスを提供し、画像処理およびコンピュータビジョン。

フラスコ

    Flask は、Python で記述された軽量でカスタマイズ可能なフレームワークであり、同じタイプの他のフレームワークよりも柔軟で軽量、安全で使いやすいです。MVCパターンと組み合わせてうまく開発でき、開発者同士が連携でき、少人数のチームで中小規模のWebサイトや機能豊富なWebサービスを短期間で実現できます。さらに、Flask には強力なカスタマイズ機能もあり、ユーザーは自分のニーズに応じて対応する機能を追加でき、コア機能をシンプルに保ちながら機能の充実と拡張を実現できます.その強力なプラグイン ライブラリにより、ユーザーはパーソナライズされた Web サイトをカスタマイズおよび開発できます.強力なウェブサイト。

WeChat QR コード認識

    WeChat スキャン コード エンジンは、従来のコンピューター ビジョンとディープ ラーニング テクノロジを組み合わせることで、1 つの画像内の複数のコード、大きな画像内の小さなコード、堅牢なデコードなど、ビジネスの問題点と技術的な問題を解決します。わずか 3 行のコードで、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)
复制代码

    上記コードからQRコードの範囲を取得することができ、次に、主に所定の色範囲を用いて輪郭線を生成し、輪郭線が存在するか否かを判断する。


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

复制代码

テキスト認識

    Padleocr は主にテキスト認識で使用されます.現在使用されているすべての愚かな方法が認識された後、正規表現を使用して、主に核酸時間とそれが負であるかどうかに焦点を当てて、適切なテキストを一致させます. オフラインで使用するには、事前にモデルファイルをダウンロードしておくのがベストです。初期化コード:

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

ファイル インターフェースのアップロード

    ユーザーはフラスコを使用して、画像ファイルをアップロードして識別操作を完了する必要があります。アップロード インターフェイスは、クロスドメイン (デバッグに便利) とルーティング インターフェイスを設定するだけでよく、同時にファイル サフィックス名を確認して、指定されたファイルがアップロードされていることを確認します。

# 判断文件是否合法
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 を介して呼び出すことができます画像.png

参考文献:

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…
ブログ
. csdn.net/qq_36853469…
blog.csdn.net/juzicode00/…
zhuanlan.zhihu.com/p/348349456

おすすめ

転載: juejin.im/post/7142433372457926669