diff --git a/建模碎片步骤.txt b/doc/建模碎片步骤.txt similarity index 100% rename from 建模碎片步骤.txt rename to doc/建模碎片步骤.txt diff --git a/export_build_info/__pycache__/export_already_build.cpython-310.pyc b/export_build_info/__pycache__/export_already_build.cpython-310.pyc deleted file mode 100644 index fd97af8..0000000 Binary files a/export_build_info/__pycache__/export_already_build.cpython-310.pyc and /dev/null differ diff --git a/export_build_info/already.txt b/export_build_info/already.txt deleted file mode 100644 index e69de29..0000000 diff --git a/export_build_info/check.py b/export_build_info/check.py deleted file mode 100644 index df76b80..0000000 --- a/export_build_info/check.py +++ /dev/null @@ -1,125 +0,0 @@ -import os, sys, time, shlex, subprocess, shutil, requests, cv2, numpy as np -from PIL import Image -import platform,socket,atexit -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,common - -arrPids = [184219,184215,184209,184206,184201,184199,184164,184087,184076,184069,184059,184029,184013,183993,183952,183888,183882,183868,183824,183817,183815,183812,183791,183777,183715,183705,183670,183613,183573,182974,182983,182985,182989,182997,183007,183051,183060,183054,183053,183097,183119,183108,183139,183141,183155,183163,183169,183180,183191,183196,183214,183244,183266,183278,183275,183309,183402,183422,183440,182974,182964,182958,182956,182916,182855,182854,182820,182787,182800,182809,182780,182772,182770,182766,182754,182742,182740,182723,182707,182647,182643,182614,182595,182563,182557,182547,182546,182538,182530,182517,182498,182478,182452,182386,182352,182285,182266,182260,182230,182224] - -r12Pids = [184219,184215,184209,184069,184059,183868,183817,183791,183613,183573,182974,182983,182985,182989,182997,183007,183051,183060,183054,183053,183097,183119,183108,183139,183141,183155,183163,183169,183180,183191,183196,183214,183244,183266,183278,183275,183309,183402,183422,183440,182974,182964,182958,182855,182854] -print(f"处理的数据长度--{len(arrPids)}") -i=0 -noPids = '' -for pid in r12Pids: - pid = str(pid) - path = f"D://{pid}/mask" - #判断是否存在文件夹 - if not os.path.exists(path): - continue - - #判断文件夹是否为空 - if len(os.listdir(path)) == 0: - continue - - i+=1 - - - #检查 depth 和 mask 的文件创建时间是否差异比较大 - fileDepth = f"D://{pid}/depth" - fileMask = f"D://{pid}/mask" - - diffDepthTime = [] - dfffMaskTime = [] - - arrTimeDepth = [] - arrTimeMask = [] - for file in os.listdir(fileDepth): - createTime = os.path.getctime(f"{fileDepth}/{file}") - updateTime = os.path.getmtime(f"{fileDepth}/{file}") - # print(updateTime - createTime) - diffDepthTime.append(updateTime - createTime) - arrTimeDepth.append(os.path.getctime(f"{fileDepth}/{file}")) - - for file in os.listdir(fileMask): - createTime = os.path.getctime(f"{fileMask}/{file}") - updateTime = os.path.getmtime(f"{fileMask}/{file}") - dfffMaskTime.append(updateTime - createTime) - - arrTimeMask.append(os.path.getctime(f"{fileMask}/{file}")) - - #打印出 两者的 最大 和最小的时间信息 - print(f"pid: {pid} depth: { (max(arrTimeDepth) - min(arrTimeDepth))/60 }, diffdepth: {max(diffDepthTime)}, mask: { (max(arrTimeMask) - min(arrTimeMask))/60},diffmask: {max(dfffMaskTime)}") - # print(f"pid: {pid} diffdepth: {max(arrTimeDepth)} diffmask: {max(arrTimeMask)}") - - diffDepth = (max(arrTimeDepth) - min(arrTimeDepth))/60 - diffMask = (max(arrTimeMask) - min(arrTimeMask))/60 - - if diffDepth > 5 or diffMask > 5: - print(f"异常数据 pid: {pid} depth: {diffDepth} mask: {diffMask}") - break - - #复制文件到指定目录 - maskPath = f"D://{pid}/mask" - depthPath = f"D://{pid}/depth" - regPath = f"D://{pid}/reg" - imageList = f"D://{pid}/{pid}_imageList.txt" - outFila = f"D://{pid}/reg/{pid}_registration.out" - - sourcePath = f"D://model_info/{pid}" - if os.path.exists(sourcePath): - shutil.rmtree(sourcePath) - - if not os.path.exists(sourcePath): - os.makedirs(sourcePath) - - #复制文件 - shutil.copytree(maskPath, f"D://model_info/{pid}/mask") - shutil.copytree(depthPath, f"D://model_info/{pid}/depth") - shutil.copy(imageList, f"D://model_info/{pid}/{pid}_imageList.txt") - shutil.copy(outFila, f"D://model_info/{pid}/{pid}_registration.out") - - #遍历reg文件夹 - for file in os.listdir(regPath): - if file == f"{pid}_registration.out": - continue - - if "_1.jpg" in file: - sourceTempPath = f"D://model_info/{pid}/reg/photo1" - if not os.path.exists(sourceTempPath): - os.makedirs(sourceTempPath) - shutil.copy(f"{regPath}/{file}", f"{sourceTempPath}/{file}") - - if "_8.jpg" in file: - sourceTempPath = f"D://model_info/{pid}/reg/photo2" - if not os.path.exists(sourceTempPath): - os.makedirs(sourceTempPath) - shutil.copy(f"{regPath}/{file}", f"{sourceTempPath}/{file}") - - #shutil.copy(f"{regPath}/{file}", f"D://model_info/{pid}/reg/{file}") - - #移除 reg 里的 {pid}_registration.out - - - print(f"处理完成 pid: {pid}") - - - - - # shutil.copytree(f"D://{pid}", f"D://{pid}_bak") - - - - # cmd = f'{config.rcbin} {config.r2["init"]} -setInstanceName {pid} \ - # -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}"'# -quit - # print(cmd) - # cmd = shlex.split(cmd) - # res = subprocess.run(cmd) - - - - -#print(i) \ No newline at end of file diff --git a/export_build_info/err.pid b/export_build_info/err.pid deleted file mode 100644 index e69de29..0000000 diff --git a/export_build_info/finish.txt b/export_build_info/finish.txt deleted file mode 100644 index 4f0850d..0000000 --- a/export_build_info/finish.txt +++ /dev/null @@ -1,90 +0,0 @@ -146134 -146134 -146598 -183716 -185381 -183400 -187752 -184871 -184956 -185326 -187651 -187802 -187811 -187800 -183096 -187804 -184956 -187808 -187898 -187865 -187870 -187886 -187912 -185102 -185102 -185102 -187450 -185102 -187989 -188170 -188117 -188128 -188200 -188297 -188310 -188344 -185101 -188425 -188428 -188431 -188560 -188494 -188564 -188757 -188779 -188807 -188865 -188827 -188910 -188907 -188913 -188942 -188964 -189045 -189051 -189203 -189214 -189218 -189228 -189246 -189242 -189373 -189312 -189388 -189913 -189911 -189932 -189946 -189106 -186427 -186544 -190092 -190112 -188681 -190138 -188688 -189172 -183292 -189178 -184093 -183080 -189608 -189625 -189618 -189170 -189623 -190151 -183309 -190214 -188521 diff --git a/export_build_info/finished.txt b/export_build_info/finished.txt deleted file mode 100644 index e69de29..0000000 diff --git a/export_build_info/main_step1.py b/export_build_info/main_step1.py deleted file mode 100644 index ac4b257..0000000 --- a/export_build_info/main_step1.py +++ /dev/null @@ -1,340 +0,0 @@ -import os, sys, time, shlex, subprocess, shutil, requests, cv2, numpy as np -from PIL import Image -import platform,socket,atexit -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,common - -def filter_dark_texture_image(pid): - start_time = time.time() - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 开始检测射灯异常图片...') - def get_image_v(image): - # 图片左上角和右上角各取200*200区域,计算V通道均值 - left_rect = image[0:200, 0:200] - right_rect = image[0:200, -200:] - - left_hsv = cv2.cvtColor(left_rect, cv2.COLOR_BGR2HSV) - left_v = left_hsv[:, :, 2] - left_avg_v = np.mean(left_v) - # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 图片左上角V通道均值:{left_avg_v}') - - right_hsv = cv2.cvtColor(right_rect, cv2.COLOR_BGR2HSV) - right_v = right_hsv[:, :, 2] - right_avg_v = np.mean(right_v) - # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 图片右上角V通道均值:{right_avg_v}') - - return (left_avg_v + right_avg_v) / 2 - - v_list = [] - for filename in os.listdir(os.path.join(config.workdir, pid, 'photo2')): - if filename.endswith(".jpg"): - image = cv2.imread(os.path.join(config.workdir, pid, 'photo2', filename)) - v = get_image_v(image) - item = {'filename': filename, 'v': v} - v_list.append(item) - v_list.sort(key=lambda x: x['v']) - v_list = v_list[5: -5] - avg_v = np.mean([item['v'] for item in v_list]) - for item in v_list: - if abs(item['v'] - avg_v) > 50: - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 图片{item["filename"]} V通道值{item["v"]},低于平均值{avg_v},将不参与贴图') - libs.set_photo_join_type(config.workdir, pid, 'photo2', item['filename'].split('_')[0], mesh='1', texture='0') - - # 复制xmp文件到photo3目录,如果photo3目录存在的话 - if os.path.exists(os.path.join(config.workdir, pid, 'photo3')): - shutil.copyfile(os.path.join(config.workdir, pid, 'photo2', item['filename'].replace('jpg', 'xmp')), os.path.join(config.workdir, pid, 'photo3', item['filename'].replace('jpg', 'xmp'))) - - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 射灯异常图片检测完成,共费时{libs.diff_time(start_time)}') - -def detect_markers(psid, pid): - def fix_region(): - region_filename = os.path.join(config.workdir, pid, f'{pid}.rcbox') - with open(region_filename, 'r') as f: - lines = f.readlines() - lines = [line.replace('"NONE" globalCoordinateSystemWkt="NONE" globalCoordinateSystemName="NONE"', '"+proj=geocent +ellps=WGS84 +no_defs" globalCoordinateSystemName="local:1 - Euclidean"') for line in lines] - - start_time = time.time() - add_photo3 = ' ' - textpicCmd = ' ' - if os.path.exists(os.path.join(config.workdir, pid, 'photo3')): - add_photo3 = ' -addFolder "' + os.path.join(config.workdir, pid, 'photo3') + '" ' - - textpicCmd ='-selectImage "'+os.path.join(config.workdir,pid,'photo3')+'\*" -enableTexturingAndColoring true' - textpicCmd ='-selectImage "'+os.path.join(config.workdir,pid,'photo2')+'\*" -enableTexturingAndColoring false' - else: - textpicCmd ='-selectImage "'+os.path.join(config.workdir,pid,'photo2')+'\*" -enableTexturingAndColoring true' - - 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, "photo1")}" {config.r["setTextureFalse"]} -align -addFolder "{os.path.join(config.workdir, pid, "photo2")}" \ - {add_photo3} -align -selectAllImages \ - -detectMarkers "D:\\make2\\config\\detectMarkers.config.xml" \ - {libs.get_defineDistances(psid)} -align -align -update {config.r2["setRegion"]} \ - -exportXMP "D:\\make2\\config\\exportXMP.config.xml" \ - -exportControlPointsMeasurements "{os.path.join(config.workdir, pid, f"{pid}.controlPoints.csv")}" "D:\\make2\\config\\exportControlPoints.config.xml" \ - -exportReconstructionRegion "{os.path.join(config.workdir, pid, f"{pid}.rcbox")}" \ - {textpicCmd} -save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" -quit' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - time.sleep(3) - fix_region() - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 定位点检测完成, 共费时{libs.diff_time(start_time)}') - - if os.path.exists(os.path.join(config.workdir, pid, 'photo3')): - for filename in os.listdir(os.path.join(config.workdir, pid, 'photo2')): - if filename.endswith('_8.xmp'): - # photo3 exist, 设置photo2的xmp文件,不参与贴图 - libs.set_photo_join_type(config.workdir, pid, 'photo2', filename.split('_')[0], mesh='1', texture='0') - for filename in os.listdir(os.path.join(config.workdir, pid, 'photo3')): - if filename.endswith('_8.xmp'): - # photo3 exist, 设置photo3的xmp文件,不参与建模 - libs.set_photo_join_type(config.workdir, pid, 'photo3', filename.split('_')[0], mesh='0', texture='1') - -def step1(pid, experience=False, makeloop=True,task_distributed_id="",isNoColorTexture=""): - libs_db.start_task({"task_type": "make", "task_key": pid}) - - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 开始处理{pid}建模任务') - psid = libs.getPSid(pid) - - # 更新云端任务状态 - res = requests.post(config.urls['update_status_modeling_url'], data={'id': pid}) - print('更新建模中状态:', res.text) - - # 下载图片 - start_time = time.time() - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} 开始下载图片...') - libs.down_from_oss(config.oss_bucket, config.workdir, pid) - try: - if str(psid) == "86": - #移除指定文件 - os.remove(f"D:\{pid}\photo1\\21_1.jpg") - os.remove(f"D:\{pid}\photo2\\21_8.jpg") - if str(psid) == "29": - #移除指定文件 - os.remove(f"D:\{pid}\photo1\\15_1.jpg") - os.remove(f"D:\{pid}\photo2\\15_8.jpg") - except Exception as e: - print("移除异常") - - #旋转图片 - os.system(f'python D:\\make2\\photo2rotate.py -w d:\ -p {pid} -i photo1 -o photo1') - os.system(f'python D:\\make2\\photo2rotate.py -w d:\ -p {pid} -i photo2 -o photo2') - - os.system(f'python D:\\make2\\export_build_info\\gen_xmps_for_build_info.py {pid}') - #print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} 图片下载完成,共费时{libs.diff_time(start_time)}') - os.system(f'python main_step2.py {pid}') - # start_time = time.time() - # # TODO: 上报图片采集数量,更新影棚相机状态 - - # # 处理图片,如果experience=True,将图片缩减一半,已节省建模时间和算力成本 - # # if experience: - # # libs.resize_photos(os.path.join(config.workdir, pid, 'photo1')) - # # libs.resize_photos(os.path.join(config.workdir, pid, 'photo2')) - - # # 根据配置调整photo2曝光,均衡贴图亮度,可能产生photo3 - # libs.adjust_photos(config.workdir, pid) - - # # TODO: 检测模糊异常图片,上报微信通知 - # # TODO: 处理图片,去反光算法 - - # # 检测图片定位点,定位异常及时上报微信通知给客服人员,人工判断是否需要重新拍摄或更换地贴。定义定位点距离,导出相机位姿信息 - # detect_markers(psid, pid) - - # # 处理图片,检测photo2中的异常图片不参与贴图,以免破坏贴图效果,默认不检测射灯异常图片,以节省算力成本 - # if not makeloop: - # filter_dark_texture_image(pid) - - # # 处理图片,暗部提亮,提高贴图效果 - - # # TODO: 处理图片,去遮挡处理,提高建模与贴图质量 - - # # 加入photo2,计算重建区域,导出重建区域与相机位姿配置信息 - # # cal_reconstruction_region(psid, pid) - - # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} step1图片预处理完成,共费时{libs.diff_time(start_time)}') - - # if os.path.exists(os.path.join(config.sharedir, pid)): - # shutil.rmtree(os.path.join(config.sharedir, pid), ignore_errors=True) - # shutil.copytree(os.path.join(config.workdir, pid), os.path.join(config.sharedir, pid)) - # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} step1任务完成,移动到共享目录') - - - # #指定photo2某些图片不参与贴图 - # #是否不参与贴图,true 不参与贴图 - # if isNoColorTexture == "NoColorTexture": - # arrNoTextureColorPics = config.noTextureColorPics - # if arrNoTextureColorPics is not None and len(arrNoTextureColorPics) > 0: - # for camcerIndex in arrNoTextureColorPics: - # #拼装坐标文件名称 - # filename = os.path.join(config.sharedir, pid,"photo2",str(camcerIndex)+"_8.xmp") - # #判断文件是否存在 - # if os.path.exists(filename): - # #存在就设置不参与贴图 - # libs.set_photo_join_type(config.workdir, pid, 'photo2', camcerIndex, mesh='0', texture='0') - - - # #移除当前文件夹 - # shutil.rmtree(os.path.join(config.workdir, pid)) - # # TODO: 更新本地step1任务状态,加入step2任务队列 - # if task_distributed_id == "":#不是分布式任务的时候就自动往下个步骤走,是分布式任务的时候就就执行当前任务 - # if makeloop: - # os.system(f'python main_step2.py {pid}') - # else: - # os.system(f'python main_step2.py {pid}') - # # if os.path.exists(os.path.join(config.sharedir, pid)): - # # shutil.rmtree(os.path.join(config.sharedir, pid), ignore_errors=True) - # # shutil.move(os.path.join(config.workdir, pid), config.sharedir) - - # # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} step1任务完成,移动到共享目录') - # else: - # #分布式服务执行完后,需要更新任务状态,更新字表的finished_at字段 - # main_service_db.update_task_distributed_detail({"task_distributed_id":task_distributed_id,"finished_at":time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}) - # print("step1完成,休息6s") - # time.sleep(4) - # return - - -def main(pid, experience=False, makeloop=True,task_distributed_id="",isNoColorTexture=""): - if pid == '0': - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 开始进入本地任务值守模式...') - while True: - # 取云端redis多个key任务,TODO:后续要改为api调用 - experience = False - pid = libs_db.get_task('make_experience') - if pid == '': - time.sleep(3) - pid = libs_db.get_task('make') - if pid == '': - time.sleep(3) - continue - else: - experience = False - step1(pid, experience, makeloop,task_distributed_id,isNoColorTexture) - else: - step1(pid, experience, makeloop,task_distributed_id,isNoColorTexture) - - - -def is_already(pid): - - - #读取已经完成的pid - with open("D://make2/export_build_info/finished.txt", 'r') as f: - lines = f.readlines() - for line in lines: - print("line",str(line.strip())) - if str(pid) == str(line.strip()): - print("匹配成功") - return True - return False - -if __name__ == '__main__': - isNoColorTexture = "" - if len(sys.argv) == 2: - v = sys.argv[1] - - #判断是否是数字 - if v.isdigit(): - #print(f"正在处理输入的pid-{v}") - main(str(v), experience=False, makeloop=False,task_distributed_id="",isNoColorTexture=isNoColorTexture) - else: - filePath = f"D://make2/export_build_info/pids/{v}.txt" - if not os.path.exists(filePath): - print(f"{filePath} 文件不存在") - - strPids = "" - with open("D://make2/pid.text","r") as f: - lines = f.readlines() - for line in lines: - strPids = str(line.strip()) - - errPids = "" - with open("D://make2/errPid.text","r") as f: - lines = f.readlines() - for line in lines: - errPids = str(line.strip()) - - arrErrPids = errPids.split(",") - - arrPids = strPids.split(",") - ii = 0 - with open(filePath, 'r') as f: - lines = f.readlines() - for line in lines: - pid = str(line.strip()) - if pid == "": - break - - #判断是否存在了目录或者已经是处理过了 - # tempFile = f"D://{pid}//finish.txt" - # if os.path.exists(tempFile): - # continue - - if str(pid) in arrErrPids: - continue - - if str(pid) in arrPids: - # print(f"已处理过{pid}") - ii += 1 - continue - - print(f"正在处理{pid}- 完成{ii}") - main(str(pid), experience=False, makeloop=False,task_distributed_id="",isNoColorTexture=isNoColorTexture) - ii += 1 - print(f"已经完成-{ii}") - - - else: - print("cmd like python main_step1.py pid/单人/多人/双人/动物/人物") - - - - - # # 取云端redis任务,完成第一步的数据预处理后,将数据放入共享存储目录,将第二步任务塞入本地mysql队列 - # # 默认循环值守,可传参数运行单一任务,以方便调试 - # #atexit.register(common.notify,socket.gethostname()+"建模任务已经停止") - # # pid = '0' - # isNoColorTexture = "" - # # if len(sys.argv) == 2: - # # pids = sys.argv[1].split(',') - # # for pid in pids: - # already = [184219,184215,184209,184069,184059,183868,183817,183791,183613,183054,182855,182854,184206,184201,184199,184164,184087,184076,184029,184013,183993,183952,183888,183882,183824,183815,183812] - - # arrPids = [184219,184215,184209,184206,184201,184199,184164,184087,184076,184069,184059,184029,184013,183993,183952,183888,183882,183868,183824,183817,183815,183812,183791,183777,183715,183705,183670,183613,183573,182974,182983,182985,182989,182997,183007,183051,183060,183054,183053,183097,183119,183108,183139,183141,183155,183163,183169,183180,183191,183196,183214,183244,183266,183278,183275,183309,183402,183422,183440,182974,182964,182958] - # #,182956,182916,182855,182854,182820,182787,182800,182809,182780,182772,182770,182766,182754,182742,182740,182723,182707,182647,182643,182614,182595,182563,182557,182547,182546,182538,182530,182517,182498,182478,182452,182386,182352,182285,182266,182260,182230,182224 - # i = 0 - # for pid in arrPids: - # if pid in already: - # continue - # print("正在处理-",pid) - - - - # if is_already(str(pid)) == True: - # continue - # # i += 1 - # # continue - # #写入到 - # with open("D://make2/export_build_info/finished.txt", 'a+') as f: - # f.write(f"{pid}\n") - - # main(str(pid), experience=False, makeloop=False,task_distributed_id="",isNoColorTexture=isNoColorTexture) - - # print("已处理-",i) - # #exit() - # # if len(sys.argv) == 3: - # # experience = False - # # if sys.argv[2] == '1': - # # print('演示测试...') - # # experience = False - # # elif sys.argv[2] == 'NoColorTexture': - # # isNoColorTexture = "NoColorTexture" - # # pids = sys.argv[1].split(',') - # # for pid in pids: - # # main(pid, experience=experience, makeloop=False,task_distributed_id="",isNoColorTexture=isNoColorTexture) - # # exit() - # # main(pid, experience=False, makeloop=True,task_distributed_id="",isNoColorTexture=isNoColorTexture) \ No newline at end of file diff --git a/export_build_info/main_step2.py b/export_build_info/main_step2.py deleted file mode 100644 index 148875f..0000000 --- a/export_build_info/main_step2.py +++ /dev/null @@ -1,267 +0,0 @@ -import os, sys, time, shutil, subprocess, shlex -import platform -import pyautogui as ag -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,common,main_service_db,computerRecboxCenterByPoint -import export_already_build -redisLocal = config.redis_local -def load_model(pid): - cmd = f'{config.rcbin} {config.r1["init"]} -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}"' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - -def get_rcver(): - rcbin = '"C:\\Program Files\\Capturing Reality\\RealityCapture\\RealityCapture.exe"' - if os.path.getsize(rcbin[1:-1]) == 20783616: - return 1 - else: - return 2 - -def make3d(pid): - if get_rcver() == 1: # old version - #修改重建区域的大小 - common.change_rcbox_s(pid,"1") - #获取影棚id - # psid = libs.getPSid(pid) - # if int(psid) == 80: - # change_rcbox_deepth(str(pid),0.03) - psid = libs.getPSid(pid) - simplify_value = 1000000 * libs.getHeadCount(pid) - add_photo3 = ' ' - #判断是否存在photo3 - if os.path.exists(os.path.join(config.workdir, pid, 'photo3')): - add_photo3 = ' -addFolder "' + os.path.join(config.workdir, pid, 'photo3') + '" -align -align ' - #存在photo3 的情况下,photo2 不参与贴图 - #遍历获取photo2 目录下的所有文件 - directory = os.path.join(config.workdir, pid, 'photo2') - for root, dirs, files in os.walk(directory): - for file in files: - #判断file 是否以 _8.xmp 结尾 - if file.endswith("_8.xmp") == False: - continue - #修改文件内容不参与贴图 - libs.set_photo_join_type(config.workdir, pid, 'photo2', file.split("_")[0], mesh='0', texture='0') - else: - pass - #设置photo2参与贴图,因为有的时候贴图会黑 - directory = os.path.join(config.workdir, pid, 'photo2') - for root, dirs, files in os.walk(directory): - for file in files: - #判断file 是否以 _8.xmp 结尾 - if file.endswith("_8.xmp") == False: - continue - #修改文件内容不参与贴图 - libs.set_photo_join_type(config.workdir, pid, 'photo2', file.split("_")[0], mesh='0', texture='1') - - if get_rcver() == 1: # old version - - #判断oss 上是否存在 controlpoints 文件 - isExistPoint = common.isExistControlPointsOss(pid) - cmd = f'{config.rcbin} {config.r1["init"]} \ - -addFolder "{os.path.join(config.workdir, pid, "photo1")}" -addFolder "{os.path.join(config.workdir, pid, "photo2")}" {add_photo3} \ - -importControlPointsMeasurements "{os.path.join(config.workdir, pid, f"{pid}.controlPoints.csv")}" \ - -align -exportRegistration "{os.path.join(config.workdir,"make2", "config","exportRegistration.xml")}" "{os.path.join(config.workdir, pid,str(pid)+"_align.csv")}" -save' - - cmd = cmd + f' "{os.path.join(config.workdir, pid, f"{pid}_wait.rcproj")}"' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - time.sleep(2) - - - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 定位点导入完成') - time.sleep(3) - # defind_distance - #死循环阻塞获取 - while True: - print("循环阻塞开始") - time.sleep(3) - #判断是否有 pid_1 的的值 - print(pid+"_1") - if redisLocal.lpos('model:auto_distance',pid+"_1") == None: - continue - shutil.move(os.path.join(config.workdir, pid, f'{pid}_wait.rcproj'), os.path.join(config.workdir, pid, f'{pid}.rcproj')) - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 定义定位点距离完成') - #将 controlpoints_0.dat 文件拷贝到 oss 上作为公共的使用 - common.uploadControlPointsOss(pid) - - #最后处理掉redis中的值 - redisLocal.lrem('model:auto_distance', 0, pid+"_1") - break - print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),"循环阻塞结束,判断是否对齐成功") - - - #查看对齐的数量 - alignRes = common.isAlignNums(str(pid)) - if alignRes == "rebuild": - os.system(f'python d:\\make2\\tools\push_cmd.py rebuild {pid}') - os.system(f'python d:\\make2\\main_service.py') - return - #区域的设置 建模 - #update - cmdSmall = "-align" - #使用公共point文件的时候,就不能使用update , 而是要用 align - if isExistPoint == True: - cmdSmall = "-align" - #{config.r1["init"]} - - if common.task_need_high_model(pid): - if str(psid) == "41" or str(psid) == "85": - calulate_type = "-mvs" - else: - calulate_type = '-mvsHigh' - else: - calulate_type = '-mvs' - - #翻转相机的线向下 - cmd = f'{config.rcbin} -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" {cmdSmall} \ - -set "sfmEnableCameraPrior=True" -align -set "sfmEnableCameraPrior=False" -align -save "{os.path.join(config.workdir, pid, f"{pid}_point.rcproj")}" ' - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - #执行完成后命令会触发导出点云的定时程序 - while True: - print("判断是否导出点云文件循环阻塞开始") - time.sleep(3) - #判断是否有 pid_1 的的值 - print(pid+"_3") - if redisLocal.lpos('model:auto_distance',pid+"_3") == None: - continue - shutil.move(os.path.join(config.workdir, pid, f'{pid}_point.rcproj'), os.path.join(config.workdir, pid, f'{pid}.rcproj')) - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 导出点云文件完成') - #最后处理掉redis中的值 - redisLocal.lrem('model:auto_distance', 0, pid+"_3") - break - - #处理点云文件 - centerRcboxValue = computerRecboxCenterByPoint.boxCenter(pid) - if centerRcboxValue > 0: - print("修改中心点的坐标",centerRcboxValue) - #修改中心点的值 - common.change_rcbox_center(pid,centerRcboxValue) - - cmd = f'{config.rcbin} -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" -align \ - -set "sfmEnableCameraPrior=True" -align -set "sfmEnableCameraPrior=False" -align -setReconstructionRegion "{os.path.join(config.workdir, pid, f"{pid}.rcbox")}" \ - {calulate_type} -modelSelectMaximalConnectedComponent -modelInvertSelection -modelRemoveSelectedTriangles -closeHoles -clean -simplify {simplify_value} -smooth -unwrap -calculateTexture -renameModel {pid} -save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" -quit' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - #保存在导出 - # common.saveScreenImg(pid) - # time.sleep(1) - # ag.hotkey('alt', 'f4') - time.sleep(3) - #修改rcproj文件 - flag = common.changeRcprojFile(pid) - if flag == False: - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} rcproj文件不存在') - return - - #复制文件 - shutil.copy(os.path.join(config.workdir, pid, f'{pid}.rcproj'), os.path.join(config.workdir, pid, f'{pid}_screen.rcproj')) - time.sleep(2) - #打开工程文件 - cmd = f'{config.rcbin} -load "{os.path.join(config.workdir, pid, f"{pid}_screen.rcproj")}"' - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - - #创建指定文件夹 - if not os.path.exists(os.path.join(config.workdir, pid, "output")): - os.makedirs(os.path.join(config.workdir, pid, "output")) - - #判断output目录下是否有文件,有的话删除 - files = os.listdir(os.path.join(config.workdir, pid, "output")) - - #执行导出 - cmd = f'{config.rcbin} -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}"\ - -exportModel "{pid}" "{os.path.join(config.workdir, pid, "output", f"{pid}.obj")}" "d:\\make2\\config\\ModelExportParams102.xml" -quit' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - - - - else: # new version - #判断是否要进行高精模 - if common.task_need_high_model(pid): - if str(psid) == "41" or str(psid) == "85": - calulate_type = "calculateNormalModel" - else: - calulate_type = 'calculateHighModel' - else: - calulate_type = 'calculateNormalModel' - - #创建指定文件夹 - if not os.path.exists(os.path.join(config.workdir, pid, "output")): - os.makedirs(os.path.join(config.workdir, pid, "output")) - - cmd = f'{config.rcbin} {config.r2["init"]} -setInstanceName {pid} \ - -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" \ - -{calulate_type} \ - -selectLargestModelComponent -invertTrianglesSelection -removeSelectedTriangles -simplify {simplify_value} -smooth -closeHoles -cleanModel -calculateTexture \ - -save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" \ - -exportSelectedModel "{os.path.join(config.workdir, pid, "output", f"{pid}.obj")}" "d:\\make2\\config\\ModelExportParams.xml" -quit'# -quit - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - - export_already_build.exportInfo(pid) - # #阻塞判断是否导出完成 - # while True: - # #判断 output 目录下是否存在 三个文件 - # files = os.listdir(os.path.join(config.workdir, pid, "output")) - # if len(files) >= 3: - # break - -def step2(pid,task_distributed_id=""): - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 开始建模任务step2') - - #判断是否要从共享目录拷贝数据 - if os.path.exists(os.path.join(config.sharedir, pid)) and not os.path.exists(os.path.join(config.workdir, pid)): - shutil.move(os.path.join(config.sharedir, pid), config.workdir) - else: - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 目录{os.path.join(config.sharedir, pid)}不存在,或{os.path.join(config.workdir, pid)}已存在') - # return - #最后还是要判断有没有存在目录 - if not os.path.exists(os.path.join(config.workdir, pid)): - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 目录{os.path.join(config.workdir, pid)}不存在') - return - - start_time = time.time() - make3d(pid) - - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 建模任务step2完成,共费时{libs.diff_time(start_time)},任务已提交到step3') - # # 更新本地任务状态,加入step3任务队列 - # if task_distributed_id == "": - # os.system(f'python d:\\make2\\main_step3.py {pid}') - # else: - # #暂时 step2 step3 一起连续执行 - # print('step2 执行完,开始执行step3') - # os.system(f'python d:\\make2\\main_step3.py {pid}') - # main_service_db.update_task_distributed({"id":task_distributed_id,"status":2,"finished_at":time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}) - # main_service_db.update_task_distributed_detail({"task_distributed_id":task_distributed_id,"finished_at":time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}) - # #return - -def main(pid): - if pid == '0': - while True: - # 取本地mysql队列任务,完成第二步的建模任务 - - step2(pid) - else: - step2(pid) - -if __name__ == '__main__': - # 取本地mysql队列任务,完成第二步的建模任务 - # 默认循环值守,可传参数运行单一任务,以方便调试 - pid = '0' - if len(sys.argv) > 1: - pids = sys.argv[1].split(',') - for pid in pids: - main(pid) - exit() - main(pid) \ No newline at end of file diff --git a/export_build_info/manual_service.py b/export_build_info/manual_service.py deleted file mode 100644 index 7f4a8fd..0000000 --- a/export_build_info/manual_service.py +++ /dev/null @@ -1,185 +0,0 @@ -import os, sys, time, shlex, subprocess, shutil, requests, cv2, numpy as np -from PIL import Image -import platform -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 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)) - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} photo1数量{photos1_count} 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.xml" ' - - usePhoto = "photo"+str(usePhoto) - - #执行命令 - 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, usePhoto)}" -selectAllImages \ - -detectMarkers "D:\\make2\\config\\detectMarkers.config.xml" \ - -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) - cmd = f'{config.rcbin} -setInstanceName {pid} \ - -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" {config.r["setTextureFalse"]} \ - -addFolder "{targetFile}" -selectAllImages \ - -detectMarkers "D:\\make2\\config\\detectMarkers.config.xml" \ - {libs.get_defineDistances(psid)} -update -align -align -align -align {config.r2["setRegion"]} \ - {exportxmp} \ - -exportReconstructionRegion "{os.path.join(config.workdir, pid, f"{pid}.rcbox")}" \ - -selectImage "{os.path.join(config.workdir,pid,"photo2")}/*" -enableTexturingAndColoring true \ - -save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" -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)}') - - #调用step2 - time.sleep(2) - # os.system(f'python main_step2.py {pid}') - os.system(f'python D://make2/export_build_info/main_step2.py {pid}') - - -def is_already(pid): - - - #读取已经完成的pid - with open("D://make2/export_build_info/finished.txt", 'r') as f: - lines = f.readlines() - for line in lines: - print("line",str(line.strip())) - if str(pid) == str(line.strip()): - print("匹配成功") - return True - return False - -if __name__ == '__main__': - already = [184219,184215,184209,184069,184059,183868,183817,183791,183613,183054,182855,182854,184206,184201,184199,184164,184087,184076,184029,184013,183993,183952,183888,183882,183824,183815,183812] - - arrPids = [184219,184215,184209,184206,184201,184199,184164,184087,184076,184069,184059,184029,184013,183993,183952,183888,183882,183868,183824,183817,183815,183812,183791,183777,183715,183705,183670,183613,183573,182974,182983,182985,182989,182997,183007,183051,183060,183054,183053,183097,183119,183108,183139,183141,183155,183163,183169,183180,183191,183196,183214,183244,183266,183278,183275,183309,183402,183422,183440,182974,182964,182958,182956,182916,182855,182854,182820,182787,182800,182809,182780,182772,182770,182766,182754,182742,182740,182723,182707,182647,182643,182614,182595,182563,182557,182547,182546,182538,182530,182517,182498,182478,182452,182386,182352,182285,182266,182260,182230,182224] - for pid in arrPids: - if pid in already: - continue - print("正在处理-",pid) - - - - if is_already(str(pid)) == True: - continue - # i += 1 - # continue - #写入到 - with open("D://make2/export_build_info/finished.txt", 'a+') as f: - f.write(f"{pid}\n") - - - cmd_run(str(pid),usePhoto = "1",lock=False) - - # 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 diff --git a/export_build_info/pids/人物.txt b/export_build_info/pids/人物.txt deleted file mode 100644 index b02645c..0000000 --- a/export_build_info/pids/人物.txt +++ /dev/null @@ -1,27 +0,0 @@ -181561 -181559 -180990 -180772 -180538 -180256 -179927 -179657 -179627 -178838 -178714 -178616 -178604 -178332 -177920 -176655 -184102 -183728 -183538 -183524 -183274 -183316 -183345 -182867 -182658 -182638 -182560 diff --git a/export_build_info/pids/动物.txt b/export_build_info/pids/动物.txt deleted file mode 100644 index 58a4003..0000000 --- a/export_build_info/pids/动物.txt +++ /dev/null @@ -1,28 +0,0 @@ -181307 -181287 -181267 -180402 -179617 -179613 -178991 -178892 -178814 -178787 -178471 -178469 -178400 -178156 -177899 -177894 -176236 -184133 -184039 -183848 -183769 -183637 -183127 -183238 -182450 -182031 -181977 -181960 diff --git a/export_build_info/pids/单人.txt b/export_build_info/pids/单人.txt deleted file mode 100644 index cef740f..0000000 --- a/export_build_info/pids/单人.txt +++ /dev/null @@ -1,393 +0,0 @@ -181763 -181757 -181754 -181687 -181652 -181642 -181619 -181597 -181574 -181542 -181526 -181515 -181482 -181435 -181421 -181408 -181391 -181388 -181367 -181333 -181329 -181327 -181304 -181274 -181261 -181257 -181248 -181232 -181231 -181229 -181205 -181204 -181203 -181202 -181191 -181188 -181177 -181176 -181145 -181143 -181139 -181117 -181115 -181108 -181097 -181062 -181050 -181046 -181040 -181039 -181023 -181020 -180961 -180958 -180944 -180943 -180904 -180903 -180869 -180864 -180862 -180846 -180839 -180819 -180781 -180776 -180771 -180770 -180670 -180661 -180648 -180593 -180591 -180588 -180581 -180461 -180455 -180450 -180429 -180424 -180394 -180327 -180314 -180308 -180297 -180292 -180291 -180281 -180273 -180225 -180185 -180167 -180156 -180145 -180125 -180085 -180084 -180082 -179980 -179978 -179975 -179942 -179935 -179895 -179861 -179850 -179849 -179815 -179722 -179704 -179695 -179688 -179676 -179652 -179646 -179623 -179621 -179585 -179555 -179551 -179493 -179489 -179474 -179471 -179470 -179461 -179457 -179451 -179430 -179355 -179344 -179331 -179316 -179282 -179229 -179226 -179219 -179205 -179204 -179166 -179160 -179151 -179149 -179147 -179139 -178752 -178743 -178677 -178675 -178674 -178624 -178606 -178594 -178591 -178528 -178526 -178521 -178520 -178519 -178493 -178457 -178452 -178447 -178390 -178388 -178369 -178364 -178349 -178348 -178347 -178330 -178319 -178303 -178302 -178294 -178287 -178269 -178236 -178220 -178219 -178214 -178203 -178191 -178187 -178164 -178159 -178129 -178100 -178098 -178054 -178051 -178048 -178042 -178034 -178016 -177467 -177465 -177453 -177449 -177447 -177443 -177431 -177430 -177412 -177360 -177353 -177350 -177337 -177327 -177309 -178008 -177999 -177998 -177992 -177991 -177984 -177973 -177972 -177971 -177948 -177852 -177830 -177820 -177812 -177763 -177706 -177681 -177659 -177648 -177647 -177641 -177628 -177613 -177611 -177550 -177293 -177288 -177280 -177277 -177265 -177262 -177257 -177225 -177213 -177198 -177172 -177159 -177146 -177152 -177108 -177095 -177092 -177048 -177046 -177035 -176822 -176752 -176739 -176688 -176678 -176631 -176609 -176602 -176525 -176338 -176333 -176314 -176305 -176249 -176238 -184219 -184215 -184209 -184206 -184201 -184199 -184164 -184087 -184076 -184069 -184059 -184029 -184013 -183993 -183952 -183888 -183882 -183868 -183824 -183817 -183815 -183812 -183791 -183777 -183715 -183705 -183670 -183613 -183573 -182974 -182983 -182985 -182989 -182997 -183007 -183051 -183060 -183054 -183053 -183097 -183119 -183108 -183139 -183141 -183155 -183163 -183169 -183180 -183191 -183196 -183214 -183244 -183266 -183278 -183275 -183309 -183402 -183422 -183440 -182974 -182964 -182958 -182956 -182916 -182855 -182854 -182820 -182787 -182800 -182809 -182780 -182772 -182770 -182766 -182754 -182742 -182740 -182723 -182707 -182647 -182643 -182614 -182595 -182563 -182557 -182547 -182546 -182538 -182530 -182517 -182498 -182478 -182452 -182386 -182352 -182285 -182266 -182260 -182230 -182224 -182223 -182191 -182185 -182182 -182179 -182106 -182101 -182072 -181966 -181965 -181937 -181928 -181925 -181924 -181923 -181900 -181895 -181860 -181847 -181836 -181833 -181811 -181809 diff --git a/export_build_info/pids/双人.txt b/export_build_info/pids/双人.txt deleted file mode 100644 index 7be7926..0000000 --- a/export_build_info/pids/双人.txt +++ /dev/null @@ -1,307 +0,0 @@ -181593 -181384 -181337 -181318 -181263 -181240 -181211 -181197 -181187 -181140 -181103 -181091 -181054 -181027 -180763 -180690 -180684 -180677 -180599 -180576 -180389 -180342 -180337 -180277 -180265 -180253 -180101 -180083 -179905 -179842 -179811 -179808 -179791 -179786 -179700 -179634 -179593 -179576 -179485 -179459 -179400 -179351 -178995 -178898 -178750 -178746 -178723 -178680 -178673 -178654 -178527 -178482 -178465 -178430 -178413 -178409 -178297 -178286 -178281 -178105 -178062 -178026 -178025 -178019 -178017 -178004 -177851 -177678 -177677 -177646 -177545 -177520 -177300 -177080 -176757 -176743 -176648 -176290 -176280 -176273 -176247 -184082 -184074 -184068 -184061 -184041 -183893 -183890 -183810 -183755 -183680 -183656 -183592 -183591 -183589 -183025 -183086 -183104 -183162 -183444 -182907 -182915 -182871 -182804 -182778 -182718 -182675 -182664 -182625 -182623 -182542 -182510 -182473 -182455 -182388 -182365 -182343 -182316 -181957 -181948 -181941 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/export_build_info/pids/多人.txt b/export_build_info/pids/多人.txt deleted file mode 100644 index a12d04f..0000000 --- a/export_build_info/pids/多人.txt +++ /dev/null @@ -1,28 +0,0 @@ -180891 -180673 -180584 -180468 -180164 -180091 -179992 -179962 -178627 -178416 -178255 -178066 -177983 -177722 -183832 -183677 -183183 -183351 -183361 -183360 -182853 -182715 -182630 -182367 -182253 -182057 -181868 -181856 diff --git a/install.txt b/install.txt deleted file mode 100644 index 0dc7a86..0000000 --- a/install.txt +++ /dev/null @@ -1,13 +0,0 @@ -pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple -pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn - -python -m pip install --upgrade pip -pip install oss2 redis MySQLdb pillow numpy opencv-python bpy tqdm pyautogui psutil pywin32 pymysql - - -config -set bin="C:\Program Files\Capturing Reality\RealityCapture\RealityCapture.exe" -%bin% -disableOnlineCommunication -setInstanceName %pid% -%bin% -disableOnlineCommunication -delegateTo %pid% -%bin% -set "appCacheLocation=ProjectFolder" - diff --git a/libs/install.txt b/libs/install.txt deleted file mode 100644 index 0dc7a86..0000000 --- a/libs/install.txt +++ /dev/null @@ -1,13 +0,0 @@ -pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple -pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn - -python -m pip install --upgrade pip -pip install oss2 redis MySQLdb pillow numpy opencv-python bpy tqdm pyautogui psutil pywin32 pymysql - - -config -set bin="C:\Program Files\Capturing Reality\RealityCapture\RealityCapture.exe" -%bin% -disableOnlineCommunication -setInstanceName %pid% -%bin% -disableOnlineCommunication -delegateTo %pid% -%bin% -set "appCacheLocation=ProjectFolder" - diff --git a/main_repeat_texture.py b/main_repeat_texture.py deleted file mode 100644 index cbfd5ad..0000000 --- a/main_repeat_texture.py +++ /dev/null @@ -1,101 +0,0 @@ -#读取需要重新贴图的数据 -import os,sys,time,shlex,subprocess,shutil -import platform -if platform.system() == 'Windows': - sys.path.append('e:\\libs\\') - #sys.path.append('libs') -else: - sys.path.append('/data/deploy/make3d/make2/libs/') -import libs_db_repeat_texture -import libs,config - - -#读取 数据库的信息 -def get_pid(): - data = libs_db_repeat_texture.get_pid_task() - if data != None and data != "error": - return data[0],data[1] - else: - return None,None - -#开始处理任务 -def start_task(pid): - #下载Obj数据 - print(f"处理{pid}任务") - print("开始下载{pid}数据") - # pid = str("175635") - complateCloudPath = libs.down_obj_from_oss_for_repeat_texture(config.workdir, pid,"auto") - if complateCloudPath == "error": - return -1,"error-从oss上下载出问题" - #下载下来之后重新加载obj 和texture - print("complateCloudPath",complateCloudPath) - - - outPath = os.path.join(config.workdir, pid, "output") - if os.path.exists(outPath): - print("移除文件夹") - #移除文件夹 - shutil.rmtree(outPath) - - cmd = f'{config.rcbin} {config.r2["init"]} -setInstanceName {pid} \ - -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" \ - -importModel "{os.path.join(complateCloudPath, f"{pid}.obj")}" \ - -calculateTexture -exportSelectedModel "{os.path.join(config.workdir, pid, "output", f"{pid}.obj")}" "d:\\make2\\config\\ModelExportParams0722.xml" -quit' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - - #检查out目录文件夹是否有多个 贴图文件。如果是的话只保留最新的一个,并且重命名为初始图像的名称 - outFilePath = os.path.join(config.workdir, pid, "output") - arrTempImage = [] - for file in os.listdir(outFilePath): - if file.endswith(".jpg") or file.endswith(".png"): - #字符串替换 - fileTempName = file.replace(f"{pid}_u0_v0_diffuse","") - fileTempName = fileTempName.replace(".jpg","") - fileTempName = fileTempName.replace(".png","") - if "_" in fileTempName: - fileTempName = fileTempName.replace("_","") - arrTempImage.append(fileTempName) - print(arrTempImage) - if len(arrTempImage) > 1: - #获取 arrTempImage 中最大的值 - arrTempImage.sort() - print(arrTempImage) - #获取最大值 - maxValue = arrTempImage[-1] - - for i in arrTempImage: - if i == "": - filePath1 = os.path.join(config.workdir, pid, "output",pid+"_u0_v0_diffuse.jpg") - filePath2 = os.path.join(config.workdir, pid, "output",pid+"_u0_v0_diffuse.png") - else: - filePath1 = os.path.join(config.workdir, pid, "output",pid+"_u0_v0_diffuse_"+str(i)+".jpg") - filePath2 = os.path.join(config.workdir, pid, "output",pid+"_u0_v0_diffuse_"+str(i)+".png") - - if i != maxValue: - if os.path.exists(filePath1): - os.remove(filePath1) - if os.path.exists(filePath2): - os.remove(filePath2) - else: - if os.path.exists(filePath1): - os.rename(filePath1,os.path.join(config.workdir, pid, "output",pid+"_u0_v0_diffuse.jpg")) - if os.path.exists(filePath2): - os.rename(filePath2,os.path.join(config.workdir, pid, "output",pid+"_u0_v0_diffuse.jpg")) - #执行step3 - os.system(f'python d:\\make2\\main_step3.py {pid}') - return 3,"success" - -if __name__ == '__main__': - while True: - id,pid = get_pid() - print(f"读取的数据{pid}") - if pid != None: - #更新状态为2 - libs_db_repeat_texture.update_status(id,2) - statusres,res = start_task(str(pid)) - libs_db_repeat_texture.update_status(id,statusres) - else: - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}-没有任务') - time.sleep(10) diff --git a/old_step2.py b/old_step2.py deleted file mode 100644 index cc75b34..0000000 --- a/old_step2.py +++ /dev/null @@ -1,68 +0,0 @@ -import os, sys, time, shutil, subprocess, shlex, json -import xml.etree.ElementTree as ET -import platform -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,common - - -def old_step2(pid): - cmd = f'"C:\\Program Files\\Capturing Reality\\RealityCapture\\RealityCapture.exe" -disableOnlineCommunication -set \"sfmEnableCameraPrior=False\" -set \"sfmMaxFeaturesPerMpx=20000\" -set \"sfmMaxFeaturesPerImage=200000\" -set \"sfmImagesOverlap=High\" -set \"sfmMaxFeatureReprojectionError=1\" -addFolder "D:\\{pid}\\photo1" -addFolder "D:\\{pid}\\photo2" -importControlPointsMeasurements "D:\\{pid}\\{pid}.controlPoints.csv" -align -save "D:\\{pid}\\{pid}.rcproj" -quit' - - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - time.sleep(2) - - #修改rcproj文件 - flag = common.changeRcprojControlpointsFile(pid) - if flag == False: - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} point文件不存在') - exit() - - simplify_value = 1000000 * libs.getHeadCount(pid) - - cmd = f'"C:\\Program Files\\Capturing Reality\\RealityCapture\\RealityCapture.exe" -load "D:\\{pid}\\{pid}.rcproj" -set "sfmEnableCameraPrior=True" -align -set "sfmEnableCameraPrior=False" -align -setReconstructionRegion "D:\\{pid}\\{pid}.rcbox" -mvs -modelSelectMaximalConnectedComponent -modelInvertSelection -modelRemoveSelectedTriangles -closeHoles -clean -simplify {simplify_value} -smooth -unwrap -calculateTexture -renameModel {pid} -save "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}" -quit' - - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - - time.sleep(3) - #修改rcproj文件 - flag = common.changeRcprojFile(pid) - if flag == False: - print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} rcproj文件不存在') - exit() - - #创建指定文件夹 - if not os.path.exists(os.path.join(config.workdir, pid, "output")): - os.makedirs(os.path.join(config.workdir, pid, "output")) - #执行导出 - cmd = f'{config.rcbin} -load "{os.path.join(config.workdir, pid, f"{pid}.rcproj")}"\ - -exportModel "{pid}" "{os.path.join(config.workdir, pid, "output", f"{pid}.obj")}" "d:\\make2\\config\\ModelExportParams102.xml" -quit' - print(cmd) - cmd = shlex.split(cmd) - res = subprocess.run(cmd) - - #阻塞判断是否导出完成 - while True: - #判断 output 目录下是否存在 三个文件 - files = os.listdir(os.path.join(config.workdir, pid, "output")) - if len(files) >= 3: - break - #暂时 step2 step3 一起连续执行 - print('step2 执行完,开始执行step3') - os.system(f'python d:\\make2\\main_step3.py {pid}') - -if __name__ == '__main__': - pid = '0' - if len(sys.argv) == 1: - exit() - else: - pids = sys.argv[1].split(',') - for pid in pids: - old_step2(str(pid)) - exit() diff --git a/pid.text b/pid.text deleted file mode 100644 index bf2b155..0000000 --- a/pid.text +++ /dev/null @@ -1,499 +0,0 @@ -189002 -189819 -190152 -190141 -190204 -190210 -190221 -190234 -190257 -190264 -190297 -190377 -190238 -190409 -190417 -190144 -190233 -189879 -190227 -190463 -190510 -190531 -164671 -190241 -190547 -188521 -190609 -184467 -188521 -189772 -188521 -190724 -190506 -190509 -190511 -190578 -183895 -190584 -190605 -190611 -190620 -190635 -190683 -190684 -190694 -190697 -190708 -190726 -183494 -185507 -188521 -183494 -190751 -183895 -190754 -183895 -189002 -190784 -190783 -190795 -190812 -183895 -190823 -190837 -190910 -190838 -190866 -190905 -190915 -190927 -190944 -190939 -190932 -190379 -190948 -190959 -190980 -190975 -190927 -190996 -190981 -191001 -190927 -190992 -182361 -185080 -191045 -185416 -191069 -191082 -191081 -191103 -191118 -191116 -191152 -191180 -191125 -191227 -191238 -191246 -191234 -191275 -191320 -191283 -191354 -191388 -191435 -191441 -191431 -191380 -191340 -191350 -191297 -191472 -191255 -191268 -191501 -191192 -191156 -191517 -191515 -191525 -191532 -191261 -191422 -191024 -191542 -191587 -191597 -191676 -191678 -191711 -191736 -186628 -191874 -191937 -191924 -191945 -191887 -191868 -191981 -191885 -191838 -191882 -191965 -191822 -191870 -191920 -191894 -191811 -191739 -191681 -191790 -191738 -191699 -191781 -191733 -191746 -191793 -191829 -191834 -191907 -191927 -191969 -191990 -191998 -192005 -192021 -192023 -192026 -191771 -190829 -192038 -191906 -192095 -192107 -192098 -192123 -191066 -192150 -192161 -192178 -191210 -191849 -191832 -192093 -192199 -192208 -192202 -192213 -192211 -192204 -183783 -192220 -192267 -192223 -190880 -192288 -188877 -192283 -192291 -192079 -192077 -192072 -192063 -188201 -192343 -192353 -192367 -192373 -192222 -192399 -192392 -189979 -189988 -189996 -190692 -190709 -191955 -191912 -192444 -192438 -187727 -192479 -192473 -192469 -192476 -192140 -192143 -192158 -192498 -192169 -192175 -192186 -192187 -192197 -192214 -190362 -192236 -192239 -192241 -192242 -192244 -192248 -192304 -192261 -192421 -192425 -192514 -192162 -192548 -192550 -184779 -192495 -192490 -192583 -192586 -192591 -192593 -192595 -184756 -192235 -187195 -192378 -192622 -192129 -192570 -192566 -192480 -192481 -192484 -192482 -192532 -192624 -192630 -192682 -192674 -192690 -192701 -188185 -192725 -192729 -192608 -192732 -192717 -192609 -192611 -192612 -192615 -192744 -192643 -192650 -192653 -192659 -192776 -192664 -192676 -192680 -192758 -192759 -192767 -192775 -192782 -192783 -185658 -192838 -192873 -192875 -192905 -192895 -192869 -187718 -188167 -192929 -192940 -192955 -192947 -192907 -192908 -192887 -192979 -193038 -193003 -193005 -192875 -193112 -193101 -193085 -193082 -192986 -192944 -193132 -193141 -193058 -193160 -193074 -193217 -193239 -192208 -193285 -193260 -193287 -193288 -193298 -193281 -193335 -193332 -193349 -193165 -193185 -193010 -193231 -193364 -193295 -193313 -193339 -193354 -193357 -193360 -193375 -193376 -193377 -193378 -193353 -193193 -193454 -192317 -193405 -193468 -193475 -193483 -193479 -193486 -193508 -193504 -193511 -193503 -193520 -193562 -193571 -193560 -193237 -193569 -193591 -193590 -193593 -193617 -193615 -193637 -193625 -193642 -193646 -193683 -193671 -193677 -193616 -193702 -193700 -193604 -193721 -193745 -193770 -193768 -193758 -193762 -193636 -193652 -190141 -193771 -193781 -193813 -193806 -193812 -193818 -193835 -193863 -193907 -193832 -193896 -193903 -193906 -193380 -193383 -193384 -193925 -193386 -193480 -193387 -193666 -193711 -193757 -193934 -193778 -193795 -193809 -193822 -193817 -193843 -193918 -193876 -193922 -193567 -193564 -193551 -192320 -193117 -193961 -193969 -193524 -193547 -193990 -193995 -194012 -194022 -194027 -194021 -194069 -194048 -194035 -194070 -194015 -194018 -194093 -194098 -194144 -194104 -194112 -194119 -194108 -194126 -194153 -194163 -194044 -194047 -194206 -194004 -194229 -194218 -194240 -194242 -194278 -194271 -194293 -194081 -194173 -194176 -194211 -194245 -194270 -194285 -194292 -194294 -194296 -194300 -194347 -190480 -190483 -194258 -194266,194276,194444,194419,194454,194471,194470,194473,194475,194480,194493,194497,194499,194480,194460,192716,194465,194514,194515,194527,194501,194500,194526,194531,194536,194540,194551,194564,194577,194582,194580,187324,194599,194601,194628,194625,194623,189048,186982,194627,194508,194510,189048,194640,194642,194654,194685,194686,194707,194720,194719,194744,194734,194634,194738,194760,194765,194764,194768,194774,190697,194566,194356,194365,194369,194806,194376,194064,194772,194097,194773,194100,194103,194812,194810,194223,194181,194178,194589,194588,186685,194831,194830,194832,194834,194854,194817,194878,191283,191321,194900,194904,194858,194901,194885,194916,194924,194925,194802,194927,194932,194906,194908,194911,194912,194914,194915,194917,194920,194953,194926,194928,194930,194935,194957,194817,190531,189819,194989,194987,194995,194996,192305,194998,195015,195013,195023,195018,195021,195032,195005,195050,189864,195067,195072,195091,195026,195031,195104,195029,195102,195051,195063,195093,195125,195146,193800,195160,195172,195154,195184,194210,186610,191005,187854,193794, \ No newline at end of file diff --git a/step.text b/step.text deleted file mode 100644 index f68ca32..0000000 --- a/step.text +++ /dev/null @@ -1,5 +0,0 @@ -old version - -init: - - '"C:\\Program Files\\Capturing Reality\\RealityCapture\\RealityCapture.exe" -disableOnlineCommunication -set \"sfmEnableCameraPrior=False\" -set \"sfmMaxFeaturesPerMpx=20000\" -set \"sfmMaxFeaturesPerImage=200000\" -set \"sfmImagesOverlap=High\" -set \"sfmMaxFeatureReprojectionError=1\" -addFolder "D:\\{pid}\\photo1" -addFolder "D:\\{pid}\\photo2" -importControlPointsMeasurements "D:\\{pid}\\{pid}..controlPoints.csv" -align -save' \ No newline at end of file diff --git a/suwa_cut_foot_cut_normal_data.txt b/suwa_cut_foot_cut_normal_data.txt deleted file mode 100644 index 678ca37..0000000 --- a/suwa_cut_foot_cut_normal_data.txt +++ /dev/null @@ -1,1028 +0,0 @@ -24940 -68906 -88630 -88577 -97498 -71421 -87608 -8171 -78384 -6997 -86851 -98679 -86508 -89740 -85599 -94736 -78354 -77972 -78376 -16920 -86395 -10074 -99642 -11797 -49366 -84827 -85974 -44784 -99994 -40869 -55887 -82481 -89063 -88616 -86500 -70532 -98474 -94109 -15707 -87872 -85838 -90422 -86171 -11997 -115116 -113276 -95446 -86246 -88628 -47645 -82455 -117658 -70740 -83983 -89694 -87049 -87163 -33899 -90469 -87975 -86075 -29805 -128193 -87550 -85362 -86502 -86330 -90227 -115220 -89919 -90425 -104867 -86584 -90132 -113019 -13073 -10873 -12171 -86890 -90903 -24772 -136305 -79333 -87745 -89431 -86146 -124091 -49934 -50221 -87912 -87084 -87516 -86424 -88116 -97615 -85963 -94817 -82435 -41537 -44781 -89199 -89727 -62516 -87565 -87268 -115194 -82190 -89120 -89563 -65653 -47053 -88046 -92424 -88481 -86349 -53638 -88617 -88445 -88205 -88355 -59322 -90448 -18252 -78351 -29507 -86428 -89783 -86035 -46352 -90406 -90843 -7126 -90148 -86279 -101042 -73988 -88836 -90369 -79755 -86673 -33247 -88524 -39732 -43054 -42595 -87737 -87271 -87451 -80007 -88221 -88686 -86275 -71321 -98878 -71422 -86497 -107527 -52884 -88241 -90589 -83068 -90447 -87596 -29796 -87439 -25048 -87168 -29888 -24941 -68508 -90209 -20197 -86443 -94857 -64004 -87848 -88369 -86496 -88590 -30033 -88475 -87861 -88253 -88983 -57762 -87416 -86552 -91177 -86734 -86490 -87954 -88772 -49404 -7814 -86425 -89596 -58122 -27534 -86347 -50160 -89579 -82700 -55026 -99989 -85710 -87095 -16089 -88591 -39662 -91180 -98714 -86419 -125464 -85715 -55030 -91183 -86383 -109374 -78448 -55730 -86435 -21780 -90151 -88255 -66521 -54023 -87765 -90139 -14475 -115123 -87079 -77145 -88178 -22210 -98993 -87015 -88503 -20203 -36791 -125436 -48477 -12177 -86278 -89957 -122998 -46130 -71303 -93778 -24766 -40776 -41320 -42781 -86445 -83980 -75405 -55370 -88882 -78149 -87649 -87514 -85939 -81419 -40943 -87901 -87235 -82486 -66531 -50007 -88374 -86709 -82496 -82511 -16076 -115114 -86833 -74624 -86857 -89107 -91185 -40884 -88509 -135848 -55011 -8547 -86112 -85794 -90052 -86078 -88918 -70756 -64088 -22152 -87635 -87290 -29427 -89364 -98674 -116852 -12172 -88827 -90439 -44779 -90088 -115132 -109445 -82483 -87818 -87873 -121685 -42047 -87052 -85912 -118440 -86503 -87175 -68349 -13084 -77142 -50370 -88563 -86495 -87037 -108109 -115122 -98091 -57168 -88507 -75408 -8610 -86949 -79125 -8776 -57204 -91173 -82696 -49327 -24942 -56654 -88359 -50027 -86300 -102719 -86446 -64142 -86611 -88627 -117356 -86454 -126409 -28921 -6970 -89024 -87887 -89621 -94967 -107145 -47890 -88093 -88995 -50342 -55018 -26695 -86338 -54400 -78385 -86820 -88968 -88573 -98996 -68697 -86331 -90551 -12335 -86511 -27553 -70729 -82408 -82571 -87906 -77221 -90600 -88629 -6968 -9023 -29770 -85788 -87390 -151860 -74411 -112909 -115378 -82125 -136885 -105856 -102508 -80095 -8164 -74708 -13024 -82623 -81145 -48218 -80514 -106158 -82563 -90603 -114365 -102402 -105871 -71141 -100610 -70831 -131590 -153149 -91115 -25043 -72000 -75773 -6983 -113196 -73463 -75572 -97938 -82044 -89072 -116130 -116192 -80466 -115416 -71842 -87966 -86513 -82793 -146462 -113922 -73438 -73711 -105016 -73412 -102759 -89036 -89971 -88871 -130972 -152817 -86507 -80759 -80706 -8141 -104590 -70200 -73444 -40947 -73470 -76324 -149080 -72970 -69739 -79145 -102141 -106243 -101876 -82100 -71758 -80770 -86906 -87477 -105343 -70279 -76230 -84057 -69633 -81580 -8140 -75622 -105490 -72923 -58586 -114159 -101076 -104459 -104628 -86672 -74833 -152986 -100841 -100025 -75045 -72792 -81921 -70599 -106421 -141436 -72135 -8124 -146818 -31596 -116457 -80996 -105102 -113518 -72976 -82434 -105171 -40913 -114432 -137257 -86995 -8200 -75689 -106671 -44786 -70475 -81564 -146161 -71404 -104561 -113937 -73392 -81532 -112984 -82748 -85998 -88038 -71089 -74118 -76108 -106324 -87291 -81026 -88947 -106337 -105794 -82705 -70888 -69593 -74327 -80415 -122616 -76396 -8253 -70885 -151841 -72077 -116187 -114307 -72260 -6963 -70596 -88712 -98868 -80312 -86746 -8199 -100005 -82282 -40948 -121880 -71508 -13121 -80683 -82181 -152309 -49325 -105360 -104984 -86989 -85502 -72199 -71100 -40816 -88272 -102239 -104128 -96956 -73389 -106465 -114158 -104528 -69644 -105650 -51431 -104418 -105344 -73597 -58190 -68680 -105439 -102687 -114697 -105104 -116598 -62515 -96436 -102542 -70455 -81528 -89710 -105088 -102753 -69898 -115929 -86115 -106738 -142193 -122293 -85774 -72306 -81554 -71067 -28769 -104130 -105979 -75466 -8121 -72095 -5875 -152573 -141587 -101283 -81261 -104849 -135470 -114587 -74989 -60247 -91151 -76329 -70638 -74981 -102295 -104957 -104164 -98858 -75392 -153167 -114890 -152766 -142029 -75523 -80002 -82209 -80822 -73382 -86491 -114166 -69258 -81891 -40814 -106078 -104489 -75411 -84820 -105702 -88514 -106753 -136880 -106066 -87307 -122608 -88545 -112911 -76105 -82123 -73125 -80407 -76014 -106220 -122735 -72975 -86065 -73474 -68786 -106129 -40876 -105802 -82428 -75508 -88593 -72337 -137362 -87354 -153039 -87155 -69892 -100718 -80127 -76237 -116521 -71539 -80519 -89530 -71209 -80743 -80209 -88184 -49361 -152218 -117178 -106310 -88006 -81729 -103216 -87615 -64126 -107188 -86128 -88363 -69714 -72203 -70355 -70530 -73472 -74368 -86509 -122599 -74410 -82382 -75609 -105768 -82204 -114197 -114035 -8160 -114335 -69639 -35645 -114821 -75491 -31191 -82752 -80518 -39410 -102707 -122205 -73744 -152421 -12089 -80470 -116398 -73799 -104680 -104090 -105620 -87996 -105287 -129944 -89201 -52051 -106177 -122650 -73924 -89570 -82139 -146823 -64996 -80812 -137281 -82722 -146064 -116528 -114299 -104391 -80510 -70527 -30034 -86860 -105699 -104122 -80037 -104458 -128547 -72248 -86073 -98860 -137373 -44775 -105390 -105251 -114203 -73217 -74383 -114565 -59610 -104870 -82614 -153162 -100015 -8145 -117625 -80998 -54403 -88128 -73437 -73356 -81920 -88417 -136185 -105697 -70889 -72957 -72798 -105035 -102468 -80208 -116546 -104933 -93707 -74685 -71461 -73976 -105426 -44755 -70349 -44794 -122619 -74027 -74687 -89184 -53139 -80362 -73128 -40781 -6847 -152106 -106473 -72070 -44836 -86482 -75052 -40772 -74560 -81985 -105876 -105872 -40925 -88682 -151995 -72783 -77974 -145908 -49345 -49357 -121936 -107178 -87188 -105039 -136716 -88327 -102747 -90704 -105445 -81824 -152098 -40771 -116999 -75374 -85743 -88804 -101599 -73257 -6991 -146466 -105273 -69771 -87506 -113497 -86325 -152423 -86680 -82792 -104109 -86694 -75019 -100675 -85944 -116503 -115524 -141188 -88936 -105609 -91175 -82512 -105750 -116176 -74197 -106625 -73722 -82082 -84064 -70300 -75272 -104911 -141385 -74925 -76101 -72419 -106094 -70336 -104460 -81258 -74097 -153236 -44788 -6965 -86684 -81211 -102194 -113844 -105642 -114395 -141141 -88852 -73738 -75501 -152182 -142162 -74784 -64155 -97494 -114781 -152500 -145528 -76106 -70120 -75377 -71840 -146105 -152498 -151840 -81701 -74702 -146669 -81450 -73291 -75446 -81590 -31599 -122287 -71129 -113123 -18505 -121624 -69765 -69160 -40882 -89268 -76339 -152775 -70255 -89076 -82749 -88239 -104140 -106382 -87864 -74679 -71551 -39413 -102313 -105728 -70171 -81476 -116582 -73045 -85612 -73820 -105007 -148909 -137185 -87283 -89413 -43059 -115968 -73451 -72205 -56408 -86706 -106597 -71633 -102466 -72763 -113774 -12088 -89584 -113944 -73467 -75788 -122605 -71093 -114190 -76328 -76387 -76213 -69770 -82046 -106083 -136017 -84730 -69133 -114523 -74074 -106342 -104548 -100735 -30336 -106086 -104142 -122523 -88697 -139439 -80290 -116574 -75114 -114416 -72223 -75518 -73939 -114359 -48250 -73049 -71535 -113667 -72169 -100824 -73262 -77232 -61802 \ No newline at end of file diff --git a/task_distributed_error.log b/task_distributed_error.log deleted file mode 100644 index 64b6397..0000000 Binary files a/task_distributed_error.log and /dev/null differ diff --git a/test.py b/test.py deleted file mode 100644 index c2937f0..0000000 --- a/test.py +++ /dev/null @@ -1,18 +0,0 @@ -import re - -def extract_o_option(file_path): - pattern = re.compile(r'o\s+(\S+)') - with open(file_path, 'r') as file: - for line in file: - match = pattern.search(line) - if match: - return match.group(1) - return None - -# 使用示例 -file_path = 'C:/Users/Administrator/Desktop/29282/29282_9cm_x1.obj' -result = extract_o_option(file_path) -if result: - print(f'Found -o option with value: {result}') -else: - print('No -o option found') diff --git a/test1.py b/test1.py deleted file mode 100644 index 3f18ac6..0000000 --- a/test1.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -import os -import oss2 - -# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 -endpoint = 'https://oss-cn-shanghai.aliyuncs.com' -# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 -access_key_id = 'LTAI5tSj7s2mKZNqamT1x64v' -access_key_secret = 'iIqeBLB8R2U72pAwJbZZBB6tuB3ZF9' -# 指定文件所在的Bucket名称,例如examplebucket。 -bucket_name = 'suwa3d-securedata' -# Object完整路径,完整路径中不能包含Bucket名称。 -key = 'photos/141640/photo2/72_8.jpg' - -# 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。 -bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name) - -style = 'image/bodies' -# 生成带签名的URL,并指定过期时间为10分钟。过期时间单位为秒。 -url = bucket.sign_url('GET', key, 10 * 60, params={'x-oss-process': style}) -print(url) \ No newline at end of file diff --git a/timer/external_order_glb.py b/timer/external_order_glb.py new file mode 100644 index 0000000..365ec4f --- /dev/null +++ b/timer/external_order_glb.py @@ -0,0 +1,202 @@ +import os, sys, time, bpy, math, requests, bmesh, json, shutil +from PIL import Image +import platform,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,common,foot_mark_seam,libs_db_gpu + +def bmesh_copy_from_object(obj, transform=True, triangulate=True, apply_modifiers=False): + """Returns a transformed, triangulated copy of the mesh""" + assert obj.type == 'MESH' + if apply_modifiers and obj.modifiers: + import bpy + depsgraph = bpy.context.evaluated_depsgraph_get() + obj_eval = obj.evaluated_get(depsgraph) + me = obj_eval.to_mesh() + bm = bmesh.new() + bm.from_mesh(me) + obj_eval.to_mesh_clear() + else: + me = obj.data + if obj.mode == 'EDIT': + bm_orig = bmesh.from_edit_mesh(me) + bm = bm_orig.copy() + else: + bm = bmesh.new() + bm.from_mesh(me) + if transform: + matrix = obj.matrix_world.copy() + if not matrix.is_identity: + bm.transform(matrix) + matrix.translation.zero() + if not matrix.is_identity: + bm.normal_update() + if triangulate: + bmesh.ops.triangulate(bm, faces=bm.faces) + return bm + +def find_pid_objname(pid): + for obj in bpy.data.objects: + if obj.name.startswith(str(pid)): + return obj.name + +#加载obj文件 +def reload_obj(pid): + + #下载obj文件 + libs.down_obj_from_oss(config.workdir, pid, "print") + # obj = reload_obj(pid, action) + + + obj_filename = os.path.join(config.workdir,'print',pid,f'{pid}.obj') + bpy.ops.wm.read_homefile() + bpy.ops.object.delete(use_global=False, confirm=False) + bpy.ops.import_scene.obj(filepath=obj_filename) + bpy.context.scene.unit_settings.scale_length = 1 + bpy.context.scene.unit_settings.length_unit = 'CENTIMETERS' + bpy.context.scene.unit_settings.mass_unit = 'GRAMS' + + obj = bpy.context.selected_objects[0] + bpy.context.view_layer.objects.active = obj + obj.select_set(True) + +def base_fix(pid): + # 统一blender环境 + reload_obj(pid) + # 统一模型方向、位置、大小... + pid_objname = find_pid_objname(pid) + obj = bpy.data.objects[pid_objname] + bpy.data.objects[pid_objname].rotation_euler = (0, 0, 0) + # 检查当前模型是否正确使用 z 轴作为高度轴 + if obj.dimensions.z < obj.dimensions.y: + # 如果 z 轴比 y 轴小,说明高度错误,应该旋转调整模型 + print(f"警告:模型的高度轴(z)似乎不正确,使用 y 轴作为高度。正在修正模型方向...") + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) # 应用当前变换 + obj.rotation_euler[0] = math.radians(90) # 旋转模型 90 度,交换 z 和 y 轴 + bpy.ops.object.transform_apply(rotation=True) # 应用旋转 + + + + bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_VOLUME', center='MEDIAN') + bpy.context.object.location[0] = 0 + bpy.context.object.location[1] = 0 + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 模型基础校正完成') + + +def export_and_update_glbs(pid): + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 开始导出并上传审核模型和3D相册模型glb文件...') + start_time = time.time() + #headcount = libs.getHeadCount(pid) + headcount = 1 + pid_objname = find_pid_objname(pid) + obj = bpy.data.objects[pid_objname] + obj.select_set(True) + + model_info = {} + model_info['headcount'] = headcount + model_info['faces'] = round(len(obj.data.polygons) / 10000) + model_info['height'] = round(obj.dimensions.y * 100) + + # bpy.ops.wm.save_as_mainfile(filepath=os.path.join(config.workdir, pid, f'{pid}.blend')) + + # 统一缩放到9cm标准尺寸 + scale = 90 / bpy.data.objects[pid_objname].dimensions.y + bpy.data.objects[pid_objname].scale = (scale, scale, scale) + bpy.ops.object.transform_apply(scale=True) + + # bpy.ops.wm.save_as_mainfile(filepath=os.path.join(config.workdir, pid, f'{pid}-9cm.blend')) + + bm = bmesh_copy_from_object(obj) + model_info['volume'] = round(bm.calc_volume(), 2) + model_info['weight'] = round(model_info['volume'] * 1.226, 2) + print(f'{pid}的模型数据:{model_info}') + + res = requests.get(f'{config.urls["upload_model_info_url"]}?pid={pid}&headcount={headcount}&faces={model_info["faces"]}&volume={model_info["volume"]}&weight={model_info["weight"]}&height={model_info["height"]}') + print('上传模型数据:', res.text) + # with open(os.path.join(config.sharedir, 'model_info', f'{pid}.json'), 'w') as f: + # json.dump(model_info, f) + # f.close() + + # 先生成审核模型 + faces_dest = 500000 * headcount + # 减面 + faces_current = len(bpy.data.objects[pid_objname].data.polygons) + print(f'当前面数:{faces_current},目标面数:{faces_dest}') + + bpy.ops.object.modifier_add(type='DECIMATE') + bpy.context.object.modifiers["Decimate"].ratio = faces_dest / faces_current + bpy.ops.object.modifier_apply(modifier="Decimate") + + # glb_filename = os.path.join(config.workdir, pid, 'output', f'{pid}.glb') + # bpy.ops.export_scene.gltf(filepath=glb_filename, export_format='GLB', export_apply=True, export_jpeg_quality=75, export_draco_mesh_compression_enable=False) + + # 再生成数字模型 + faces_dest = 120000 * headcount + + # 减面 + faces_current = len(bpy.data.objects[pid_objname].data.polygons) + print(f'当前面数:{faces_current},目标面数:{faces_dest}') + + bpy.ops.object.modifier_add(type='DECIMATE') + bpy.context.object.modifiers["Decimate"].ratio = faces_dest / faces_current + bpy.ops.object.modifier_apply(modifier="Decimate") + + glb_filename = os.path.join(config.workdir,'print',pid,f'{pid}-3d.glb') + bpy.ops.export_scene.gltf(filepath=glb_filename, export_format='GLB', export_apply=True, export_jpeg_quality=75, export_draco_mesh_compression_enable=False) + + # os.system(f'gltfpack -c -i {os.path.join(config.workdir, pid, "output", f"{pid}.glb")} -o {os.path.join(config.workdir, pid, "output", f"{pid}-pack.glb")}') + # config.oss_bucket.put_object_from_file(f'glbs/auto/{pid}.glb', os.path.join(config.workdir, pid, 'output', f'{pid}-pack.glb')) + config.oss_bucket.put_object_from_file(f'glbs/3d/{pid}.glb', os.path.join(config.workdir,'print',pid, f'{pid}-3d.glb')) + + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} glb文件导出并上传完成,共费时{libs.diff_time(start_time)}') + + #移除文件夹 + shutil.rmtree(os.path.join(config.workdir,'print',pid)) + + #更新该笔订单的状态为 3000 + requests.post("https://shop.api.suwa3d.com/api/printOrder/updateExternalOrderStatus", data={'pid': pid}) + +def createGlb(pid): + + #移除文件夹 + try: + shutil.rmtree(os.path.join(config.workdir,'print',pid)) + except: + pass + base_fix(pid) + export_and_update_glbs(pid) + + +if __name__ == '__main__': + arrArgs = sys.argv + if len(arrArgs) == 2: + pid = arrArgs[1] + #判断是否是数字 + if pid.isdigit(): + print('请输入正确的pid') + createGlb(str(pid)) + + else: + r = redis.Redis(host="106.14.158.208",password="kcV2000",port=6379,db=6) + while True: + if r.llen('model:3dglb') == 0: + print('队列为空,等待10秒') + time.sleep(10) + continue + + info = r.lpop('model:3dglb') + if info is None: + print('队列为空,等待10秒') + time.sleep(10) + pid = info.decode('utf-8') + + if not pid.isdigit(): + continue + + createGlb(pid) + + diff --git a/timer/init_timer.py b/timer/init_timer.py index d23cc92..da485a7 100644 --- a/timer/init_timer.py +++ b/timer/init_timer.py @@ -1,8 +1,26 @@ -import time,os +import os +import time as t +from datetime import datetime, time +def is_time_in_range(start_time_str, end_time_str): + # 获取当前时间 + now = datetime.now().time() + + # 转换字符串时间为时间对象 + start_time = datetime.strptime(start_time_str, '%H:%M').time() + end_time = datetime.strptime(end_time_str, '%H:%M').time() + + # 检查当前时间是否在指定范围内 + return start_time <= now <= end_time + if __name__ == '__main__': + start_time_str = '07:00' + end_time_str = '23:59' #开启死循环 while True: - #检测当前打印 和 脚底板 和 gs 队列长度 - os.system("python E:\\make2\\tools\\push_cmd.py auto_view") - #一个小时检测一次 - time.sleep(60*60) \ No newline at end of file + + #判断当前时间是否在 8:00-20:00 之间 + if is_time_in_range(start_time_str, end_time_str): + #检测当前打印 和 脚底板 和 gs 队列长度 + os.system("python E:\\make2\\tools\\push_cmd.py auto_view") + #一个小时检测一次 + t.sleep(60*60) \ No newline at end of file diff --git a/tools/push_cmd.py b/tools/push_cmd.py index 651901d..a78a695 100644 --- a/tools/push_cmd.py +++ b/tools/push_cmd.py @@ -21,6 +21,8 @@ def main(cmd, order_id): key = 'model:rebuild' elif cmd == 'gs': key = 'ai:ai_build' + elif cmd == 'gs_normals_image': + key="model:gs_normals_image" if order_id == 'view': if cmd == "rc_model_build": @@ -28,6 +30,7 @@ def main(cmd, order_id): print(f'当前{cmd}队列长度:{nums}') notify(f'当前{cmd}队列长度:{nums}') else: + print(f"key-{key}") print(f'当前{cmd}队列长度:{r.llen(key)}') notify(f'当前{cmd}队列长度:{r.llen(key)}') @@ -73,14 +76,17 @@ def cmd(cmdName,pid): key = 'model:foot' if pid == 'view': - # for i in r.lrange(key, 0, -1): - # print(i) + temp = "" + for i in r.lrange(key, 0, -1): + print(i) + temp += i.decode('utf-8') + "," + print(temp) print(f'当前{cmd}队列长度:{r.llen(key)}') notify(f'当前{cmd}队列长度:{r.llen(key)}') exit() else: - for i in r.lrange(key, 0, -1): - print(i) + # for i in r.lrange(key, 0, -1): + # print(i) print(f'当前{key}队列长度:{r.llen(key)}') exit() @@ -180,7 +186,7 @@ if __name__ == '__main__': cmd = sys.argv[1] order_id = 'view' if cmd == "auto_view": - arrCmd = ["print","foot","gs","rc_model_build"] + arrCmd = ["print","foot","gs","rc_model_build","gs_normals_image"] for cmdV in arrCmd: main(cmdV, order_id) diff --git a/yj_local_build/ModelExportParams.xml b/yj_local_build/ModelExportParams.xml new file mode 100644 index 0000000..e85e3dc --- /dev/null +++ b/yj_local_build/ModelExportParams.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/yj_local_build/config.json b/yj_local_build/config.json new file mode 100644 index 0000000..ae82af5 --- /dev/null +++ b/yj_local_build/config.json @@ -0,0 +1,17 @@ +{ + "workdir": "D://", + "local_need_build": "/\\172.31.1.253/modeling/local_need_build", + "local_complate_build":"/\\172.31.1.253/modeling/local_complate_build", + "rcbin": "'C:\\Program Files\\Capturing Reality\\RealityCapture\\RealityCapture.exe'", + "urls": { + "update_status_modelsuccess_url": "http://172.16.20.13:8383/update_take_photo" + }, + "r": { + "setTextureTrue": "-selectAllImages -enableTexturingAndColoring true", + "setTextureFalse": "-selectAllImages -enableTexturingAndColoring false" + }, + "r2": { + "init": "-disableOnlineCommunication -setProjectCoordinateSystem Local:1 -setOutputCoordinateSystem epsg:4326 -set \"sfmEnableCameraPrior=False\" -set \"sfmMaxFeaturesPerMpx=20000\" -set \"sfmMaxFeaturesPerImage=200000\" -set \"sfmImagesOverlap=High\" -set \"sfmMaxFeatureReprojectionError=1\"", + "setRegion": "-setReconstructionRegionOnCPs 36h11:001 36h11:002 36h11:003 2.1 -moveReconstructionRegion 0 0 -2.1 -rotateReconstructionRegion 180 0 180 -setGroundPlaneFromReconstructionRegion -scaleReconstructionRegion 1.8 1.6 2.1 absolute center -moveReconstructionRegion 0 0 0.0025" + } +} \ No newline at end of file diff --git a/yj_local_build/config.py b/yj_local_build/config.py new file mode 100644 index 0000000..a332da4 --- /dev/null +++ b/yj_local_build/config.py @@ -0,0 +1,26 @@ + +workdir = 'D://' #建模过程数据存放的目录 +local_need_build = '/\\172.31.1.253/modeling/local_need_build' #需要建模的数据存放目录 +local_complate_build = '/\\172.31.1.253/modeling/local_complate_build' #建模完成的存放目录 +rcbin = '"C:\\Program Files\\Capturing Reality\\RealityCapture\\RealityCapture.exe"' +urls = { + 'update_status_modelsuccess_url': 'http://172.16.20.13:8383/update_take_photo', +} + +r = { + "setTextureTrue" : "-selectAllImages -enableTexturingAndColoring true", + "setTextureFalse" : "-selectAllImages -enableTexturingAndColoring false", +} + +r1 = { + "init" : "-disableOnlineCommunication -set \"sfmEnableCameraPrior=False\" -set \"sfmMaxFeaturesPerMpx=20000\" -set \"sfmMaxFeaturesPerImage=200000\" -set \"sfmImagesOverlap=High\" -set \"sfmMaxFeatureReprojectionError=1\"", +} + +r2 = { + "init" : "-disableOnlineCommunication -setProjectCoordinateSystem Local:1 -setOutputCoordinateSystem epsg:4326 -set \"sfmEnableCameraPrior=False\" -set \"sfmMaxFeaturesPerMpx=20000\" -set \"sfmMaxFeaturesPerImage=200000\" -set \"sfmImagesOverlap=High\" -set \"sfmMaxFeatureReprojectionError=1\"", + "setRegion" : "-setReconstructionRegionOnCPs 36h11:001 36h11:002 36h11:003 2.1 -moveReconstructionRegion 0 0 -2.1 -rotateReconstructionRegion 180 0 180 -setGroundPlaneFromReconstructionRegion -scaleReconstructionRegion 1.8 1.6 2.1 absolute center -moveReconstructionRegion 0 0 0.0025" +} + +rH = { + "init" : "-disableOnlineCommunication -set \"sfmEnableCameraPrior=False\" -set \"sfmMaxFeaturesPerMpx=10000\" -set \"sfmMaxFeaturesPerImage=80000\" -set \"sfmImagesOverlap=High\" -set \"sfmMaxFeatureReprojectionError=2\"", +} diff --git a/yj_local_build/detectMarkers.config.xml b/yj_local_build/detectMarkers.config.xml new file mode 100644 index 0000000..456ff59 --- /dev/null +++ b/yj_local_build/detectMarkers.config.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/yj_local_build/exportControlPoints.config.xml b/yj_local_build/exportControlPoints.config.xml new file mode 100644 index 0000000..bc57fdc --- /dev/null +++ b/yj_local_build/exportControlPoints.config.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/yj_local_build/exportXMP.config.lock.xml b/yj_local_build/exportXMP.config.lock.xml new file mode 100644 index 0000000..c073e91 --- /dev/null +++ b/yj_local_build/exportXMP.config.lock.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/yj_local_build/libs.py b/yj_local_build/libs.py new file mode 100644 index 0000000..eb60074 --- /dev/null +++ b/yj_local_build/libs.py @@ -0,0 +1,139 @@ +import os, time, json, requests, shutil, psutil +from tqdm import tqdm +from PIL import Image, ImageEnhance +import config +from concurrent.futures import ThreadPoolExecutor + +def find_blender_bin_path(): + base_path = 'C:\\Program Files\\Blender Foundation\\' + if os.path.exists(base_path): + for dir in os.listdir(base_path): + if dir.startswith('Blender'): + blender_bin_path = base_path + dir + '\\blender.exe' + return f'"{blender_bin_path}"' + else: + print('未找到blender安装目录') + exit(1) + +# def resize_photos(photo_path, ratio=0.5): +# for filename in os.listdir(photo_path): +# if filename.endswith('.jpg'): +# img = Image.open(os.path.join(photo_path, filename)) +# img = rotate_image(img) +# w, h = img.size +# img = img.resize((int(w * ratio), int(h * ratio))) +# img.save(os.path.join(photo_path, filename)) + +# def rotate_image(image): +# # 检查图像的EXIF数据是否包含方向信息 +# try: +# exif = image._getexif() +# orientation = exif.get(0x0112) +# except: +# orientation = None + +# # 根据方向信息旋转图像 +# if orientation == 3: +# image = image.rotate(180, expand=True) +# elif orientation == 6: +# image = image.rotate(270, expand=True) +# elif orientation == 8: +# image = image.rotate(90, expand=True) +# return image + +# def get_ps_adjust_photo_para(psid): +# res = requests.get(config.urls['get_ps_adjust_photo_para_url'], params={'id': psid}) +# print(res.json()) +# paras = res.json()['data'] +# brightness_factor, saturation_factor, temperature_factor = float(paras['brightness']), float(paras['saturation']), float(paras['colorTemperature']) +# return brightness_factor, saturation_factor, temperature_factor + + +# def getPSid(pid): +# res = requests.get(config.urls['get_psid_url'], params={'pid': pid}) +# print('get_psid_url:', res.url) +# print('res:', res.text) +# res = json.loads(res.text) +# return str(res['data']) + +# def getHeadCount(pid): +# return 1 + # res = requests.get(config.urls['get_printinfo_url'], params={'id': pid}) + # print('get_printinfo_url:', res.url) + # print('res:', res.text) + # if res.status_code != 200: + # print('获取人数失败,程序退出') + # exit(1) + # res = json.loads(res.text) + # return res['data']['headcount'] + +# def get_ps_type(pid): +# # return 1:圆形影棚 2:方形影棚 +# #res = requests.get(config.urls['get_ps_type_url'], params={'pid': pid}) +# return 2 + +# def find_valid_camera_on_oss(pid): +# if get_ps_type(pid) == 1: +# print('当前拍照影棚为:圆形影棚') +# cameras = (103, 93, 113) +# else: +# print('当前拍照影棚为:方形影棚') +# cameras = (74, 64, 84) +# find_camera = 0 +# for camera in cameras: +# objectkey = f'photos/{pid}/photo2/{camera}_8.jpg' +# find = config.oss_bucket.object_exists(objectkey) +# if find: +# find_camera = camera +# break + +# print('找到有效正脸相机:', find_camera) +# if find_camera == 0: +# print('{cameras}没有找到照片,程序退出') +# exit(1) +# return find_camera + + + + + +# def set_photos_join_type(workdir, pid, photoN, mesh = '0', texture='0'): +# photoN_path = os.path.join(workdir, pid, photoN) +# for xmp in os.listdir(photoN_path): +# if xmp.endswith('.xmp'): +# xmp_path = os.path.join(photoN_path, xmp) +# with open(xmp_path, 'r') as f: +# lines = f.readlines() +# lines = [line.replace('xcr:InMeshing="0"', f'xcr:InMeshing="{mesh}"') for line in lines] +# lines = [line.replace('xcr:InMeshing="1"', f'xcr:InMeshing="{mesh}"') for line in lines] +# lines = [line.replace('xcr:InTexturing="0"', f'xcr:InTexturing="{texture}"') for line in lines] +# lines = [line.replace('xcr:InTexturing="1"', f'xcr:InTexturing="{texture}"') for line in lines] +# with open(xmp_path, 'w') as f: +# f.writelines(lines) + +def set_photo_join_type(workdir, pid, photoN, camera_id, mesh = '0', texture='0'): + if photoN == 'photo1': + filename = os.path.join(workdir, pid, photoN, f'{camera_id}_1.xmp') + else: + filename = os.path.join(workdir, pid, photoN, f'{camera_id}_8.xmp') + with open(filename, 'r') as f: + lines = f.readlines() + lines = [line.replace('xcr:InMeshing="0"', f'xcr:InMeshing="{mesh}"') for line in lines] + lines = [line.replace('xcr:InMeshing="1"', f'xcr:InMeshing="{mesh}"') for line in lines] + lines = [line.replace('xcr:InTexturing="0"', f'xcr:InTexturing="{texture}"') for line in lines] + lines = [line.replace('xcr:InTexturing="1"', f'xcr:InTexturing="{texture}"') for line in lines] + with open(filename, 'w') as f: + f.writelines(lines) + + + +def diff_time(start_time): + # 按照分:秒的方式返回时间差 + end_time = time.time() + diff = end_time - start_time + m, s = divmod(diff, 60) + return f'{int(m)}分{int(s)}秒' + + + + diff --git a/yj_local_build/main_step1.py b/yj_local_build/main_step1.py new file mode 100644 index 0000000..f2cd11b --- /dev/null +++ b/yj_local_build/main_step1.py @@ -0,0 +1,233 @@ +import os, sys, time, shlex, subprocess, shutil, requests, cv2, numpy as np +from PIL import Image +import json + + +with open('config.json', 'r') as f: + config = json.load(f) + + +def set_photo_join_type(workdir, pid, photoN, camera_id, mesh = '0', texture='0'): + if photoN == 'photo1': + filename = os.path.join(workdir, pid, photoN, f'{camera_id}_1.xmp') + else: + filename = os.path.join(workdir, pid, photoN, f'{camera_id}_8.xmp') + with open(filename, 'r') as f: + lines = f.readlines() + lines = [line.replace('xcr:InMeshing="0"', f'xcr:InMeshing="{mesh}"') for line in lines] + lines = [line.replace('xcr:InMeshing="1"', f'xcr:InMeshing="{mesh}"') for line in lines] + lines = [line.replace('xcr:InTexturing="0"', f'xcr:InTexturing="{texture}"') for line in lines] + lines = [line.replace('xcr:InTexturing="1"', f'xcr:InTexturing="{texture}"') for line in lines] + with open(filename, 'w') as f: + f.writelines(lines) + + + +def diff_time(start_time): + # 按照分:秒的方式返回时间差 + end_time = time.time() + diff = end_time - start_time + m, s = divmod(diff, 60) + return f'{int(m)}分{int(s)}秒' + + +def filter_dark_texture_image(pid): + start_time = time.time() + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 开始检测射灯异常图片...') + def get_image_v(image): + # 图片左上角和右上角各取200*200区域,计算V通道均值 + left_rect = image[0:200, 0:200] + right_rect = image[0:200, -200:] + + left_hsv = cv2.cvtColor(left_rect, cv2.COLOR_BGR2HSV) + left_v = left_hsv[:, :, 2] + left_avg_v = np.mean(left_v) + # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 图片左上角V通道均值:{left_avg_v}') + + right_hsv = cv2.cvtColor(right_rect, cv2.COLOR_BGR2HSV) + right_v = right_hsv[:, :, 2] + right_avg_v = np.mean(right_v) + # print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 图片右上角V通道均值:{right_avg_v}') + return (left_avg_v + right_avg_v) / 2 + + v_list = [] + for filename in os.listdir(os.path.join(config['workdir'], pid, 'photo2')): + if filename.endswith(".jpg"): + image = cv2.imread(os.path.join(config['workdir'], pid, 'photo2', filename)) + v = get_image_v(image) + item = {'filename': filename, 'v': v} + v_list.append(item) + v_list.sort(key=lambda x: x['v']) + v_list = v_list[5: -5] + avg_v = np.mean([item['v'] for item in v_list]) + for item in v_list: + if abs(item['v'] - avg_v) > 50: + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 图片{item["filename"]} V通道值{item["v"]},低于平均值{avg_v},将不参与贴图') + set_photo_join_type(config['workdir'], pid, 'photo2', item['filename'].split('_')[0], mesh='1', texture='0') + + # 复制xmp文件到photo3目录,如果photo3目录存在的话 + if os.path.exists(os.path.join(config['workdir'], pid, 'photo3')): + shutil.copyfile(os.path.join(config['workdir'], pid, 'photo2', item['filename'].replace('jpg', 'xmp')), os.path.join(config['workdir'], pid, 'photo3', item['filename'].replace('jpg', 'xmp'))) + + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 射灯异常图片检测完成,共费时{diff_time(start_time)}') + +def detect_markers(psid, pid): + def fix_region(): + region_filename = os.path.join(config['workdir'], pid, f'{pid}.rcbox') + with open(region_filename, 'r') as f: + lines = f.readlines() + lines = [line.replace('"NONE" globalCoordinateSystemWkt="NONE" globalCoordinateSystemName="NONE"', '"+proj=geocent +ellps=WGS84 +no_defs" globalCoordinateSystemName="local:1 - Euclidean"') for line in lines] + + start_time = time.time() + textpicCmd ='-selectImage "'+os.path.join(config['workdir'],pid,'photo2')+'\*" -enableTexturingAndColoring true' + + #获取当前的工作目录 + dirCurr = os.getcwd() + + 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, "photo1")}" {config["r"]["setTextureFalse"]} -align -addFolder "{os.path.join(config["workdir"], pid, "photo2")}" \ + -align -selectAllImages \ + -detectMarkers "{dirCurr}\detectMarkers.config.xml" \ + -defineDistance 36h11:001 36h11:002 1 -defineDistance 36h11:002 36h11:004 1 -defineDistance 36h11:004 36h11:003 1 -defineDistance 36h11:003 36h11:001 1 -align -align -update {config["r2"]["setRegion"]} \ + -exportXMP "{dirCurr}\exportXMP.config.xml" \ + -exportControlPointsMeasurements "{os.path.join(config["workdir"], pid, f"{pid}.controlPoints.csv")}" "{dirCurr}\exportControlPoints.config.xml" \ + -exportReconstructionRegion "{os.path.join(config["workdir"], pid, f"{pid}.rcbox")}" \ + {textpicCmd} -save "{os.path.join(config["workdir"], pid, f"{pid}.rcproj")}" -quit' + print(cmd) + cmd = shlex.split(cmd) + res = subprocess.run(cmd) + time.sleep(3) + fix_region() + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid: {pid} 定位点检测完成, 共费时{diff_time(start_time)}') + +def step1(pid,headsCount): + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 开始处理{pid}建模任务') + start_time = time.time() + # 检测图片定位点,定位异常及时上报微信通知给客服人员,人工判断是否需要重新拍摄或更换地贴。定义定位点距离,导出相机位姿信息 + detect_markers(0, pid) + # 处理图片,检测photo2中的异常图片不参与贴图,以免破坏贴图效果,默认不检测射灯异常图片,以节省算力成本 + filter_dark_texture_image(pid) + + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} {pid} step1图片预处理完成,共费时{diff_time(start_time)}') + # os.system(f'python {os.getcwd()}/main_step2.py {pid}') + step2(pid,headsCount) + +def step2(pid,headsCount): + dirCurr = os.getcwd() + simplify_value = 1000000 * int(headsCount) + calulate_type = 'calculateNormalModel' + cmd = f'{config["rcbin"]} {config["r2"]["init"]} -setInstanceName {pid} \ + -load "{os.path.join(config["workdir"], pid, f"{pid}.rcproj")}" \ + -{calulate_type} \ + -selectLargestModelComponent -invertTrianglesSelection -removeSelectedTriangles -simplify {simplify_value} -smooth -closeHoles -cleanModel -calculateTexture \ + -save "{os.path.join(config["workdir"], pid, f"{pid}.rcproj")}" \ + -exportSelectedModel "{os.path.join(config["workdir"], pid, "output", f"{pid}.obj")}" "{dirCurr}\\ModelExportParams.xml" -quit' + print(cmd) + cmd = shlex.split(cmd) + res = subprocess.run(cmd) + #阻塞判断是否导出完成 + while True: + #判断 output 目录下是否存在 三个文件 + files = os.listdir(os.path.join(config['workdir'], pid, "output")) + if len(files) >= 3: + break + + #将导出的文件移动到指定目录 + sourceDir = config["local_complate_build"] + #判断目录是否存在,不存在就创建 + if not os.path.exists(sourceDir): + os.makedirs(sourceDir) + + #将 output 目录里的文件移动到指定目录 + shutil.move(os.path.join(config['workdir'], pid, "output"),os.path.join(sourceDir,pid)) + #发起请求告知后端建模完成 + try: + res = requests.post(url, data={'id': pid,'status':5000}) + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid:{pid} 任务完成- {res.text}') + except Exception as e: + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid:{pid} - 建模完成状态变更失败 - {e}') + + +def main(pid,headsCount): + step1(pid, headsCount) + +if __name__ == '__main__': + try: + url = config['urls']['update_status_modelsuccess_url'] + if url == "": + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 请配置建模完成回调地址') + exit() + + # 取云端redis任务,完成第一步的数据预处理后,将数据放入共享存储目录,将第二步任务塞入本地mysql队列 + # 默认循环值守,可传参数运行单一任务,以方便调试 + pid = '0' + if len(sys.argv) == 3: + pids = sys.argv[1].split(',') + headsCount = sys.argv[2] + for pid in pids: + main(pid,headsCount) + exit() + + #获取文件夹下的所有文件 + needBuildDir = config['local_need_build'] + workdir = config['workdir'] + if workdir == '': + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 请配置建模工作目录') + exit() + + #不存在就创建工作目录 + if not os.path.exists(workdir): + os.makedirs(workdir) + + if not os.path.exists(needBuildDir): + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 需要建模目录不存在- {needBuildDir}') + exit() + except Exception as e: + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 初始化异常 - {e}') + + + #遍历文件夹下的所有文件进行处理 + try: + while True: + time.sleep(5) + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 建模任务循环开始') + for pid in os.listdir(needBuildDir): + if not os.path.isdir(os.path.join(needBuildDir,pid)): + continue + + #判断是否存在 canDo.txt 文件,如果不存在就跳过 + if not os.path.exists(os.path.join(needBuildDir,pid,"canDo.txt")): + continue + + #读取 canDo.txt 文件内容 + headsCounts = 1 + with open(os.path.join(needBuildDir,pid,"canDo.txt"),"r") as f: + headsCounts = f.read() + + + #判断文件夹里是否存在 do.txt , 如果存在就跳过,不存在就创建 + if os.path.exists(os.path.join(needBuildDir,pid,"do.txt")): + continue + else: + with open(os.path.join(needBuildDir,pid,"do.txt"),"w") as f: + f.write("1") + + #判断是否已经存在了,存在就删除 + if os.path.exists(os.path.join(workdir,pid)): + shutil.rmtree(os.path.join(workdir,pid)) + + #将文件夹移动到工作目录 + shutil.move(os.path.join(needBuildDir,pid),os.path.join(workdir,pid)) + #执行建模流程,建模中的流程 + try: + requests.post(url, data={'id': pid,'status':4000}) + except Exception as e: + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} pid:{pid} - 状态变更失败 - {e}') + #continue + + main(pid,headsCounts) + except Exception as e: + print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} 建模任务循环异常 - {e}') + exit() + \ No newline at end of file