This commit is contained in:
yrx
2026-09-01 11:48:26 +08:00
parent 179b30a944
commit ffeb82cf8f
17 changed files with 130 additions and 39 deletions
+51 -2
View File
@@ -902,13 +902,16 @@ def _save_shot_image_impl(img_cv, center, radius, method, ellipse_params,
def _save_worker_loop():
"""存图 worker从队列取任务并调用 _save_shot_image_impl"""
"""存图 worker处理标注图和可选的纯原图任务"""
while True:
try:
item = _save_queue.get()
if item is None:
break
_save_shot_image_impl(*item)
if isinstance(item, dict) and item.get("kind") == "raw":
_save_raw_image_impl(item["img_cv"], item["shot_id"], item["photo_dir"])
else:
_save_shot_image_impl(*item)
except Exception as e:
logger = logger_manager.logger
if logger:
@@ -936,6 +939,52 @@ def start_save_shot_worker():
logger.info("[VISION] 存图 worker 线程已启动")
def _save_raw_image_impl(img_cv, shot_id, photo_dir):
"""保存未标注、未裁剪的完整原始帧。"""
logger = logger_manager.logger
try:
os.makedirs(photo_dir, exist_ok=True)
filename = os.path.join(photo_dir, f"shot_{shot_id}_raw.jpg")
image.cv2image(img_cv, False, False).save(filename)
prune_old_images_in_dir(
photo_dir,
getattr(config, "RAW_IMAGE_MAX_IMAGES", config.MAX_IMAGES),
logger,
"[VISION-RAW]",
)
if logger:
logger.info(f"[VISION-RAW] 已保存纯原图: {filename}")
return filename
except Exception as e:
if logger:
logger.error(f"[VISION-RAW] 保存纯原图失败: {e}")
return None
def enqueue_save_raw_shot(frame, shot_id, photo_dir=None):
"""复制并异步保存原始帧;由 SAVE_RAW_IMAGE_ENABLED 控制是否启用。"""
if not getattr(config, "SAVE_RAW_IMAGE_ENABLED", False):
return
if photo_dir is None:
photo_dir = getattr(config, "RAW_IMAGE_DIR", os.path.join(config.PHOTO_DIR, "raw"))
try:
img_copy = np.copy(image.image2cv(frame, False, False))
_save_queue.put_nowait({
"kind": "raw",
"img_cv": img_copy,
"shot_id": shot_id,
"photo_dir": photo_dir,
})
except queue.Full:
logger = logger_manager.logger
if logger:
logger.warning("[VISION-RAW] 存图队列已满,跳过本次纯原图保存")
except Exception as e:
logger = logger_manager.logger
if logger:
logger.error(f"[VISION-RAW] 复制纯原图失败: {e}")
def enqueue_save_shot(result_img, center, radius, method, ellipse_params,
laser_point, distance_m, shot_id=None, photo_dir=None,
yolo_roi_xyxy=None, force_save=False):