Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa00daf91d | ||
|
|
81054174c2 |
@@ -0,0 +1,208 @@
|
|||||||
|
import os, sys, time, shlex, subprocess, shutil, requests, cv2, numpy as np
|
||||||
|
from PIL import Image
|
||||||
|
import platform,json,redis
|
||||||
|
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)
|
||||||
|
#检测文件并且下载处理文件
|
||||||
|
check_pid_file(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" -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)
|
||||||
Reference in new issue
Block a user