机械臂识别二维码
This commit is contained in:
+37
-49
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user