refactor(接口3): 简化为只需划线图一张,去掉 original + best_hairline

按需求方意见——B端只需上传一张已画好发际线的图,用不着原图:
- 入参去掉 original_image_*,只保留 marked_image_*(三选一)
- 输出去掉 best_hairline_image_url,只返回 hair_growth_image_url + hairline_type
- ComfyUI 输入图改用 marked 划线图原样(add_hair.json 本就是"画了线的照片",
  提示词清除黑线);检测路径只用于建遮罩,不再重画干净线/不需对齐原图
- service.generate_grow_b 签名改 (marked_bgr) 单参
- 同步文档:接口文档/接口3技术方案/网关映射表(去掉接口3 best_hairline 行)
- 测试更新:grow-b 只传 marked,断言无 best_hairline 字段,44全绿

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
xsl
2026-06-15 10:28:13 +08:00
co-authored by Claude Opus 4.8
parent cd4ca278d4
commit bf76923591
6 changed files with 47 additions and 78 deletions
+5 -14
View File
@@ -193,9 +193,11 @@ def generate_hairline_pngs(image_bgr: np.ndarray, gender: str):
return {"images": images, "best_center": best_center}
def generate_grow_b(marked_bgr: np.ndarray, original_bgr: np.ndarray):
"""接口3:检测医生手绘发际线 → 遮罩 → 原图重画干净线 → ComfyUI 生发。
def generate_grow_b(marked_bgr: np.ndarray):
"""接口3:检测医生手绘发际线 → 遮罩 → ComfyUI 生发(仅需划线图一张)
检测路径只用来**建遮罩**ComfyUI 输入图用 **marked 原图**(含医生手绘线,
工作流提示词会清除黑线再生发)。
Returns: {"grown_png": bytes 或 None, "status": "ok"|"no_face"|"no_line"}。
"""
rgb = cv2.cvtColor(marked_bgr, cv2.COLOR_BGR2RGB)
@@ -208,23 +210,12 @@ def generate_grow_b(marked_bgr: np.ndarray, original_bgr: np.ndarray):
return {"grown_png": None, "status": "no_line"}
h, w = marked_bgr.shape[:2]
# 原图对齐到 marked 坐标系(同一张照片的原始版/划线版,尺寸应一致)
orig = original_bgr
if orig.shape[:2] != (h, w):
orig = cv2.resize(orig, (w, h), interpolation=cv2.INTER_AREA)
# 在原图上重画干净黑线(膨胀成笔迹宽度),替代医生手绘的毛刺
line_w = max(2, int(w * 0.006))
marked_clean = orig.copy()
cv2.polylines(marked_clean, [path[:, ::-1].reshape(-1, 1, 2)], False,
(0, 0, 0), line_w, lineType=cv2.LINE_AA)
# 遮罩:检测路径曲线 + ROI 闭合
curve_mask = path_to_curve_mask(path, h, w, thickness=max(3, line_w))
mask = mask_from_curve(curve_mask, landmarks, parse_map)
buf = io.BytesIO()
compose_comfy_rgba(marked_clean, mask).save(buf, format="PNG")
compose_comfy_rgba(marked_bgr, mask).save(buf, format="PNG") # marked 原图 + 遮罩
grown_png = comfyui.run(buf.getvalue())
return {"grown_png": grown_png, "status": "ok"}