解决一些数据兼容问题

This commit is contained in:
hesuicong committed 2026-11-11 15:34:43 +08:00
1 parent 200e13a7ba
commit abb81f6bfd
2 files changed
+89 -4

No files matched your search

+27
View File
@@ -84,3 +84,30 @@ fill2sc/fill_preview.png
fill2sc/fill_report.txt fill2sc/fill_report.txt
.gitignore .gitignore
fill2sc/index.txt fill2sc/index.txt
fill2sc/data/20261102/20261102_glasses_vertices.txt
fill2sc/data/20261102/20261102_glasses.blend
fill2sc/data/20261102/20261102.mtl
fill2sc/data/20261102/20261102.zip
fill2sc/data/20261102/20261102Tex1.jpg
fill2sc/data/20261102/fill_20261102_preview.png
fill2sc/data/20261102/index.txt
fill2sc/data/631230/631230_glasses_vertices.txt
fill2sc/data/631230/631230_glasses.blend
fill2sc/data/631230/631230.jpg
fill2sc/data/631230/631230.mtl
fill2sc/data/631230/631230.zip
fill2sc/data/631230/fill_631230_preview.png
fill2sc/data/631230/index.txt
fill2sc/data/632723/632723.jpg
fill2sc/data/632723/632723.mtl
fill2sc/data/632723/fill_632723_preview.png
fill2sc/data/632723/fill_preview.png
fill2sc/data/632723/fill_report.txt
fill2sc/data/632723/index.txt
fill2sc/data/636394/636394_glasses_vertices.txt
fill2sc/data/636394/636394_glasses.blend
fill2sc/data/636394/636394.jpg
fill2sc/data/636394/636394.mtl
fill2sc/data/636394/636394.zip
fill2sc/data/636394/fill_636394_preview.png
fill2sc/data/636394/index.txt
+62 -4
View File
@@ -92,9 +92,9 @@ class FillMeshGenerator:
OUT_PREVIEW = "fill_preview.png" OUT_PREVIEW = "fill_preview.png"
RES = 0.1 # 栅格分辨率 RES = 0.1 # 栅格分辨率
X0, X1 = -10.2, 10.2 X0, X1 = -16.0, 16.0 # 原来 -10.2, 10.2 → 扩大到覆盖 x[-13.61, 13.19]
Y0, Y1 = 9.2, 19.8 Y0, Y1 = 0.0, 62.0
RY0, RY1 = 9.7, 19.3 # 填充区域 y 裁剪(只处理正面眼镜部分) RY0, RY1 = 1.0, 61.0
SEP = 0.25 # 区分前后表面的最小 z 间距 SEP = 0.25 # 区分前后表面的最小 z 间距
FLUSH = 0.15 # 填充前表面距镜框前面的距离(与镜框平齐, 留嵌入余量) FLUSH = 0.15 # 填充前表面距镜框前面的距离(与镜框平齐, 留嵌入余量)
EMBED_BOT = 0.8 # 填充底面嵌入脸部深度 EMBED_BOT = 0.8 # 填充底面嵌入脸部深度
@@ -103,7 +103,7 @@ class FillMeshGenerator:
CLAMP_BACK = 0.3 # 距最后表面的安全距离(防穿出后脑) CLAMP_BACK = 0.3 # 距最后表面的安全距离(防穿出后脑)
GAP_MIN = 0.25 # 填充最小厚度 GAP_MIN = 0.25 # 填充最小厚度
SIGMA = 2.0 # 高度场平滑 sigma(格) SIGMA = 2.0 # 高度场平滑 sigma(格)
ERODE = 2 # 足迹腐蚀(格) 0.2, 与膨胀0.3配合净外扩0.1(补偿边界平滑收缩) ERODE = 4 # 足迹腐蚀(格) 0.2, 与膨胀0.3配合净外扩0.1(补偿边界平滑收缩)
BSTEP = 0.18 # 边界重采样步长 BSTEP = 0.18 # 边界重采样步长
BITER = 25 # 边界 Laplacian 平滑迭代 BITER = 25 # 边界 Laplacian 平滑迭代
BLAM = 0.6 # 边界平滑系数 BLAM = 0.6 # 边界平滑系数
@@ -873,6 +873,22 @@ class FillMeshGenerator:
self.log(f" 填充厚度: min {np.nanmin(thickm):.2f}, 中位 {np.nanmedian(thickm):.2f}, " self.log(f" 填充厚度: min {np.nanmin(thickm):.2f}, 中位 {np.nanmedian(thickm):.2f}, "
f"mean {np.nanmean(thickm):.2f}, max {np.nanmax(thickm):.2f}") f"mean {np.nanmean(thickm):.2f}, max {np.nanmax(thickm):.2f}")
# # ===== 新增:高度场平滑(三角化前)=====
# # 只对填充区域 R 内部做平滑,不影响边界
# from scipy.ndimage import gaussian_filter
# hf_smooth = hf.copy()
# hb_smooth = hb.copy()
# # 前表面平滑(sigma=1.0 对应 1 格半径,即约 0.1 单位的空间平滑)
# hf_smooth[R] = gaussian_filter(np.where(R, hf, 0), sigma=1.0, mode='reflect')[R]
# # 后表面平滑
# hb_smooth[R] = gaussian_filter(np.where(R, hb, 0), sigma=1.0, mode='reflect')[R]
# # 用平滑后的值替换
# hf = hf_smooth
# hb = hb_smooth
# # ===== 结束新增 =====
return hf, hb, frame_band, wall_zone, gz1f, bzs, real_f, fz return hf, hb, frame_band, wall_zone, gz1f, bzs, real_f, fz
# ====================================================================== # ======================================================================
@@ -1696,6 +1712,43 @@ class FillMeshGenerator:
print("报告已写入 fill_report.txt") print("报告已写入 fill_report.txt")
# ======================================================================
# 诊断工具
# ======================================================================
def diagnose_indices(obj_path, idx_path):
"""诊断索引文件是否匹配模型"""
gen = FillMeshGenerator()
V, F = gen.parse_obj(obj_path)
idx = np.loadtxt(idx_path, dtype=np.int64) - 1
# 检查索引范围
print(f"顶点总数: {len(V)}")
print(f"索引总数: {len(idx)}")
print(f"索引范围: {idx.min()} ~ {idx.max()}")
print(f"超出范围的索引: {(idx >= len(V)).sum()}")
# 检查眼镜顶点坐标范围
glasses_V = V[idx]
print(f"\n眼镜顶点坐标范围:")
print(f" x: [{glasses_V[:,0].min():.2f}, {glasses_V[:,0].max():.2f}]")
print(f" y: [{glasses_V[:,1].min():.2f}, {glasses_V[:,1].max():.2f}]")
print(f" z: [{glasses_V[:,2].min():.2f}, {glasses_V[:,2].max():.2f}]")
# 检查是否在栅格化窗口内
gen2 = FillMeshGenerator()
in_window = (
(glasses_V[:,0] > gen2.X0) & (glasses_V[:,0] < gen2.X1) &
(glasses_V[:,1] > gen2.Y0) & (glasses_V[:,1] < gen2.Y1)
)
print(f"\n在栅格化窗口内的顶点: {in_window.sum()} / {len(idx)}")
print(f" 窗口范围: x[{gen2.X0}, {gen2.X1}], y[{gen2.Y0}, {gen2.Y1}]")
# 检查眼镜面数
ism = np.zeros(len(V), bool)
ism[idx] = True
face_g = ism[F].any(1)
print(f"\n眼镜面数: {face_g.sum()} / {len(F)}")
# ====================================================================== # ======================================================================
# 入口 # 入口
# ====================================================================== # ======================================================================
@@ -1707,9 +1760,14 @@ if __name__ == "__main__":
help="眼镜顶点索引文件路径 (默认: index.txt)") help="眼镜顶点索引文件路径 (默认: index.txt)")
parser.add_argument("--out_fill", type=str, default="fill_mesh.obj", parser.add_argument("--out_fill", type=str, default="fill_mesh.obj",
help="输出填充网格文件路径 (默认: fill_mesh.obj)") help="输出填充网格文件路径 (默认: fill_mesh.obj)")
parser.add_argument("--diagnose", action="store_true",
help="仅运行诊断,不生成填充网格")
args = parser.parse_args() args = parser.parse_args()
if args.diagnose:
diagnose_indices(args.in_obj, args.in_idx)
else:
gen = FillMeshGenerator( gen = FillMeshGenerator(
in_obj=args.in_obj, in_obj=args.in_obj,
in_idx=args.in_idx, in_idx=args.in_idx,