修改obj的法向量,subprocess.Popen
This commit is contained in:
parent
30a451a19b
commit
105d113e4b
@ -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)
|
||||
|
@ -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(
|
||||
|
Loading…
Reference in New Issue
Block a user