Spaces:
Runtime error
Runtime error
File size: 3,239 Bytes
20dbca5 ccd26b6 20dbca5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
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()
|