Spaces:
Runtime error
Runtime error
import copy | |
import cv2 as cv | |
import os | |
import gradio as gr | |
# 定义二维码检测函数 | |
def detect_qr_code(image): | |
# 初始化 WeChatQRCode 检测器 | |
qrcode_detector = cv.wechat_qrcode_WeChatQRCode( | |
"detect.prototxt", | |
"detect.caffemodel", | |
"sr.prototxt", | |
"sr.caffemodel", | |
) | |
# 检测并解码二维码 | |
result = qrcode_detector.detectAndDecode(image) | |
seen_qrcodes = set() | |
# 创建副本以绘制检测框 | |
debug_image = copy.deepcopy(image) | |
for text in result[0]: | |
if text: | |
seen_qrcodes.add(text) | |
debug_image = draw_tags(debug_image, result, 0, len(seen_qrcodes), len(result[0])) | |
return debug_image, list(seen_qrcodes) | |
# 定义绘制标签的函数 | |
def draw_tags(image, qrcode_result, elapsed_time, total_qrcodes, current_qrcodes): | |
for i in range(len(qrcode_result[0])): | |
text = qrcode_result[0][i] | |
corner = qrcode_result[1][i] | |
corner_01 = (int(corner[0][0]), int(corner[0][1])) | |
corner_02 = (int(corner[1][0]), int(corner[1][1])) | |
corner_03 = (int(corner[2][0]), int(corner[2][1])) | |
corner_04 = (int(corner[3][0]), int(corner[3][1])) | |
# 各边勾画 | |
cv.line( | |
image, | |
(corner_01[0], corner_01[1]), | |
(corner_02[0], corner_02[1]), | |
(255, 0, 0), | |
2, | |
) | |
cv.line( | |
image, | |
(corner_02[0], corner_02[1]), | |
(corner_03[0], corner_03[1]), | |
(255, 0, 0), | |
2, | |
) | |
cv.line( | |
image, | |
(corner_03[0], corner_03[1]), | |
(corner_04[0], corner_04[1]), | |
(0, 255, 0), | |
2, | |
) | |
cv.line( | |
image, | |
(corner_04[0], corner_04[1]), | |
(corner_01[0], corner_01[1]), | |
(0, 255, 0), | |
2, | |
) | |
# 文本 | |
cv.putText( | |
image, | |
str(text), | |
(corner_01[0], corner_01[1] - 10), | |
cv.FONT_HERSHEY_SIMPLEX, | |
0.75, | |
(0, 255, 0), | |
2, | |
cv.LINE_AA, | |
) | |
# 处理时间 | |
cv.putText( | |
image, | |
"Elapsed Time:" + "{:.1f}".format(elapsed_time * 1000) + "ms", | |
(10, 30), | |
cv.FONT_HERSHEY_SIMPLEX, | |
0.8, | |
(0, 255, 0), | |
2, | |
cv.LINE_AA, | |
) | |
cv.putText( | |
image, | |
"Total QR Codes: " + str(total_qrcodes), | |
(10, 60), | |
cv.FONT_HERSHEY_SIMPLEX, | |
0.8, | |
(0, 255, 0), | |
2, | |
cv.LINE_AA, | |
) | |
cv.putText( | |
image, | |
"Current QR Codes: " + str(current_qrcodes), | |
(10, 90), | |
cv.FONT_HERSHEY_SIMPLEX, | |
0.8, | |
(0, 255, 0), | |
2, | |
cv.LINE_AA, | |
) | |
return image | |
# 创建 Gradio 接口 | |
interface = gr.Interface( | |
fn=detect_qr_code, | |
inputs=gr.Image(type="numpy", label="Upload an image"), | |
outputs=[ | |
gr.Image(type="numpy", label="Annotated Image"), | |
gr.Textbox(label="Detected QR Codes"), | |
], | |
title="QR Code Detector", | |
description="Upload an image to detect QR codes in it using OpenCV and WeChatQRCode.", | |
) | |
# 启动 Gradio 接口 | |
interface.launch() | |