diff --git a/post_pro/conv_obj.py b/post_pro/conv_obj.py index 6e67655..b7af753 100644 --- a/post_pro/conv_obj.py +++ b/post_pro/conv_obj.py @@ -147,6 +147,14 @@ class ConvertOBJ: y = float(parts[2]) + (north_offset - self.ref_north) z = float(parts[3]) f_out.write(f'v {x:.6f} {z:.6f} {-y:.6f}\n') + elif line.startswith('vn '): # 处理法线向量 + parts = line.split() + nx = float(parts[1]) + ny = float(parts[2]) + nz = float(parts[3]) + # 同步反转法线的 Y 轴 + new_line = f"vn {nx} {nz} {-ny}\n" + f_out.write(new_line) else: # 其他行直接写入 f_out.write(line) diff --git a/utils/odm_monitor.py b/utils/odm_monitor.py index f754b1a..3f5d7d2 100644 --- a/utils/odm_monitor.py +++ b/utils/odm_monitor.py @@ -29,38 +29,42 @@ class ODMProcessMonitor: 2. 产品文件是否有效 """ project_dir = os.path.join(grid_dir, 'project') - + # 根据不同模式检查不同的产品 if self.mode == "快拼模式": # 只检查正射影像 # if not self._check_orthophoto(project_dir): # return False pass - + elif self.mode == "三维模式": # 检查点云和实景三维 if not all([ - os.path.exists(os.path.join(project_dir, 'odm_georeferencing', 'odm_georeferenced_model.laz')), - os.path.exists(os.path.join(project_dir, 'odm_texturing', 'odm_textured_model_geo.obj')) + os.path.exists(os.path.join( + project_dir, 'odm_georeferencing', 'odm_georeferenced_model.laz')), + os.path.exists(os.path.join( + project_dir, 'odm_texturing', 'odm_textured_model_geo.obj')) ]): self.logger.error("点云或实景三维文件夹未生成") return False - + # TODO: 添加点云和实景三维的质量检查 - + elif self.mode == "重建模式": # 检查所有产品 if not all([ - os.path.exists(os.path.join(project_dir, 'odm_georeferencing', 'odm_georeferenced_model.laz')), - os.path.exists(os.path.join(project_dir, 'odm_texturing', 'odm_textured_model_geo.obj')) + os.path.exists(os.path.join( + project_dir, 'odm_georeferencing', 'odm_georeferenced_model.laz')), + os.path.exists(os.path.join( + project_dir, 'odm_texturing', 'odm_textured_model_geo.obj')) ]): self.logger.error("部分必要的文件夹未生成") return False - + # 检查正射影像 # if not self._check_orthophoto(project_dir): # return False - + # TODO: 添加点云和实景三维的质量检查 return True @@ -68,8 +72,9 @@ class ODMProcessMonitor: # TODO 正射影像怎么检查最好 def _check_orthophoto(self, project_dir: str) -> bool: """检查正射影像的质量""" - ortho_path = os.path.join(project_dir, 'odm_orthophoto', 'odm_orthophoto.original.tif') - + ortho_path = os.path.join( + project_dir, 'odm_orthophoto', 'odm_orthophoto.original.tif') + if not os.path.exists(ortho_path): self.logger.error("正射影像文件未生成") return False @@ -130,7 +135,7 @@ class ODMProcessMonitor: error_msg = "" max_retries = 3 current_try = 0 - + # 根据模式设置是否使用lowest quality use_lowest_quality = self.mode == "快拼模式" @@ -150,8 +155,8 @@ class ODMProcessMonitor: f"--max-concurrency 15 " f"--force-gps " f"--use-exif " - f"--use-hybrid-bundle-adjustment " - f"--optimize-disk-space " + # f"--use-hybrid-bundle-adjustment " + # f"--optimize-disk-space " # f"--feature-quality ultra " ) @@ -169,7 +174,7 @@ class ODMProcessMonitor: if self.mode == "快拼模式": docker_command += ( - #f"--fast-orthophoto " + # f"--fast-orthophoto " f"--skip-3dmodel " ) # elif self.mode == "三维模式": @@ -180,11 +185,19 @@ class ODMProcessMonitor: docker_command += "--rerun-all" self.logger.info(docker_command) - result = subprocess.run( + process = subprocess.Popen( docker_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # TODO 关闭process,内存堆积 - stdout, stderr = result.stdout.decode( - 'utf-8'), result.stderr.decode('utf-8') + logging.info(f"进程{process.pid}开始执行") + stdout, stderr = process.communicate() + stdout = stdout.decode('utf-8') + stderr = stderr.decode('utf-8') + # 关闭process,防止内存堆积 + process.terminate() + return_code = process.poll() # 获取进程返回码,如果返回 None 说明进程仍在运行 + if return_code is None: + logging.info(f"进程{process.pid}仍在运行") + else: + logging.info(f"进程{process.pid}已被关闭,返回码:{return_code}.") stdout_lines = stdout.strip().split('\n') last_lines = '\n'.join(