save code
This commit is contained in:
+16
-11
@@ -235,7 +235,8 @@ def generate_hairline_pngs(image_bgr: np.ndarray, gender: str,
|
||||
三档贴图同名,生发黑模板固定取自 hairline_texture_black/(middle),故生发目标固定 middle 档。
|
||||
use_mask/prompt:同接口2 的生发参数。
|
||||
Returns: {"images":[{hairline_type,order,overlays:{middle,high,low}((H,W,4) RGBA 透明层),grown_png}],
|
||||
"best_center":(x,y)};无人脸 None。best_center 取首个选中发型的 middle 档。
|
||||
"best_centers":{"middle":(x,y),"high":(x,y),"low":(x,y)}};无人脸 None。
|
||||
best_centers 取首个选中发型三档各自的发际线中点。
|
||||
"""
|
||||
if gender not in ("male", "female"):
|
||||
raise ValueError(f"gender 必须是 male/female,收到 {gender!r}")
|
||||
@@ -258,7 +259,16 @@ def generate_hairline_pngs(image_bgr: np.ndarray, gender: str,
|
||||
if not use_mask:
|
||||
shared_grown = _grow_from_texture(image_bgr, ctx, None, use_mask=False, prompt=prompt)
|
||||
|
||||
images, best_center = [], None
|
||||
def _center_of(overlay):
|
||||
"""从某档发际线透明叠图取面部中轴处的发际线中点 (x,y),无像素返回 None。"""
|
||||
ys, xs = np.where(overlay[:, :, 3] > 40)
|
||||
if not xs.size:
|
||||
return None
|
||||
near = np.abs(xs - face_cx) <= max(2, int(w * 0.02))
|
||||
col_ys = ys[near] if near.any() else ys[np.argsort(np.abs(xs - face_cx))[:20]]
|
||||
return (int(round(face_cx)), int(round(float(col_ys.mean()))))
|
||||
|
||||
images, best_centers = [], None
|
||||
for s in hair_styles: # s = 1-indexed 发型序号
|
||||
key, mid_path = tex_by_level["middle"][s - 1]
|
||||
overlays = {}
|
||||
@@ -270,15 +280,10 @@ def generate_hairline_pngs(image_bgr: np.ndarray, gender: str,
|
||||
_grow_from_texture(image_bgr, ctx, mid_path, use_mask=True, prompt=prompt)
|
||||
images.append({"hairline_type": key, "order": s,
|
||||
"overlays": overlays, "grown_png": grown_png})
|
||||
# best_center:首个选中发型的 middle 档发际线中点(面部中轴处的发际线 y)
|
||||
if best_center is None:
|
||||
overlay = overlays["middle"] # 复用已渲染的 middle 档透明层
|
||||
ys, xs = np.where(overlay[:, :, 3] > 40)
|
||||
if xs.size:
|
||||
near = np.abs(xs - face_cx) <= max(2, int(w * 0.02))
|
||||
col_ys = ys[near] if near.any() else ys[np.argsort(np.abs(xs - face_cx))[:20]]
|
||||
best_center = (int(round(face_cx)), int(round(float(col_ys.mean()))))
|
||||
return {"images": images, "best_center": best_center}
|
||||
# best_centers:首个选中发型三档(middle/high/low)发际线中点
|
||||
if best_centers is None:
|
||||
best_centers = {lv: _center_of(overlays[lv]) for lv in _TEXTURE_DIRS}
|
||||
return {"images": images, "best_centers": best_centers}
|
||||
|
||||
|
||||
def generate_grow_b(marked_bgr: np.ndarray, use_mask: bool = True, prompt: str = None):
|
||||
|
||||
Reference in New Issue
Block a user