修改单个grid处理obj的bug

This commit is contained in:
weixin_46229132 2025-02-10 13:13:23 +08:00
parent 34f19c430b
commit 817fadd8cd
4 changed files with 90 additions and 67 deletions

View File

@ -291,7 +291,7 @@ class ImagePreprocessor:
self.extract_gps()
self.cluster()
self.filter_isolated_points()
self.filter_time_group_overlap()
# self.filter_time_group_overlap()
# self.filter_alternate_images()
grid_points, translations = self.divide_grids()
self.copy_images(grid_points)

View File

@ -278,10 +278,10 @@ class ImagePreprocessor:
if self.config.mode == "快拼模式":
self.merge_tif(successful_grid_points, self.config.produce_dem)
elif self.config.mode == "三维模式":
self.merge_ply(successful_grid_points)
# self.merge_ply(successful_grid_points)
self.merge_obj(successful_grid_points, translations)
else:
# self.merge_tif(successful_grid_points, self.config.produce_dem)
self.merge_tif(successful_grid_points, self.config.produce_dem)
# self.merge_ply(successful_grid_points)
self.merge_obj(successful_grid_points, translations)
@ -291,7 +291,7 @@ class ImagePreprocessor:
self.extract_gps()
self.cluster()
self.filter_isolated_points()
self.filter_time_group_overlap()
# self.filter_time_group_overlap()
# self.filter_alternate_images()
grid_points, translations = self.divide_grids()
# self.copy_images(grid_points)

View File

@ -193,17 +193,6 @@ class MergeObj:
Returns:
Tuple[float, float]: (longitude, latitude)中心点经纬度坐标
"""
if len(grid_points) == 1:
grid_id = list(grid_points.keys())[0]
shutil.copytree(os.path.join(self.output_dir,
f"grid_{grid_id[0]}_{grid_id[1]}",
"project",
"odm_texturing"),
os.path.join(self.output_dir, "texturing"))
os.rename(os.path.join(self.output_dir, "texturing", "odm_textured_model_geo.obj"),
os.path.join(self.output_dir, "texturing", "textured_model.obj"))
return
try:
# 创建输出目录
output_model_dir = os.path.join(self.output_dir, "texturing")
@ -227,7 +216,7 @@ class MergeObj:
# 获取所有有效的网格文件
grid_files = {}
all_vertices = [] # 用于存储所有顶点坐标
grid_centers = [] # 用于存储每个grid的中心点坐标
for grid_id, points in grid_points.items():
base_dir = os.path.join(
self.output_dir,
@ -256,9 +245,11 @@ class MergeObj:
'dir': base_dir
}
# 读取obj文件的顶点坐标
# 读取obj文件的顶点坐标并计算当前grid的中心点
vertices, _, _, _, _, _ = self.read_obj(modified_obj)
all_vertices.extend(vertices)
grid_center_lon, grid_center_lat = self.get_center_coordinates(vertices)
grid_centers.append((grid_center_lon, grid_center_lat))
self.logger.info(f"网格 ({grid_id[0]},{grid_id[1]}) 中心点经纬度: ({grid_center_lon}, {grid_center_lat})")
if not grid_files:
self.logger.error("没有找到有效的文件")
@ -276,6 +267,16 @@ class MergeObj:
# 读取并更新MTL内容
materials = self.read_mtl(files['mtl'])
if len(grid_files) == 1:
# 对于单个grid直接使用update_mtl_content的结果
updated_materials = self.update_mtl_content(
materials,
texture_map,
grid_id
)
all_materials.update(updated_materials)
else:
# 对于多个grid使用原有的处理逻辑
updated_materials = self.update_mtl_content(
materials,
texture_map,
@ -292,7 +293,29 @@ class MergeObj:
f.write(f"{line}\n")
f.write("\n")
# 合并OBJ文件
# 最终结果
final_obj = os.path.join(output_model_dir, "textured_model.obj")
if len(grid_files) == 1:
# 对于单个grid需要修改obj文件中的材质引用
grid_id = list(grid_files.keys())[0]
src_obj = grid_files[grid_id]['obj']
# 读取源obj文件内容
vertices, tex_coords, normals, faces, face_materials, _ = self.read_obj(src_obj)
# 更新材质名称,添加网格前缀
updated_face_materials = []
for mat in face_materials:
if mat: # 如果材质名不为空
updated_face_materials.append(f"material_{grid_id[0]}_{grid_id[1]}_{mat}")
else:
updated_face_materials.append(mat)
# 写入新的obj文件
self.write_obj(final_obj, vertices, tex_coords, normals, faces, updated_face_materials, "textured_model.mtl")
else:
# 合并多个OBJ文件
reference_id = list(grid_files.keys())[0]
merged_obj = grid_files[reference_id]['obj']
temp_files = [] # 记录所有中间文件
@ -310,8 +333,7 @@ class MergeObj:
merged_obj = temp_output
# 最终结果
final_obj = os.path.join(output_model_dir, "textured_model.obj")
# 重命名最终文件
try:
if os.path.exists(final_obj):
os.remove(final_obj)
@ -333,9 +355,10 @@ class MergeObj:
self.logger.warning(
f"删除临时文件失败: {temp_file}, 错误: {str(e)}")
# 计算中心点经纬度
center_lon, center_lat = self.get_center_coordinates(all_vertices)
self.logger.info(f"模型中心点经纬度: ({center_lon}, {center_lat})")
# 计算所有grid中心点的平均值作为整体中心点
center_lon = sum(center[0] for center in grid_centers) / len(grid_centers)
center_lat = sum(center[1] for center in grid_centers) / len(grid_centers)
self.logger.info(f"模型整体中心点经纬度: ({center_lon}, {center_lat})")
return center_lon, center_lat

View File

@ -169,10 +169,10 @@ class ODMProcessMonitor:
#f"--fast-orthophoto "
f"--skip-3dmodel "
)
elif self.mode == "三维模式":
docker_command += (
f"--skip-orthophoto "
)
# elif self.mode == "三维模式":
# docker_command += (
# f"--skip-orthophoto "
# )
docker_command += "--rerun-all"
self.logger.info(docker_command)