修改单个grid处理obj的bug
This commit is contained in:
parent
34f19c430b
commit
817fadd8cd
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user