import cv2 import numpy as np from pyzbar.pyzbar import decode from fastapi import FastAPI, File, UploadFile from typing import List import shutil from logging import getLogger, StreamHandler, DEBUG logger = getLogger(__name__) handler = StreamHandler(); handler.setLevel(DEBUG) logger.setLevel(DEBUG) logger.addHandler(handler) logger.propagate = False def qrdec_zbar(image_path): # load image image = cv2.imread(image_path) # QRコードをデコードする dec_infos = decode(image) result_data = "" readable = False if dec_infos: for dec_info in dec_infos: if not dec_info =="": result_data = dec_info.data.decode("utf-8") readable = True break else: pass return {"data": result_data, "readable": readable} # ----------------------------------------------------------- # initial # ----------------------------------------------------------- font = cv2.FONT_HERSHEY_SIMPLEX # ----------------------------------------------------------- # function_qr_dec # ----------------------------------------------------------- def qrdec_cv2(img_bgr): # QRCodeDetectorインスタンス生成 qrd = cv2.QRCodeDetector() # QRコードデコード retval, dec_infos, _, _ = qrd.detectAndDecodeMulti(img_bgr) result_data = "" readable = False if retval: for dec_info in dec_infos: if not dec_info=="": result_data = dec_info readable = True break else: pass return {"data": result_data, "readable": readable} # ----------------------------------------------------------- # sample program # ----------------------------------------------------------- def qrdec(file_path): img_BGR = cv2.imread(file_path, cv2.IMREAD_COLOR) cv2_result = qrdec_cv2(img_BGR) zbar_result = qrdec_zbar(file_path) is_safe_to_read = cv2_result["readable"] and zbar_result["readable"] readable = cv2_result["readable"] or zbar_result["readable"] decoded = "" if cv2_result["readable"]: decoded = cv2_result["data"] elif zbar_result["readable"]: decoded = zbar_result["data"] return {"is_safe_to_read": is_safe_to_read, "readable": readable, "decoded": decoded} app = FastAPI() @app.post("/") async def upload_image(image: UploadFile = File(...)): # 画像ファイルの内容を保存または処理する with open(image.filename, "wb") as buffer: shutil.copyfileobj(image.file, buffer) result = qrdec(image.filename) logger.info(f"response : {result}") return result