结果后处理修改
This commit is contained in:
parent
40fad13aca
commit
cd36dcb6e9
50
main.py
Normal file
50
main.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import argparse
|
||||||
|
from datetime import timedelta
|
||||||
|
from odm_preprocess import PreprocessConfig, ImagePreprocessor
|
||||||
|
|
||||||
|
def parse_args():
|
||||||
|
parser = argparse.ArgumentParser(description='ODM预处理工具')
|
||||||
|
|
||||||
|
# 必需参数
|
||||||
|
parser.add_argument('--image_dir', required=True, help='输入图片目录路径')
|
||||||
|
parser.add_argument('--output_dir', required=True, help='输出目录路径')
|
||||||
|
|
||||||
|
# 可选参数
|
||||||
|
parser.add_argument('--mode', default='重建模式', choices=['快拼模式', '三维模式', '重建模式'], help='处理模式')
|
||||||
|
parser.add_argument('--grid_size', type=float, default=1000, help='网格大小(米)')
|
||||||
|
parser.add_argument('--grid_overlap', type=float, default=0.05, help='网格重叠率')
|
||||||
|
parser.add_argument('--produce_dem', action='store_true', help='是否生成DEM')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
return args
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = parse_args()
|
||||||
|
|
||||||
|
# 创建配置
|
||||||
|
config = PreprocessConfig(
|
||||||
|
image_dir=args.image_dir,
|
||||||
|
output_dir=args.output_dir,
|
||||||
|
mode=args.mode,
|
||||||
|
grid_size=args.grid_size,
|
||||||
|
grid_overlap=args.grid_overlap,
|
||||||
|
produce_dem=args.produce_dem,
|
||||||
|
|
||||||
|
# 其他参数使用默认值
|
||||||
|
cluster_eps=0.01,
|
||||||
|
cluster_min_samples=5,
|
||||||
|
time_group_overlap_threshold=0.7,
|
||||||
|
time_group_interval=timedelta(minutes=5),
|
||||||
|
filter_distance_threshold=0.001,
|
||||||
|
filter_min_neighbors=6,
|
||||||
|
filter_grid_size=0.001,
|
||||||
|
filter_dense_distance_threshold=10,
|
||||||
|
filter_time_threshold=timedelta(minutes=5),
|
||||||
|
)
|
||||||
|
|
||||||
|
# 创建处理器并执行
|
||||||
|
processor = ImagePreprocessor(config)
|
||||||
|
processor.process()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -247,17 +247,68 @@ class ImagePreprocessor:
|
|||||||
merger.merge_grid_obj(grid_points, translations)
|
merger.merge_grid_obj(grid_points, translations)
|
||||||
|
|
||||||
def post_process(self, successful_grid_points: Dict[tuple, pd.DataFrame], grid_points: Dict[tuple, pd.DataFrame], translations: Dict[tuple, tuple]):
|
def post_process(self, successful_grid_points: Dict[tuple, pd.DataFrame], grid_points: Dict[tuple, pd.DataFrame], translations: Dict[tuple, tuple]):
|
||||||
|
"""后处理:合并或复制处理结果"""
|
||||||
if len(successful_grid_points) == 1:
|
if len(successful_grid_points) == 1:
|
||||||
self.logger.info(f"只有一个网格{successful_grid_points.keys()},无需合并")
|
# 获取唯一成功的网格ID
|
||||||
self.logger.info(f"生产结果请在{successful_grid_points.keys()[0]}目录下查看")
|
grid_id = list(successful_grid_points.keys())[0]
|
||||||
|
self.logger.info(f"只有一个网格 {grid_id} 成功处理,直接复制结果")
|
||||||
|
|
||||||
|
# 构建源目录路径(成功网格的输出目录)
|
||||||
|
src_dir = os.path.join(
|
||||||
|
self.config.output_dir, f"grid_{grid_id[0]}_{grid_id[1]}", "project")
|
||||||
|
|
||||||
|
# 复制正射影像
|
||||||
|
if self.config.mode == "快拼模式":
|
||||||
|
shutil.copy2(os.path.join(src_dir, "odm_orthophoto", "odm_orthophoto.original.tif"),
|
||||||
|
os.path.join(self.config.output_dir,
|
||||||
|
"orthophoto.tif")
|
||||||
|
)
|
||||||
|
elif self.config.mode == "三维模式":
|
||||||
|
shutil.copy2(os.path.join(src_dir, "odm_georeferencing", "odm_georeferenced_model.laz"),
|
||||||
|
os.path.join(self.config.output_dir,
|
||||||
|
"pointcloud.laz")
|
||||||
|
)
|
||||||
|
shutil.copytree(os.path.join(src_dir, "odm_texturing"),
|
||||||
|
os.path.join(self.config.output_dir, "texturing"))
|
||||||
|
elif self.config.mode == "重建模式":
|
||||||
|
shutil.copy2(os.path.join(src_dir, "odm_orthophoto", "odm_orthophoto.tif"),
|
||||||
|
os.path.join(self.config.output_dir,
|
||||||
|
"orthophoto.tif")
|
||||||
|
)
|
||||||
|
shutil.copy2(os.path.join(src_dir, "odm_georeferencing", "odm_georeferenced_model.laz"),
|
||||||
|
os.path.join(self.config.output_dir,
|
||||||
|
"odm_georeferenced_model.laz")
|
||||||
|
)
|
||||||
|
shutil.copytree(os.path.join(src_dir, "odm_texturing"),
|
||||||
|
os.path.join(self.config.output_dir, "texturing"))
|
||||||
|
if self.config.produce_dem:
|
||||||
|
shutil.copy2(
|
||||||
|
os.path.join(src_dir, "odm_dem", "dsm.tif"),
|
||||||
|
os.path.join(self.config.output_dir, "dsm.tif")
|
||||||
|
)
|
||||||
|
shutil.copy2(
|
||||||
|
os.path.join(src_dir, "odm_dem", "dtm.tif"),
|
||||||
|
os.path.join(self.config.output_dir, "dtm.tif")
|
||||||
|
)
|
||||||
|
|
||||||
|
self.logger.info("单网格结果复制完成")
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# 如果有多个网格,执行合并操作
|
||||||
elif len(successful_grid_points) < len(grid_points):
|
elif len(successful_grid_points) < len(grid_points):
|
||||||
self.logger.warning(
|
self.logger.warning(
|
||||||
f"有 {len(grid_points) - len(successful_grid_points)} 个网格处理失败,"
|
f"有 {len(grid_points) - len(successful_grid_points)} 个网格处理失败,"
|
||||||
f"将只合并成功处理的 {len(successful_grid_points)} 个网格"
|
f"将只合并成功处理的 {len(successful_grid_points)} 个网格"
|
||||||
)
|
)
|
||||||
self.merge_tif(successful_grid_points, self.config.produce_dem)
|
|
||||||
if self.config.mode != "快拼模式":
|
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_obj(successful_grid_points, translations)
|
||||||
|
else:
|
||||||
|
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)
|
||||||
|
|
||||||
@ -286,8 +337,8 @@ class ImagePreprocessor:
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# 创建配置
|
# 创建配置
|
||||||
config = PreprocessConfig(
|
config = PreprocessConfig(
|
||||||
image_dir=r"G:\test_data\error1_L",
|
image_dir=r"E:\datasets\UAV\134\project\images",
|
||||||
output_dir=r"G:\ODM_output\error1_L",
|
output_dir=r"G:\ODM_output\134",
|
||||||
|
|
||||||
cluster_eps=0.01,
|
cluster_eps=0.01,
|
||||||
cluster_min_samples=5,
|
cluster_min_samples=5,
|
||||||
@ -307,7 +358,7 @@ if __name__ == "__main__":
|
|||||||
grid_overlap=0.05,
|
grid_overlap=0.05,
|
||||||
|
|
||||||
|
|
||||||
mode="重建模式",
|
mode="快拼模式",
|
||||||
produce_dem=False,
|
produce_dem=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ class MergePly:
|
|||||||
|
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'all_inputs': " ".join(laz_files),
|
'all_inputs': " ".join(laz_files),
|
||||||
'output': os.path.join(self.output_dir, 'merged_pointcloud.laz')
|
'output': os.path.join(self.output_dir, 'pointcloud.laz')
|
||||||
}
|
}
|
||||||
|
|
||||||
subprocess.run('D:\\software\\LAStools\\bin\\lasmerge64.exe -i {all_inputs} -o "{output}"'.format(**kwargs))
|
subprocess.run('D:\\software\\LAStools\\bin\\lasmerge64.exe -i {all_inputs} -o "{output}"'.format(**kwargs))
|
||||||
|
@ -175,7 +175,7 @@ class MergeObj:
|
|||||||
all_face_materials.append(material_map2.get(material))
|
all_face_materials.append(material_map2.get(material))
|
||||||
|
|
||||||
# 写入合并后的obj文件,使用与MTL文件相同的名称
|
# 写入合并后的obj文件,使用与MTL文件相同的名称
|
||||||
mtl_filename = "merged_model.mtl" # 使用固定的MTL文件名
|
mtl_filename = "textured_model.mtl" # 使用固定的MTL文件名
|
||||||
self.write_obj(output_path, all_vertices, all_tex_coords, all_normals,
|
self.write_obj(output_path, all_vertices, all_tex_coords, all_normals,
|
||||||
all_faces, all_face_materials, mtl_filename)
|
all_faces, all_face_materials, mtl_filename)
|
||||||
self.logger.info(f"模型合并成功,已保存至: {output_path}")
|
self.logger.info(f"模型合并成功,已保存至: {output_path}")
|
||||||
@ -273,7 +273,7 @@ class MergeObj:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# 创建输出目录
|
# 创建输出目录
|
||||||
output_model_dir = os.path.join(self.output_dir, "merged_model")
|
output_model_dir = os.path.join(self.output_dir, "texturing")
|
||||||
os.makedirs(output_model_dir, exist_ok=True)
|
os.makedirs(output_model_dir, exist_ok=True)
|
||||||
|
|
||||||
# 获取所有有效的网格文件
|
# 获取所有有效的网格文件
|
||||||
@ -323,7 +323,7 @@ class MergeObj:
|
|||||||
all_materials.update(updated_materials)
|
all_materials.update(updated_materials)
|
||||||
|
|
||||||
# 写入合并后的MTL文件
|
# 写入合并后的MTL文件
|
||||||
final_mtl = os.path.join(output_model_dir, "merged_model.mtl")
|
final_mtl = os.path.join(output_model_dir, "textured_model.mtl")
|
||||||
with open(final_mtl, 'w') as f:
|
with open(final_mtl, 'w') as f:
|
||||||
for mat_name, content in all_materials.items():
|
for mat_name, content in all_materials.items():
|
||||||
f.write(f"newmtl {mat_name}\n")
|
f.write(f"newmtl {mat_name}\n")
|
||||||
@ -353,7 +353,7 @@ class MergeObj:
|
|||||||
merged_obj = temp_output
|
merged_obj = temp_output
|
||||||
|
|
||||||
# 最终结果
|
# 最终结果
|
||||||
final_obj = os.path.join(output_model_dir, "merged_model.obj")
|
final_obj = os.path.join(output_model_dir, "textured_model.obj")
|
||||||
try:
|
try:
|
||||||
if os.path.exists(final_obj):
|
if os.path.exists(final_obj):
|
||||||
os.remove(final_obj)
|
os.remove(final_obj)
|
||||||
@ -377,8 +377,8 @@ class MergeObj:
|
|||||||
|
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"模型合并完成,输出目录: {output_model_dir}\n"
|
f"模型合并完成,输出目录: {output_model_dir}\n"
|
||||||
f"- OBJ文件: merged_model.obj\n"
|
f"- OBJ文件: textured_model.obj\n"
|
||||||
f"- MTL文件: merged_model.mtl\n"
|
f"- MTL文件: textured_model.mtl\n"
|
||||||
f"- 纹理文件: {len(os.listdir(output_model_dir)) - 2}个"
|
f"- 纹理文件: {len(os.listdir(output_model_dir)) - 2}个"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -94,11 +94,11 @@ class ODMProcessMonitor:
|
|||||||
self.logger.error(f"检查正射影像时发生错误: {str(e)}")
|
self.logger.error(f"检查正射影像时发生错误: {str(e)}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def run_odm_with_monitor(self, grid_dir: str, grid_id: tuple, fast_mode: bool = True, produce_dem: bool = False) -> Tuple[bool, str]:
|
def run_odm_with_monitor(self, grid_dir: str, grid_id: tuple, produce_dem: bool = False) -> Tuple[bool, str]:
|
||||||
"""运行ODM命令"""
|
"""运行ODM命令"""
|
||||||
if produce_dem and fast_mode:
|
# if produce_dem and self.mode == "快拼模式":
|
||||||
self.logger.error("快拼模式下无法生成DEM,请调整生产参数")
|
# self.logger.error("快拼模式下无法生成DEM,请调整生产参数")
|
||||||
return False, "快拼模式下无法生成DEM,请调整生产参数"
|
# return False, "快拼模式下无法生成DEM,请调整生产参数"
|
||||||
|
|
||||||
self.logger.info(f"开始处理网格 ({grid_id[0]},{grid_id[1]})")
|
self.logger.info(f"开始处理网格 ({grid_id[0]},{grid_id[1]})")
|
||||||
success = False
|
success = False
|
||||||
@ -136,11 +136,15 @@ class ODMProcessMonitor:
|
|||||||
f"--dtm "
|
f"--dtm "
|
||||||
)
|
)
|
||||||
|
|
||||||
if fast_mode:
|
if self.mode == "快拼模式":
|
||||||
docker_command += (
|
docker_command += (
|
||||||
f"--fast-orthophoto "
|
#f"--fast-orthophoto "
|
||||||
f"--skip-3dmodel "
|
f"--skip-3dmodel "
|
||||||
)
|
)
|
||||||
|
elif self.mode == "三维模式":
|
||||||
|
docker_command += (
|
||||||
|
f"--skip-orthophoto "
|
||||||
|
)
|
||||||
|
|
||||||
docker_command += "--rerun-all"
|
docker_command += "--rerun-all"
|
||||||
self.logger.info(docker_command)
|
self.logger.info(docker_command)
|
||||||
@ -224,7 +228,6 @@ class ODMProcessMonitor:
|
|||||||
success, error_msg = self.run_odm_with_monitor(
|
success, error_msg = self.run_odm_with_monitor(
|
||||||
grid_dir=grid_dir,
|
grid_dir=grid_dir,
|
||||||
grid_id=grid_id,
|
grid_id=grid_id,
|
||||||
fast_mode=(self.mode == "快拼模式"),
|
|
||||||
produce_dem=produce_dem
|
produce_dem=produce_dem
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user