feat: 2.17.18
This commit is contained in:
+31
-7
@@ -59,6 +59,7 @@ def analyze_shot(frame, laser_point=None):
|
||||
"""
|
||||
logger = logger_manager.logger
|
||||
from datetime import datetime
|
||||
yellow_algorithm_ms = 0.0
|
||||
|
||||
# ── Step 1: 确定激光点 ────────────────────────────────────────────────────
|
||||
laser_point_method = None
|
||||
@@ -74,7 +75,11 @@ def analyze_shot(frame, laser_point=None):
|
||||
logger.info(f"[算法] 使用校准值: {laser_manager.laser_point}")
|
||||
else:
|
||||
# 动态模式:先做一次无激光点检测以估算距离,再推算激光点
|
||||
_, _, _, _, best_radius1_temp, _ = detect_circle_v3(frame, None)
|
||||
_t_yellow = time_std.perf_counter()
|
||||
try:
|
||||
_, _, _, _, best_radius1_temp, _ = detect_circle_v3(frame, None)
|
||||
finally:
|
||||
yellow_algorithm_ms += (time_std.perf_counter() - _t_yellow) * 1000.0
|
||||
distance_m_first = estimate_distance(best_radius1_temp) if best_radius1_temp else None
|
||||
if distance_m_first and distance_m_first > 0:
|
||||
laser_point = laser_manager.calculate_laser_point_from_distance(distance_m_first)
|
||||
@@ -119,6 +124,7 @@ def analyze_shot(frame, laser_point=None):
|
||||
"laser_point": laser_point, "laser_point_method": laser_point_method,
|
||||
"offset_method": "yellow_ellipse" if ellipse_params else "yellow_circle",
|
||||
"distance_method": "yellow_radius",
|
||||
"yellow_algorithm_ms": float(yellow_algorithm_ms),
|
||||
}
|
||||
if yolo_roi_xyxy is not None:
|
||||
out["yolo_roi_xyxy"] = yolo_roi_xyxy
|
||||
@@ -126,9 +132,12 @@ def analyze_shot(frame, laser_point=None):
|
||||
|
||||
if not use_tri:
|
||||
# 三角形未配置,直接跑圆形检测
|
||||
return _build_circle_result(
|
||||
detect_circle_v3(frame, laser_point, img_cv=img_cv)
|
||||
)
|
||||
_t_yellow = time_std.perf_counter()
|
||||
try:
|
||||
cdata = detect_circle_v3(frame, laser_point, img_cv=img_cv)
|
||||
finally:
|
||||
yellow_algorithm_ms += (time_std.perf_counter() - _t_yellow) * 1000.0
|
||||
return _build_circle_result(cdata)
|
||||
|
||||
# ── Step 4: 先独占跑三角形,超时或失败后再跑圆形(不与圆心并行,避免抢 CPU)──
|
||||
roi_xyxy = None
|
||||
@@ -281,6 +290,7 @@ def analyze_shot(frame, laser_point=None):
|
||||
"laser_point": laser_point, "laser_point_method": laser_point_method,
|
||||
"offset_method": tri.get("offset_method") or "triangle_homography",
|
||||
"distance_method": tri.get("distance_method") or "pnp_triangle",
|
||||
"yellow_algorithm_ms": float(yellow_algorithm_ms),
|
||||
"tri_markers": tri.get("markers", []),
|
||||
"tri_markers_completed": tri.get("markers_completed", []),
|
||||
"tri_homography": tri.get("homography"),
|
||||
@@ -301,7 +311,11 @@ def analyze_shot(frame, laser_point=None):
|
||||
|
||||
# 三角形超时或失败 → 跑圆心;圆心跑完后再检查三角形是否已结束
|
||||
try:
|
||||
cdata = detect_circle_v3(frame, laser_point, img_cv=img_cv)
|
||||
_t_yellow = time_std.perf_counter()
|
||||
try:
|
||||
cdata = detect_circle_v3(frame, laser_point, img_cv=img_cv)
|
||||
finally:
|
||||
yellow_algorithm_ms += (time_std.perf_counter() - _t_yellow) * 1000.0
|
||||
except Exception as e:
|
||||
logger.error(f"[CIRCLE] 圆形检测异常: {e}")
|
||||
cdata = (frame, None, None, None, None, None)
|
||||
@@ -337,10 +351,15 @@ def process_shot(adc_val):
|
||||
|
||||
# Classify only the current shot frame; never reuse a previous result.
|
||||
target_class_result = None
|
||||
yolo_target_ms = 0.0
|
||||
try:
|
||||
from target_roi_yolo import try_get_target_class_from_yolo
|
||||
|
||||
target_class_result = try_get_target_class_from_yolo(frame, logger=logger)
|
||||
_t_yolo_target = time_std.perf_counter()
|
||||
try:
|
||||
target_class_result = try_get_target_class_from_yolo(frame, logger=logger)
|
||||
finally:
|
||||
yolo_target_ms = (time_std.perf_counter() - _t_yolo_target) * 1000.0
|
||||
if logger:
|
||||
logger.info(f"[YOLO-TARGET] 当前箭业务结果: {target_class_result}")
|
||||
except Exception as exc:
|
||||
@@ -370,6 +389,7 @@ def process_shot(adc_val):
|
||||
laser_point_method = analysis_result["laser_point_method"]
|
||||
offset_method = analysis_result.get("offset_method", "yellow_circle")
|
||||
distance_method = analysis_result.get("distance_method", "yellow_radius")
|
||||
yellow_algorithm_ms = float(analysis_result.get("yellow_algorithm_ms", 0.0) or 0.0)
|
||||
tri_markers = analysis_result.get("tri_markers", [])
|
||||
tri_markers_completed = analysis_result.get("tri_markers_completed", [])
|
||||
tri_homography = analysis_result.get("tri_homography")
|
||||
@@ -419,7 +439,9 @@ def process_shot(adc_val):
|
||||
"r": 20.0, # 保留字段(服务端当前忽略,物理外环半径 cm)
|
||||
"target_class": target_label,
|
||||
"target_class_confidence": (
|
||||
float(target_confidence) if target_confidence is not None else None
|
||||
round(float(target_confidence), 2)
|
||||
if target_confidence is not None
|
||||
else None
|
||||
),
|
||||
"d": round((distance_m or 0.0) * 100),
|
||||
"d_laser": round((laser_distance_m or 0.0) * 100),
|
||||
@@ -431,6 +453,8 @@ def process_shot(adc_val):
|
||||
"target_y": float(y),
|
||||
"offset_method": offset_method,
|
||||
"distance_method": distance_method,
|
||||
"yellow_algorithm_ms": round(yellow_algorithm_ms, 2),
|
||||
"yolo_target_ms": round(float(yolo_target_ms), 2),
|
||||
}
|
||||
|
||||
if ellipse_params:
|
||||
|
||||
Reference in New Issue
Block a user