diff --git a/odm_preprocess.py b/odm_preprocess.py index 69ce291..7aebb6c 100644 --- a/odm_preprocess.py +++ b/odm_preprocess.py @@ -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) diff --git a/odm_preprocess_fast.py b/odm_preprocess_fast.py index 79a95d8..0d09d76 100644 --- a/odm_preprocess_fast.py +++ b/odm_preprocess_fast.py @@ -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) diff --git a/post_pro/merge_obj.py b/post_pro/merge_obj.py index 1b3a0ec..1a34688 100644 --- a/post_pro/merge_obj.py +++ b/post_pro/merge_obj.py @@ -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,12 +267,22 @@ class MergeObj: # 读取并更新MTL内容 materials = self.read_mtl(files['mtl']) - updated_materials = self.update_mtl_content( - materials, - texture_map, - grid_id - ) - all_materials.update(updated_materials) + 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, + grid_id + ) + all_materials.update(updated_materials) # 写入合并后的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("\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") - try: - if os.path.exists(final_obj): - os.remove(final_obj) - os.rename(merged_obj, final_obj) - except Exception as e: - self.logger.warning(f"重命名最终文件失败: {str(e)}") - shutil.copy2(merged_obj, final_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 = [] # 记录所有中间文件 + + 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: - os.remove(merged_obj) - except: - pass - - # 清理所有临时文件 - for temp_file in temp_files: - if os.path.exists(temp_file): + if os.path.exists(final_obj): + os.remove(final_obj) + os.rename(merged_obj, final_obj) + except Exception as e: + self.logger.warning(f"重命名最终文件失败: {str(e)}") + shutil.copy2(merged_obj, final_obj) try: - os.remove(temp_file) - except Exception as e: - self.logger.warning( - f"删除临时文件失败: {temp_file}, 错误: {str(e)}") + os.remove(merged_obj) + except: + pass - # 计算中心点经纬度 - center_lon, center_lat = self.get_center_coordinates(all_vertices) - self.logger.info(f"模型中心点经纬度: ({center_lon}, {center_lat})") + # 清理所有临时文件 + for temp_file in temp_files: + 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 diff --git a/utils/odm_monitor.py b/utils/odm_monitor.py index 32a62f8..e5d33b1 100644 --- a/utils/odm_monitor.py +++ b/utils/odm_monitor.py @@ -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)