From 81054174c2a711da4afd7363da70a448bbbee75d Mon Sep 17 00:00:00 2001 From: dongchangxi <458593490@qq.com> Date: Tue, 11 Feb 2025 16:01:31 +0800 Subject: [PATCH] 1 --- old_to_new_build/get_reg_info_by_self.py | 208 +++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 old_to_new_build/get_reg_info_by_self.py diff --git a/old_to_new_build/get_reg_info_by_self.py b/old_to_new_build/get_reg_info_by_self.py new file mode 100644 index 0000000..dc2f5a6 --- /dev/null +++ b/old_to_new_build/get_reg_info_by_self.py @@ -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) \ No newline at end of file