建模程序 多个定时程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

219 lines
9.3 KiB

import os, sys, time, shlex, subprocess, shutil, requests, cv2, numpy as np
from PIL import Image
import platform,json,redis
import tools_to_xmps
if platform.system() == 'Windows':
sys.path.append('e:\\libs\\')
#sys.path.append('libs')
else:
sys.path.append('/data/deploy/make3d/make2/libs/')
import config, libs, libs_db,main_service_db
# 2. 手动操作建模做成建模
# 2.0 检测是否存在项目,不存在就下载,存在就清除项目其它无用的文件
# 2.1 初始化工程, 根据参数 加入 photo1 或者 photo 2 的 照片, 对齐 , 导出坐标, 将坐标复制到 另外一个文件夹, 测距, 重建区域, 然后调用step2
#根据pid 检测是否存在项目,不存在就下载,存在就清除项目其它无用的文件
def check_pid_file(pid):
#检测是否存在目录
path = os.path.join(config.workdir, pid)
# if os.path.exists(path):
# shutil.rmtree(path)
if not os.path.exists(path):
#不存在就在就下载目录
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 开始计算相机位姿...')
start_time = time.time()
libs.down_from_oss(config.oss_bucket, config.workdir, pid)
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} 图片下载完成,共费时{libs.diff_time(start_time)}')
else:
#存在的话就检测是否有photo1 和 photo2 之外的目录或者文件,有的话就删除
for file in os.listdir(path):
if file != 'photo1' and file != 'photo2':
if os.path.isfile(os.path.join(path, file)):
os.remove(os.path.join(path, file))
else:
shutil.rmtree(os.path.join(path, file))
#判断photo1 和 photo2 目录里的文件是否存在xmp 文件,存在的话就删除
for file in os.listdir(os.path.join(path, 'photo1')):
if file.endswith('.xmp'):
os.remove(os.path.join(path, 'photo1', file))
for file in os.listdir(os.path.join(path, 'photo2')):
if file.endswith('.xmp'):
os.remove(os.path.join(path, 'photo2', file))
#根据参数初始化操作
def cmd_run(pid,usePhoto = "1",lock=False):
pid = str(pid)
#判断是否存在该目录
if os.path.exists(os.path.join(config.workdir, pid)) == False:
#下载照片
libs.down_from_oss(config.oss_bucket, config.workdir, pid)
else:
#移除文件夹
shutil.rmtree(os.path.join(config.workdir, pid), ignore_errors=True)
#下载照片
libs.down_from_oss(config.oss_bucket, config.workdir, pid)
print(f"旋转图片:{pid}")
tools_to_xmps.rateImages(pid)
start_time = time.time()
#文件路径
photo1_path = os.path.join(config.workdir, pid, 'photo1')
photo2_path = os.path.join(config.workdir, pid, 'photo2')
#计算文件里的数量
#photos1_count = len(os.listdir(photo1_path))
photos2_count = len(os.listdir(photo2_path))
photosNums = photos2_count
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} photo2数量{photos2_count}')
#xmp 坐标是要用 lock的 还是 unlock 的
if lock:
exportxmp = ' -exportXMP "D:\\make2\\config\\exportXMP.config.lock.xml" '
else:
exportxmp = ' -exportXMP "D:\\make2\\config\\exportXMP.config.lock.xml" '
usePhoto = "photo1"
#执行命令
cmd = f'{config.rcbin} -setInstanceName "{pid}" \
-save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}"\
-addFolder "{os.path.join(config.workdir, pid, usePhoto)}" -set "sfmMaxFeatureReprojectionError=2" -selectAllImages \
-detectMarkers "D:\\make2\\config\\detectMarkers.config.xml" \
-align -align -align -align -align\
{exportxmp} \
-save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" -quit'
print(cmd)
cmd = shlex.split(cmd)
res = subprocess.run(cmd)
#根据参数转变路劲,复制photo1 里的xmp 文件到 photo2 里,或者 photo2 里的xmp 文件到 photo1 里
sourceFile = photo1_path
targetFile = photo2_path
if usePhoto == "photo2":
sourceFile = photo2_path
targetFile = photo1_path
#复制xmp文件
for xmp in os.listdir(sourceFile):
if xmp.endswith('.xmp'):
if usePhoto == "photo1":
shutil.copy(os.path.join(sourceFile, xmp), os.path.join(targetFile,xmp.replace('_1.xmp', '_8.xmp')))
if usePhoto == "photo2":
shutil.copy(os.path.join(sourceFile, xmp), os.path.join(targetFile,xmp.replace('_8.xmp', '_1.xmp')))
#如果是photo2的话,就要将photo2 的 xmp 重命名成 _8.xmp
if usePhoto == "photo2":
for xmp in os.listdir(sourceFile):
if xmp.endswith('.xmp'):
#重名名.xmp 结尾的文件
os.rename(os.path.join(sourceFile, xmp), os.path.join(sourceFile,xmp.replace('_1.xmp', '_8.xmp')))
print("坐标复制完成")
# exit()
#将两组图片进行重新对齐 然后重建区域
psid = libs.getPSid(pid)
# textpicCmd ='-selectImage "'+os.path.join(config.workdir,pid,'photo2')+'\*" -enableTexturingAndColoring true'
# textpicCmdFalse ='-selectImage "'+os.path.join(config.workdir,pid,'photo1')+'\*" -enableTexturingAndColoring false'
cmd = f'{config.rcbin} -setInstanceName {pid} \
-addFolder "{os.path.join(config.workdir, pid, "photo2")}" \
-detectMarkers "D:\\make2\\config\\detectMarkers.config.xml" {libs.get_defineDistances(psid)} -align -align -align \
-exportRegistration "D://{pid}/reg/{pid}_registration.out" "D://make2/config/registration_export_config.xml" -quit'
print(cmd)
cmd = shlex.split(cmd)
res = subprocess.run(cmd)
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} step1完成,共费时{libs.diff_time(start_time)}')
#遍历 D://{pid}/reg/ 目录下的文件
for file in os.listdir(os.path.join(config.workdir, pid, 'reg')):
if file.endswith('.jpg'):
#记录到文本文件中
print(f"记录文件:{file}")
with open(os.path.join(config.workdir, pid, 'reg', f'{pid}_imgList.txt'), 'a+') as f:
f.write(f"{os.path.join(config.workdir, pid, 'photo2', file)}\n")
alignNums = 0
#遍历 reg 目录 上传到oss 上制定的目录
for file in os.listdir(os.path.join(config.workdir, pid, 'reg')):
if not file.endswith('.jpg'):
print(f'上传文件:{file}')
config.oss_bucket.put_object_from_file(f'objs/auto/{pid}/repeat_build/{file}', os.path.join(config.workdir, pid, 'reg', file))
else:
alignNums += 1
print(f'上传文件:{file}')
#上传到指定的目录
config.oss_bucket.put_object_from_file(f'objs/auto/{pid}/repeat_build/jpgs/{file}', os.path.join(config.workdir, pid, 'reg', file))
print(f'影棚号:{psid} , PID:{pid},照片数量:{photosNums} 对齐的图片数量:{alignNums}')
if photosNums - alignNums >= 3 and psid != 9:
notify(f'影棚号:{psid} , PID:{pid},没有对齐,照片数量:{photosNums} 对齐的图片数量:{alignNums}')
#删除文件夹
shutil.rmtree(os.path.join(config.workdir, pid), ignore_errors=True)
return
#处理完成后塞入到指定的队列
r = create_redis_connection()
print("推入到重建队列")
r.rpush('ai:ai_repeat_build',pid)
#删除文件夹
shutil.rmtree(os.path.join(config.workdir, pid), ignore_errors=True)
def create_redis_connection():
"""创建 Redis 连接,若连接失败则重试"""
while True:
try:
r = redis.Redis(host="106.14.158.208", password="kcV2000", port=6379, db=6)
# 尝试进行一次操作,检查连接是否有效
r.ping() # ping 操作是一个简单的连接测试
print("Redis连接成功!")
return r
except ConnectionError:
print("Redis连接失败,正在重试...")
time.sleep(5)
def notify(content):
if content == "":
return "content 不能为空"
for user_agent_id in ["18950403426","13600957301"]:
data = {
'userId': user_agent_id,
'message': content,
}
headers = {'Content-Type': 'application/json'}
message_send_url = "https://mp.api.suwa3d.com/api/qyNotify/sendMessage?userId="+user_agent_id+"&message="+content
response = requests.post(message_send_url, data=json.dumps(data), headers=headers)
if __name__ == '__main__':
if len(sys.argv) == 2:
pids = sys.argv[1].split(',')
for pid in pids:
cmd_run(pid,usePhoto = "1",lock=False)
elif len(sys.argv) == 3:
pids = sys.argv[1].split(',')
for pid in pids:
if sys.argv[2] == '2':
cmd_run(pid,usePhoto = "2",lock=False)
else:
cmd_run(pid,usePhoto = "1",lock=False)
elif len(sys.argv) == 4:
pids = sys.argv[1].split(',')
usePhoto = sys.argv[2]
lock = sys.argv[3]
for pid in pids:
cmd_run(pid,usePhoto = usePhoto,lock=lock)
else:
print(f'useage: python {sys.argv[0]} pid1,pid2,pid3 photo = 1/2 lock = True/False')
sys.exit(1)