优化眼镜填空

This commit is contained in:
hesuicong committed 2026-11-09 11:42:05 +08:00
1 parent 6f7805c78d
commit 38c0b9948a
3 files changed
+1902 -165

No files matched your search

File diff suppressed because it is too large. Load diff
+48 -3
View File
@@ -58,6 +58,7 @@ class FillMeshGenerator:
if in_idx: if in_idx:
self.IN_IDX = in_idx self.IN_IDX = in_idx
self.report = [] self.report = []
self.lens_mask = None
def log(self, s): def log(self, s):
"""日志记录""" """日志记录"""
@@ -401,12 +402,10 @@ class FillMeshGenerator:
return gz1, gz2, fz, bz, have_g1, have_g2, have_f, have_b, g1f, W, H return gz1, gz2, fz, bz, have_g1, have_g2, have_f, have_b, g1f, W, H
# ======================================================================
# 步骤 3: 构建足迹 mask 与填充区域 R
# ======================================================================
def build_footprint(self, g1f): def build_footprint(self, g1f):
"""构建眼镜足迹 mask 和填充区域 R""" """构建眼镜足迹 mask 和填充区域 R"""
self.log("== 3. 眼镜足迹 / 填充区域 R ==") self.log("== 3. 眼镜足迹 / 填充区域 R ==")
self.lens_mask = None # <-- 新增: 初始化
mask = g1f.copy() mask = g1f.copy()
# 取主分量 # 取主分量
@@ -451,6 +450,18 @@ class FillMeshGenerator:
mask &= ~cut mask &= ~cut
self.log(f" 中央区剪除(两镜片开口之间, 开口底缘 y>{self.Y0 + y_cut * self.RES:.1f} 以下): " self.log(f" 中央区剪除(两镜片开口之间, 开口底缘 y>{self.Y0 + y_cut * self.RES:.1f} 以下): "
f"剔除 {n_cut} 格误标鼻面") f"剔除 {n_cut} 格误标鼻面")
# ===== 新增: 创建 lens_mask =====
self.lens_mask = np.zeros(mask.shape, bool)
for pts in big_holes[:2]:
for p in pts:
self.lens_mask[p[0], p[1]] = True
for _ in range(2): # 腐蚀 2 格
_nm = self.lens_mask.copy()
_nm[1:, :] &= self.lens_mask[:-1, :]; _nm[:-1, :] &= self.lens_mask[1:, :]
_nm[:, 1:] &= self.lens_mask[:, :-1]; _nm[:, :-1] &= self.lens_mask[:, 1:]
self.lens_mask = _nm
# ================================
else: else:
self.log(" ! 未找到两个镜片开口, 跳过中央区剪除") self.log(" ! 未找到两个镜片开口, 跳过中央区剪除")
@@ -501,6 +512,39 @@ class FillMeshGenerator:
R[j, i] = True R[j, i] = True
self.log(f" R: {R.sum()} 格 ({R.sum()*self.RES*self.RES:.2f} 面积单位), " self.log(f" R: {R.sum()} 格 ({R.sum()*self.RES*self.RES:.2f} 面积单位), "
f"触碰窗口边界={touch} (触碰=侧墙切在头内部, 正常)") f"触碰窗口边界={touch} (触碰=侧墙切在头内部, 正常)")
# ===== [抽取自原版] R 裁剪到眼镜真实轮廓 =====
_sil = g1f.copy()
for _ in range(6):
_sm = _sil.copy()
_sm[1:, :] |= _sil[:-1, :]; _sm[:-1, :] |= _sil[1:, :]
_sm[:, 1:] |= _sil[:, :-1]; _sm[:, :-1] |= _sil[:, 1:]
_sm[1:, 1:] |= _sil[:-1, :-1]; _sm[:-1, :-1] |= _sil[1:, 1:]
_sm[1:, :-1] |= _sil[:-1, 1:]; _sm[:-1, 1:] |= _sil[1:, :-1]
_sil = _sm
_sil = _sil | self.flood_outside(_sil)
for _ in range(6):
_sm = _sil.copy()
_sm[1:, :] &= _sil[:-1, :]; _sm[:-1, :] &= _sil[1:, :]
_sm[:, 1:] &= _sil[:, :-1]; _sm[:, :-1] &= _sil[:, 1:]
_sm[1:, 1:] &= _sil[:-1, :-1]; _sm[:-1, :-1] &= _sil[1:, 1:]
_sm[1:, :-1] &= _sil[:-1, 1:]; _sm[:-1, 1:] &= _sil[1:, :-1]
_sil = _sm
if self.lens_mask is not None:
_lexr = self.lens_mask.copy()
for _ in range(2):
_sm = _lexr.copy()
_sm[1:, :] |= _lexr[:-1, :]; _sm[:-1, :] |= _lexr[1:, :]
_sm[:, 1:] |= _lexr[:, :-1]; _sm[:, :-1] |= _lexr[:, 1:]
_sm[1:, 1:] |= _lexr[:-1, :-1]; _sm[:-1, :-1] |= _lexr[1:, 1:]
_sm[1:, :-1] |= _lexr[:-1, 1:]; _sm[:-1, 1:] |= _lexr[1:, :-1]
_lexr = _sm
_sil = _sil | _lexr
_nclip = int((R & ~_sil).sum())
R &= _sil
self.log(f" R 裁剪到眼镜轮廓: 剔除轮廓外 {_nclip} 格, R={R.sum()} 格")
# ===========================================
if R.sum() < 200: if R.sum() < 200:
raise SystemExit("R 过小") raise SystemExit("R 过小")
@@ -644,6 +688,7 @@ class FillMeshGenerator:
hb = np.minimum(hb, hf - self.GAP_MIN) hb = np.minimum(hb, hf - self.GAP_MIN)
hb = self.smooth_valid(hb, R, sigma=2.0, it=2) hb = self.smooth_valid(hb, R, sigma=2.0, it=2)
# 外扩填充 NaN # 外扩填充 NaN
for _ in range(60): for _ in range(60):
nanm = ~np.isfinite(hf) nanm = ~np.isfinite(hf)
File diff suppressed because it is too large. Load diff