-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqr_tool.py
More file actions
89 lines (77 loc) · 3.05 KB
/
qr_tool.py
File metadata and controls
89 lines (77 loc) · 3.05 KB
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
import qrcode
import cv2
import numpy as np
from pyzbar.pyzbar import decode
import sys
# ==============================
# R1:生成二维码并显示(树莓派适配,无窗口标题)
# ==============================
def R1_generate(value: float, qr_size=400, keep_show=True):
"""
R1 生成二维码并清晰显示在屏幕上(树莓派适配)
:param value: 要生成的float数值(如111.0、0.0)
:param qr_size: 二维码显示尺寸(像素,默认400x400)
:param keep_show: 是否持续显示(True=按任意键关闭,False=自动显示5秒)
"""
try:
# 1. 转换数值为字符串
qr_content = str(value)
print(f"[R1] 开始生成二维码,内容:{qr_content}")
# 2. 配置二维码生成参数
qr = qrcode.QRCode(
version=2,
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=15,
border=4,
)
qr.add_data(qr_content)
qr.make(fit=True)
# 3. 生成图像并转换为OpenCV格式
qr_img = qr.make_image(fill_color="black", back_color="white").convert("RGB")
qr_np = np.array(qr_img, dtype=np.uint8)
qr_cv2 = cv2.cvtColor(qr_np, cv2.COLOR_RGB2BGR)
# 4. 缩放二维码
qr_cv2 = cv2.resize(qr_cv2, (qr_size, qr_size), interpolation=cv2.INTER_NEAREST)
# 5. 树莓派显示优化(解决无窗口标题闪烁问题)
cv2.imshow("", qr_cv2)
print(f"[R1] 二维码已显示在屏幕!")
print(f"提示:{'按任意键关闭窗口' if keep_show else '5秒后自动关闭窗口'}")
# 6. 控制显示时长(树莓派按键响应优化)
if keep_show:
cv2.waitKey(0)
else:
cv2.waitKey(5000)
# 7. 清理窗口
cv2.destroyAllWindows()
print(f"[R1] 二维码窗口已关闭")
except Exception as e:
print(f"[R1] 生成/显示二维码失败:{e}")
sys.exit(1)
# ==============================
# R2:识别二维码(树莓派通用,兼容picamera2帧格式)
# ==============================
def R2_read(frame) -> float: # frame参数,接收外部传入的帧
"""
R2 识别传入帧中的二维码(树莓派适配)
:param frame: 摄像头读取的帧(cv2格式/picamera2转换后的格式)
:return: float 结果,未识别返回 0.0
"""
result = 0.0
found = False
# 树莓派帧格式兼容(确保是BGR格式)
if len(frame.shape) == 2: # 灰度图转彩色
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
elif frame.shape[2] == 4: # RGBA转BGR
frame = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR)
# 识别二维码
codes = decode(frame)
for code in codes:
s = code.data.decode("utf-8").strip()
try:
result = float(s)
found = True
print(f"[R2] 识别成功: {result}")
break
except:
print(f"[R2] 不是数字: {s}")
return result if found else 0.0 # 识别到返回数值,否则返回0.0