机械臂识别二维码

This commit is contained in:
ywb
2026-05-21 20:42:29 +08:00
parent 457f32919c
commit 466272cc22
+37 -49
View File
@@ -1379,56 +1379,44 @@ def api_qr_config_scan(qr_id):
try: try:
import cv2 import cv2
import numpy as np import numpy as np
# 从机械臂摄像头拉取一帧 JPEG # 从机械臂摄像头 snapshot 端点拉取一帧 JPEG
r = requests.get(ARM_CAMERA_CONFIG["url"], stream=True, timeout=5) r = requests.get(ARM_CAMERA_CONFIG.get("snapshot_url", ARM_CAMERA_CONFIG["url"]), timeout=8)
if r.status_code != 200: if r.status_code != 200 or not r.content:
return jsonify({"ok": False, "error": "无法连接机械臂摄像头"}), 400 return jsonify({"ok": False, "error": "无法连接机械臂摄像头"}), 400
data = b"" jpg_bytes = r.content
for chunk in r.iter_content(chunk_size=4096): # 解码为 numpy 数组并检测二维码
data += chunk nparr = np.frombuffer(jpg_bytes, np.uint8)
s = data.find(b"\xff\xd8") frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
e = data.find(b"\xff\xd9", s + 2) if s >= 0 else -1 if frame is None:
if s >= 0 and e > s: return jsonify({"ok": False, "error": "图像解码失败"}), 400
r.close() # 使用 OpenCV QRCodeDetector 检测
jpg_bytes = data[s:e+2] detector = cv2.QRCodeDetector()
# 解码为 numpy 数组并检测二维码 result, _, _ = detector.detectAndDecode(frame)
nparr = np.frombuffer(jpg_bytes, np.uint8) if result and len(result.strip()) > 0:
frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR) result = result.strip()
if frame is None: # 保存到配置项
return jsonify({"ok": False, "error": "图像解码失败"}), 400 for entry in gs.qr_config:
# 使用 OpenCV QRCodeDetector 检测 if entry["id"] == qr_id:
detector = cv2.QRCodeDetector() entry["qr_value"] = result
result, _, _ = detector.detectAndDecode(frame) # 尝试匹配机型
if result and len(result.strip()) > 0: matched_model = None
result = result.strip() for model in gs.models_config:
# 保存到配置项 prefix = model.get("serial_prefix", "")
for entry in gs.qr_config: if prefix and result.startswith(prefix):
if entry["id"] == qr_id: matched_model = model
entry["qr_value"] = result break
# 尝试匹配机型 if matched_model:
matched_model = None entry["model_id"] = matched_model["id"]
for model in gs.models_config: save_json("qr_config.json", gs.qr_config)
prefix = model.get("serial_prefix", "") return jsonify({
if prefix and result.startswith(prefix): "ok": True,
matched_model = model "qr_value": result,
break "model_id": entry.get("model_id", ""),
if matched_model: "model_name": matched_model["name"] if matched_model else ""
entry["model_id"] = matched_model["id"] })
save_json("qr_config.json", gs.qr_config) return jsonify({"ok": False, "error": f"二维码 {qr_id} 不存在"}), 404
return jsonify({ else:
"ok": True, return jsonify({"ok": False, "error": "未检测到二维码"})
"qr_value": result,
"model_id": entry.get("model_id", ""),
"model_name": matched_model["name"] if matched_model else ""
})
return jsonify({"ok": False, "error": f"二维码 {qr_id} 不存在"}), 404
else:
return jsonify({"ok": False, "error": "未检测到二维码"})
if len(data) > 1024 * 1024:
r.close()
return jsonify({"ok": False, "error": "摄像头数据流异常"}), 400
r.close()
return jsonify({"ok": False, "error": "未收到完整图像帧"}), 400
except Exception as ex: except Exception as ex:
logger.error(f"QR 扫描机械臂摄像头失败: {ex}") logger.error(f"QR 扫描机械臂摄像头失败: {ex}")
return jsonify({"ok": False, "error": f"扫描失败: {str(ex)}"}), 400 return jsonify({"ok": False, "error": f"扫描失败: {str(ex)}"}), 400