Browse Source

新影棚的对齐程序

master
dongchangxi 12 months ago
parent
commit
6f8f34c4ac
  1. BIN
      data/0.jpg
  2. 168
      new_studio_to_reg/get_new_studio_reg_info.py
  3. 185
      new_studio_to_reg/tools_to_xmps.py
  4. 33
      test/test.py
  5. 4
      tools/push_cmd.py

BIN
data/0.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

168
new_studio_to_reg/get_new_studio_reg_info.py

@ -0,0 +1,168 @@
import os, sys, time, shutil, subprocess, shlex, json,oss2,redis
import platform
if platform.system() == 'Windows':
sys.path.append('e:\\libs\\')
else:
sys.path.append('/data/deploy/make3d/make2/libs/')
import tools_to_xmps
import config, libs, libs_db
def get_xmps(psid,pid):
#从共享盘上下载对齐信息,判断是否有
print(f"判断是否存在 {os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture')} -- {os.path.exists(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture'))}")
if os.path.exists(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture')) == False:
# #从oss上下载对齐信息
# prefix = f'xmps_new_studio_rate/{psid}/mesh/'
# filelist = oss2.ObjectIteratorV2(config.oss_bucket, prefix=prefix)
# for file in filelist:
# if file.key.endswith('.xmp'):
# filename = file.key.split('/')[-1]
# print('正在下载:', file.key)
# # os.makedirs(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'mesh'), exist_ok=True)
# config.oss_bucket.get_object_to_file(file.key, os.path.join(config.sharedir,'xmps_new_studio_rate', 'mesh', filename))
prefix = f'xmps_new_studio_rate/{psid}/texture/'
filelist = oss2.ObjectIteratorV2(config.oss_bucket, prefix=prefix)
for file in filelist:
if file.key.endswith('.xmp'):
filename = file.key.split('/')[-1]
print('正在下载:', file.key)
# os.makedirs(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture'), exist_ok=True)
config.oss_bucket.get_object_to_file(file.key, os.path.join(config.sharedir,'xmps_new_studio_rate', 'texture', filename))
#将共享盘的对齐信息复制到工作目录,photo1 和 photo2
# shutil.copytree(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'mesh'), os.path.join(config.workdir, pid, 'photo1'),dirs_exist_ok=True)
shutil.copytree(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture'), os.path.join(config.workdir, pid, 'photo2'),dirs_exist_ok=True)
else:
#将共享盘的对齐信息复制到工作目录,photo1 和 photo2
# shutil.copytree(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'mesh'), os.path.join(config.workdir, pid, 'photo1'),dirs_exist_ok=True)
shutil.copytree(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture'), os.path.join(config.workdir, pid, 'photo2'),dirs_exist_ok=True)
print('下载xmps完成')
#获取photo2 的对齐信息
def get_photo2_align_info(pid):
pid = str(pid)
psid = libs.getPSid(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"影棚号:{psid} , {config.oss_bucket.object_exists(f'xmps_new_studio_rate/{psid}/')}")
filename = f'xmps_new_studio_rate/{psid}/{psid}.rcbox'
isRate = False
if not config.oss_bucket.object_exists(filename):
#提示是否进行 xmps_new_studio_rate 文件夹的创建
yes_or_not = input('当前该影棚没有对应的对齐坐标,是否创建?(y/n)')
if yes_or_not == 'y':
tools_to_xmps.create_rate_xmps(pid)
isRate = True
else:
sys.exit(0)
#旋转图片
if isRate == False:
print(f"旋转图片:{pid}")
tools_to_xmps.rateImages(pid)
#下载对齐信息
get_xmps(psid,pid)
#执行对齐指令
cmd = f'{config.rcbin} {config.r2["init"]} -setInstanceName {pid} \
-save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" \
-addFolder "{os.path.join(config.workdir, pid, "photo2")}" \
-align -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)
#遍历 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")
#遍历 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}/new_studio_align_info/{file}', os.path.join(config.workdir, pid, 'reg', file))
else:
print(f'上传文件:{file}')
#上传到指定的目录
config.oss_bucket.put_object_from_file(f'objs/auto/{pid}/new_studio_align_info/jpgs/{file}', os.path.join(config.workdir, pid, 'reg', file))
#处理完成后塞入到指定的队列
r = create_redis_connection()
r.rpush('ai:ai_build_mesh',pid)
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)
if __name__ == '__main__':
start = time.time()
if len(sys.argv) == 2:
pids = sys.argv[1]
for pid in pids.split(','):
get_photo2_align_info(pid)
print(f'{pid}共费时{time.time() - start}')
else:
r = create_redis_connection() # 使用重连函数来创建连接
while True:
try:
if r.llen('ai:new_studio_for_align_info') == 0:
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"-没有查询到任务在队列中,等待10s在查询")
time.sleep(10)
continue
pid = r.lpop('ai:new_studio_for_align_info')
#判断是否为空
if pid is None:
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+"-读取的PID为空")
continue
#判断是否为数字
try:
pid = int(pid.decode('utf-8'))
except Exception as e:
print(f'pid:{pid} 不是数字')
continue
#执行任务
get_photo2_align_info(pid)
print(f'{pid}共费时{time.time() - start}')
continue
except Exception as e:
print(f'出现异常:{e}')
time.sleep(30)
r = create_redis_connection()
continue

185
new_studio_to_reg/tools_to_xmps.py

@ -0,0 +1,185 @@
import os, sys, time, shutil, subprocess, shlex, json,oss2
from PIL import Image
import platform
if platform.system() == 'Windows':
sys.path.append('e:\\libs\\')
else:
sys.path.append('/data/deploy/make3d/make2/libs/')
import config, libs, libs_db
#检测是否存在 rate_xmps 文件,如果没有则要创建该影棚对应的rate_xmps文件
def check_rate_xmps(pid):
pid = str(pid)
psid = libs.getPSid(pid)
#判断是否存在该目录
if config.oss_bucket.object_exists(f'xmps_new_studio_rate/{psid}/') == False:
return False
return True
def clearExifAndRotate(imagePath, rotate=180):
if os.path.exists(imagePath) == False:
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {imagePath} 图片不存在')
return
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {imagePath} 图片exif信息清除并且旋转...')
# img = Image.open(imagePath)
# print(img.info)
# # 清除 EXIF 信息
# img.info = {} # 清除 EXIF 信息
# # 旋转图片 180 度
# img = img.rotate(180)
# # 保存处理后的图片
# img.save(imagePath)
# 打开图像
with Image.open(imagePath) as img:
# 使用RGB模式打开图像来丢弃可能存在的EXIF信息
img = img.convert("RGB")
img = img.rotate(180)
# 保存图像,保存时不会带有原始的任何元数据
img.save(imagePath, quality=100) # 对于JPEG,可以调整质量参数
#如果老影棚没有做过旋转坐标的照片的,则要做一次旋转坐标
def rateImages(pid):
#遍历文件夹下的所有图片
photo1_path = os.path.join(config.workdir, pid, 'photo1')
photo2_path = os.path.join(config.workdir, pid, 'photo2')
for pic in os.listdir(photo1_path):
if pic.endswith('.jpg'):
#清除图片exif信息, 旋转图片 180度
clearExifAndRotate(os.path.join(photo1_path, pic))
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pic} 图片exif信息清除并且旋转完成')
for pic in os.listdir(photo2_path):
if pic.endswith('.jpg'):
#清除图片exif信息, 旋转图片 180度
clearExifAndRotate(os.path.join(photo2_path, pic))
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pic} 图片exif信息清除并且旋转完成')
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} 图片exif信息清除并且旋转完成')
def upload_xmp(pid):
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 上传xmp文件之前先删除oss上的xmps_rate文件所在目录...')
pid = str(pid)
psid = libs.getPSid(pid)
#移除掉旧的文件夹
#config.oss_bucket.delete_object(f'xmps/{pid}/')
#删除oss 上的文件夹里的内容
#判断是否存在该目录
if config.oss_bucket.object_exists(f'xmps_new_studio_rate/{psid}/') == True:
object_list = oss2.ObjectIterator(config.oss_bucket, prefix=f'xmps_new_studio_rate/{psid}/')
if not any(object_list):
config.oss_bucket.batch_delete_objects([obj.key for obj in object_list])
start_time = time.time()
workdir = os.path.join(config.workdir, pid)
config.oss_bucket.put_object_from_file(f'xmps_new_studio_rate/{psid}/{psid}.rcbox', os.path.join(workdir, f'{pid}.rcbox'))
# for xmp in os.listdir(os.path.join(workdir, 'photo1')):
# if xmp.endswith('.xmp'):
# config.oss_bucket.put_object_from_file(f'xmps_new_studio_rate/{psid}/mesh/{xmp}', os.path.join(workdir, 'photo1', xmp))
# #复制一份到共享盘上的 libs xmps psid 文件夹下
# #判断是否有对应的文件夹,不存在就创建
# os.makedirs(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'mesh'), exist_ok=True)
# shutil.copy(os.path.join(workdir, 'photo1', xmp), os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'mesh', xmp))
for xmp in os.listdir(os.path.join(workdir, 'photo2')):
if xmp.endswith('.xmp'):
config.oss_bucket.put_object_from_file(f'xmps_new_studio_rate/{psid}/texture/{xmp}', os.path.join(workdir, 'photo2', xmp))
#复制一份到共享盘上的 libs xmps psid 文件夹下
os.makedirs(os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture'), exist_ok=True)
shutil.copy(os.path.join(workdir, 'photo2', xmp), os.path.join(config.sharedir, 'xmps_new_studio_rate', psid, 'texture', xmp))
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} xmp文件上传完成,共费时{time.time() - start_time}')
#创建rate_xmps文件
def create_rate_xmps(pid):
start_time = time.time()
pid = str(pid)
psid = libs.getPSid(pid)
#判断是否存在xmps_rate文件夹
flag = check_rate_xmps(pid)
if flag == True:
# 提示输入指令是否要重新做rate_xmps文件
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} xmps_new_studio_rate文件已经存在,是否重新生成rate_xmps文件?')
continue_or_not = input('是否重新生成xmps_new_studio_rate文件?(y/n)')
if continue_or_not == 'y':
pass
else:
sys.exit(0)
#判断是否有对应的 photo1 和 photo2 文件夹
# photo1_path = os.path.join(config.workdir, pid, 'photo1')
photo2_path = os.path.join(config.workdir, pid, 'photo2')
#判断是否存在目录
if os.path.exists(photo2_path) == False:
#重新下载图片文件photo1和photo2
libs.down_from_oss(config.oss_bucket, config.workdir, pid)
#photos1_count = len(os.listdir(photo1_path))
photos2_count = len(os.listdir(photo2_path))
if photos2_count < 21:
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} photo2数量{photos2_count},未能覆盖所有相机,是否继续计算相机位姿?')
continue_or_not = input('是否继续计算相机位姿?(y/n)')
if continue_or_not == 'y':
pass
else:
sys.exit(0)
#清除图片exif信息, 旋转图片 180度
rateImages(pid)
#通过rc 计算出 xmps 文件
exportxmp = ' -exportXMP "D:\\make2\\config\\exportXMP.config.xml" '
cmd = f'{config.rcbin} {config.r2["init"]} -setInstanceName {pid} \
-save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" \
-addFolder "{os.path.join(config.workdir, pid, "photo2")}" -selectAllImages \
-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)
# TODO:加入report相机位姿质量评估
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} photo1相机位姿完成,共费时{libs.diff_time(start_time)}')
# for xmp in os.listdir(photo1_path):
# if xmp.endswith('.xmp'):
# shutil.copy(os.path.join(photo1_path, xmp), os.path.join(photo2_path, xmp.replace('_1.xmp', '_8.xmp')))
# psid = libs.getPSid(pid)
# cmd = f'{config.rcbin} {config.r2["init"]} -setInstanceName {pid} \
# -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" {config.r["setTextureFalse"]} \
# -addFolder "{os.path.join(config.workdir, pid, "photo2")}" -selectAllImages \
# -detectMarkers "D:\\make2\\config\\detectMarkers.config.xml" \
# {libs.get_defineDistances(psid)} -update -align -align {config.r2["setRegion"]} \
# {exportxmp} \
# -exportReconstructionRegion "{os.path.join(config.workdir, pid, f"{pid}.rcbox")}" \
# -save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}"'
# print(cmd)
# cmd = shlex.split(cmd)
# res = subprocess.run(cmd)
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} photo2相机位姿完成,共费时{libs.diff_time(start_time)}')
upload_or_not = input('是否上传oss?(y/n)')
if upload_or_not == 'y':
upload_xmp(pid)
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} rate_xmps文件生成完成,共费时{libs.diff_time(start_time)}')
if __name__ == '__main__':
pid = sys.argv[1]
print(f'执行任务的pid: {pid}')
create_rate_xmps(pid)

33
test/test.py

@ -0,0 +1,33 @@
import requests
#url
#循环100次
for i in range(100):
url = "https://mp.api.suwa3d.com/api/oss/putSignURL?key_name=photos/233522/photo2/"+str(i)+".jpg"
#请求url
res = requests.get(url)
#打印结果
print(res.text)
#转json
res_json = res.json()
ossUrl = res_json['data']
print(f"当前是第几个:{i}, ossUrl: {ossUrl}")
# data 是一个 oss 的上传连接, 向这个上传连接发送一个文件
# 上传文件
try:
#with open("E:/microservice/make2/data/0.jpg", 'rb') as f:
file = open('E:/microservice/make2/data/0.jpg', 'rb')
response = requests.put(ossUrl, data=file, headers={"Content-Type": "application/octet-stream"})
print(response.status_code)
if response.status_code == 200:
upload_is_ok = True
else:
print(f"上传图片异常,状态码: {response.status_code}")
except RequestException as e:
print(f"上传异常: {str(e)}")
# file = open('E:/microservice/make2/data/0.jpg', 'rb')
# res = requests.put(ossUrl, data=file)
# print(res.text)
# url = "https://mp.api.suwa3d.com/api/oss/putSignURL?key_name=objs/photos/233522/a.jpg"

4
tools/push_cmd.py

@ -1,7 +1,7 @@
import redis, os, sys,requests,platform,json import redis, os, sys,requests,platform,json
if platform.system() == 'Windows': if platform.system() == 'Windows':
sys.path.append('E:\\make2\\libs\\') #sys.path.append('E:\\make2\\libs\\')
#sys.path.append('libs') sys.path.append('libs')
else: else:
sys.path.append('/data/deploy/make3d/make2/libs/') sys.path.append('/data/deploy/make3d/make2/libs/')
import config, libs,libs_db,libs_db_task_rc import config, libs,libs_db,libs_db_task_rc

Loading…
Cancel
Save