修改单个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.extract_gps()
self.cluster() self.cluster()
self.filter_isolated_points() self.filter_isolated_points()
self.filter_time_group_overlap() # self.filter_time_group_overlap()
# self.filter_alternate_images() # self.filter_alternate_images()
grid_points, translations = self.divide_grids() grid_points, translations = self.divide_grids()
self.copy_images(grid_points) self.copy_images(grid_points)

View File

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

View File

@ -193,17 +193,6 @@ class MergeObj:
Returns: Returns:
Tuple[float, float]: (longitude, latitude)中心点经纬度坐标 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: try:
# 创建输出目录 # 创建输出目录
output_model_dir = os.path.join(self.output_dir, "texturing") output_model_dir = os.path.join(self.output_dir, "texturing")
@ -227,7 +216,7 @@ class MergeObj:
# 获取所有有效的网格文件 # 获取所有有效的网格文件
grid_files = {} grid_files = {}
all_vertices = [] # 用于存储所有顶点坐标 grid_centers = [] # 用于存储每个grid的中心点坐标
for grid_id, points in grid_points.items(): for grid_id, points in grid_points.items():
base_dir = os.path.join( base_dir = os.path.join(
self.output_dir, self.output_dir,
@ -256,9 +245,11 @@ class MergeObj:
'dir': base_dir 'dir': base_dir
} }
# 读取obj文件的顶点坐标 # 读取obj文件的顶点坐标并计算当前grid的中心点
vertices, _, _, _, _, _ = self.read_obj(modified_obj) 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: if not grid_files:
self.logger.error("没有找到有效的文件") self.logger.error("没有找到有效的文件")
@ -276,12 +267,22 @@ class MergeObj:
# 读取并更新MTL内容 # 读取并更新MTL内容
materials = self.read_mtl(files['mtl']) materials = self.read_mtl(files['mtl'])
updated_materials = self.update_mtl_content( if len(grid_files) == 1:
materials, # 对于单个grid直接使用update_mtl_content的结果
texture_map, updated_materials = self.update_mtl_content(
grid_id materials,
) texture_map,
all_materials.update(updated_materials) grid_id
)
all_materials.update(updated_materials)
else:
# 对于多个grid使用原有的处理逻辑
updated_materials = self.update_mtl_content(
materials,
texture_map,
grid_id
)
all_materials.update(updated_materials)
# 写入合并后的MTL文件 # 写入合并后的MTL文件
final_mtl = os.path.join(output_model_dir, "textured_model.mtl") final_mtl = os.path.join(output_model_dir, "textured_model.mtl")
@ -292,50 +293,72 @@ class MergeObj:
f.write(f"{line}\n") f.write(f"{line}\n")
f.write("\n") f.write("\n")
# 合并OBJ文件
reference_id = list(grid_files.keys())[0]
merged_obj = grid_files[reference_id]['obj']
temp_files = [] # 记录所有中间文件
for grid_id, files in list(grid_files.items())[1:]:
# 生成临时输出文件名
temp_output = os.path.join(
output_model_dir,
f"temp_merged_{int(time.time())}.obj"
)
temp_files.append(temp_output) # 添加到临时文件列表
self.merge_two_objs(
merged_obj, files['obj'], temp_output, reference_id, grid_id)
merged_obj = temp_output
# 最终结果 # 最终结果
final_obj = os.path.join(output_model_dir, "textured_model.obj") final_obj = os.path.join(output_model_dir, "textured_model.obj")
try:
if os.path.exists(final_obj): if len(grid_files) == 1:
os.remove(final_obj) # 对于单个grid需要修改obj文件中的材质引用
os.rename(merged_obj, final_obj) grid_id = list(grid_files.keys())[0]
except Exception as e: src_obj = grid_files[grid_id]['obj']
self.logger.warning(f"重命名最终文件失败: {str(e)}")
shutil.copy2(merged_obj, final_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 = [] # 记录所有中间文件
for grid_id, files in list(grid_files.items())[1:]:
# 生成临时输出文件名
temp_output = os.path.join(
output_model_dir,
f"temp_merged_{int(time.time())}.obj"
)
temp_files.append(temp_output) # 添加到临时文件列表
self.merge_two_objs(
merged_obj, files['obj'], temp_output, reference_id, grid_id)
merged_obj = temp_output
# 重命名最终文件
try: try:
os.remove(merged_obj) if os.path.exists(final_obj):
except: os.remove(final_obj)
pass os.rename(merged_obj, final_obj)
except Exception as e:
# 清理所有临时文件 self.logger.warning(f"重命名最终文件失败: {str(e)}")
for temp_file in temp_files: shutil.copy2(merged_obj, final_obj)
if os.path.exists(temp_file):
try: try:
os.remove(temp_file) os.remove(merged_obj)
except Exception as e: except:
self.logger.warning( pass
f"删除临时文件失败: {temp_file}, 错误: {str(e)}")
# 计算中心点经纬度 # 清理所有临时文件
center_lon, center_lat = self.get_center_coordinates(all_vertices) for temp_file in temp_files:
self.logger.info(f"模型中心点经纬度: ({center_lon}, {center_lat})") if os.path.exists(temp_file):
try:
os.remove(temp_file)
except Exception as e:
self.logger.warning(
f"删除临时文件失败: {temp_file}, 错误: {str(e)}")
# 计算所有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 return center_lon, center_lat

View File

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