mvs一镜到底

mvs一镜到底

  • 一、Use smart-unwrap to create uv coordinates and store your mesh as .obj file.
    • 1. smart-unwrap
    • 2. store your mesh as .obj file.
    • 3. 关闭blender
  • 二、grayscales rendering and viepoints' rotation and tranlation matrices.
    • 1. 添加运动轨迹
    • 2. 添加相机约束
    • 3. 调整相机视角至合适位置,并修改焦距
    • 4. 修改帧范围,默认100帧转一圈
    • 5. 添加材质
    • 6. 设置渲染引擎
    • 7. 修改对象名称,输出路径,输出格式
    • 8. 保存.blender文件
  • 三、Extract dictionaries and 2D-3D correspondances.
    • 1.得到005.npy,pano2UV_proj里的_dict.json,visibility.npy
      • 1.1 创建texture_mesh.py
      • 1.2 创建文件夹pano2UV_proj,放在/scenes/005/下
      • 1.3 运行texture_mesh.py
    • 2.得到UV2pano,pano2UV里的RTm.npy
      • 2.1 创建look_up_unrenderer.py
      • 2.2 修改参数
      • 2.3 将/images/RTm复制一份到/output/RTm
      • 2.4 创建文件夹UV2pano,pano2UV。
      • 2.5 运行look_up_unrenderer.py

一、Use smart-unwrap to create uv coordinates and store your mesh as .obj file.

1. smart-unwrap

删除所有对象,包括灯光和相机,导入.obj。
Tab+A+U
请添加图片描述

2. store your mesh as .obj file.

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

3. 关闭blender

二、grayscales rendering and viepoints’ rotation and tranlation matrices.

1. 添加运动轨迹

请添加图片描述请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

2. 添加相机约束

请添加图片描述
按Alt+G
请添加图片描述

3. 调整相机视角至合适位置,并修改焦距

请添加图片描述

4. 修改帧范围,默认100帧转一圈

请添加图片描述

5. 添加材质

请添加图片描述

6. 设置渲染引擎

请添加图片描述

7. 修改对象名称,输出路径,输出格式

请添加图片描述

请添加图片描述
请添加图片描述

import bpy
import math
import os
from mathutils import Vector, Matrix
from math import radians
import bmesh
import datetime
import time
import numpy as np
import os
#from os import path

scenenumber='baseline_scene6_clean'

#basefolder=os.path.join(os.path.expanduser('~'), 'Documents', 'Zantis', scenenumber)
scene = bpy.data.scenes["Scene"]
#scene.camera.rotation_mode='YZX'
def length():
    leg=0.00
    p1=[0.0,0.0]
    temp=0
    ob = bpy.context.object # active object
    for p in ob.data.splines.active.bezier_points:
        p2=p1
        p1=[p.co.x,p.co.y]
        if(temp==0):
            temp=1
            continue
        distance = math.sqrt( ((p1[0]-p2[0])**2)+((p1[1]-p2[1])**2) )
        leg=leg+distance
    return leg

item=0
multiply=40
camera = bpy.data.objects['Camera']
target=bpy.data.objects['mesh.001']
my_obj=[]


#my_obj.append("019")
#my_obj.append("021")
#my_obj.append("029")
#my_obj.append("030")
#my_obj.append("031")
#my_obj.append("032")
#my_obj.append("033")
#my_obj.append("034")
my_obj.append("040")
#my_obj.append("042")

t1 = time.time()

#import bpy

#for ob in bpy.context.selected_editable_objects:
  #  ob.active_material_index = 0
 #   for i in range(len(ob.material_slots)):
#        bpy.ops.object.material_slot_remove({'object': ob})

for item in my_obj:
    #break
    # basefolder=os.path.join(os.path.expanduser('~'), 'Desktop', 'Urban_Enviroment_Texturing','Mesh_Texturing_Pipeline', 'Scenes', '005', 'images')
    basefolder = os.path.join('E:\\', 'chromeDownload', 'mvs_test', 'scenes', '006', 'images')
    t2 = time.time()
    for ob in bpy.context.selected_objects:
        ob.select_set(False)
    curv='Curve.'+item
    path = bpy.data.objects[curv]
    camera.select_set(True)
    path.select_set(True)
    # bpy.context.view_layer.objects.active = path # parent
    # bpy.ops.object.parent_set(type='FOLLOW') # follow path
    # camera.location=path.matrix_world @ bpy.context.object.data.splines.active.bezier_points[0].co
    # target.location=path.matrix_world @ bpy.context.object.data.splines.active.bezier_points[1].co
    # direc=target.location-camera.location
    # frames=(int)(length()*multiply)	
    # bpy.data.scenes["Scene"].frame_end=frames
    # bpy.context.object.data.path_duration=frames
    frame_is=0
    # frames=frames+1
    # print(frames)
    count=0
    for frame_is in range(scene.frame_start, scene.frame_end + 1):
    # for frame_is in range(frames - 3):
        t3 = time.time()
        scene.frame_current=frame_is
        #print(scene.frame_currents
#        s=str(scene.objects['Camera'].matrix_world[0][3])+"_"+str(scene.objects['Camera'].matrix_world[1][3])+"_"+str(scene.objects['Camera'].matrix_world[2][3])+"_"
#        s=s+str(direc[0])+"_"+str(direc[1])+"_"+str(direc[2])+".jpg"
        s = str(scene.frame_current).zfill(5)+".jpg"
        image_filepath=os.path.join(basefolder,s)
        #print(s)
        bpy.data.scenes['Scene'].render.filepath = image_filepath
#        bpy.ops.render.render(write_still=True)
        elapsedTime = time.time() - t3
        print("Frame time passed {hours:d}:{minutes:d}:{seconds:d}"
        .format(hours=int((elapsedTime / 60 ** 2) % (60 ** 2)), minutes=int((elapsedTime / 60) % (60)),
            seconds=int(elapsedTime % 60)))
        
        
        
#        print('path to create: ', os.path.join(os.path.expanduser('~'), 'Desktop', 'Data','Depth_data',scenenumber+'_'+item))
        if not os.path.exists(os.path.join(os.path.expanduser('~'), basefolder)):
            os.mkdir(os.path.join(os.path.expanduser('~'), basefolder))
        
        if not os.path.exists(os.path.join(os.path.expanduser('~'), basefolder, 'RTm/')):
            os.mkdir(os.path.join(os.path.expanduser('~'), basefolder, 'RTm/'))
           
        # Set up rendering of depth map:
        bpy.context.scene.use_nodes = True
        tree = bpy.context.scene.node_tree
        links = tree.links

        # clear default nodes
        for n in tree.nodes:
            tree.nodes.remove(n)

        # create input render layer node
        rl = tree.nodes.new('CompositorNodeRLayers')
        
        RGB2BW = tree.nodes.new(type="CompositorNodeRGBToBW")
        links.new(rl.outputs[0], RGB2BW.inputs[0])
        
        map = tree.nodes.new(type="CompositorNodeMapValue")
        # Size is chosen kind of arbitrarily, try out until you're satisfied with resulting depth map.
        map.size = [0.05]
        map.use_min = True
        map.min = [0]
        map.use_max = True
        map.max = [1]
        links.new(rl.outputs[2], map.inputs[0])
        
        mix_multi = tree.nodes.new(type="CompositorNodeMixRGB")
        # Size is chosen kind of arbitrarily, try out until you're satisfied with resulting depth map.
        mix_multi.blend_type = 'MULTIPLY'
        mix_multi.inputs[2].default_value[0] = 0.5
        mix_multi.inputs[2].default_value[1] = 0.5
        mix_multi.inputs[2].default_value[2] = 0.5
#        mix_multi.inputs[2].default = [0.5 , 0.5, 0.5, 1.0]
        links.new(rl.outputs[3], mix_multi.inputs[1])
        
        mix_multi2 = tree.nodes.new(type="CompositorNodeMixRGB")
        # Size is chosen kind of arbitrarily, try out until you're satisfied with resulting depth map.
        mix_multi2.blend_type = 'ADD'
        mix_multi2.inputs[2].default_value[0] = 0.5
        mix_multi2.inputs[2].default_value[1] = 0.5
        mix_multi2.inputs[2].default_value[2] = 0.5
        links.new(mix_multi.outputs[0], mix_multi2.inputs[1])

        invert = tree.nodes.new(type="CompositorNodeInvert")
        links.new(map.outputs[0], invert.inputs[1])

        # The viewer can come in handy for inspecting the results in the GUI
        depthViewer = tree.nodes.new(type="CompositorNodeViewer")
        links.new(invert.outputs[0], depthViewer.inputs[0])
        # Use alpha from input.
        links.new(rl.outputs[1], depthViewer.inputs[1])
        # Normal map
        # The viewer can come in handy for inspecting the results in the GUI
        depthViewer2 = tree.nodes.new(type="CompositorNodeViewer")
        links.new(rl.outputs[1], depthViewer2.inputs[1])
        links.new(mix_multi2.outputs[0], depthViewer2.inputs[0])
        
#        fileOutput = tree.nodes.new(type="CompositorNodeOutputFile")
#        fileOutput.base_path = os.path.join(os.path.expanduser('~'), 'Desktop', 'Data','Depth_data',scenenumber+'_'+item, 'depth')
##        fileOutput.file_slots[0].path = str(scene.frame_current).zfill(5)
#        links.new(invert.outputs[0], fileOutput.inputs[0])
#        
#        fileOutput2 = tree.nodes.new(type="CompositorNodeOutputFile")
#        fileOutput2.base_path = os.path.join(os.path.expanduser('~'), 'Desktop', 'Data','Depth_data',scenenumber+'_'+item,'normal')
##        fileOutput2.file_slots[0].path = str(scene.frame_current).zfill(5)
#        links.new(mix_multi2.outputs[0], fileOutput2.inputs[0])
#        
#        fileOutput3 = tree.nodes.new(type="CompositorNodeOutputFile")
#        fileOutput3.base_path = os.path.join(os.path.expanduser('~'), 'Desktop', 'Data','Depth_data',scenenumber+'_'+item,'panoramas_BW')
##        fileOutput3.file_slots[0].path = str(scene.frame_current).zfill(5)
#        links.new(RGB2BW.outputs[0], fileOutput3.inputs[0])

        bpy.ops.render.render(write_still=True)
        
        location, rotation = scene.objects['Camera'].matrix_world.decompose()[0:2]
        R_world2bcam = rotation.to_matrix().transposed()
        T_world2bcam = -1*R_world2bcam @ location
        
        Camera_RT_matrix =  Matrix((
        R_world2bcam[0][:] + (T_world2bcam[0],),
        R_world2bcam[1][:] + (T_world2bcam[1],),
        R_world2bcam[2][:] + (T_world2bcam[2],),
        [0,0,0,1],))
        
        np.savetxt(os.path.join(os.path.expanduser('~'), basefolder, 'RTm')+'/'+str(frame_is).zfill(6)+"_RTm.txt",np.array(Camera_RT_matrix))
        # break
        
    scene.frame_current=0
    path.select_set(False)
    bpy.ops.object.parent_clear(type='CLEAR')
    # camera.select_set(False)
elapsedTime = time.time() - t1
print("Total time passed {hours:d}:{minutes:d}:{seconds:d}"
    .format(hours=int((elapsedTime / 60 ** 2) % (60 ** 2)), minutes=int((elapsedTime / 60) % (60)),
            seconds=int(elapsedTime % 60)))
print("Finished")

8. 保存.blender文件

在这里插入图片描述

三、Extract dictionaries and 2D-3D correspondances.

1.得到005.npy,pano2UV_proj里的_dict.json,visibility.npy

1.1 创建texture_mesh.py

#!/usr/bin/env python
import sys, os

# Add the igl library to the modules search path
sys.path.insert(0, os.getcwd() + "/../libigl/python/")

import pyigl as igl
import argparse
import math
from tqdm import tqdm
import multiprocessing
import ctypes
import numpy as np
import cv2
import create_dict as dict_

parser = argparse.ArgumentParser()
parser.add_argument('--scene_path', type=str,
                    default="",
                    help="Location of obj filee")
parser.add_argument('--start', type=int, default=0, help="UV mapping")
parser.add_argument('--offset', type=int, default=200, help="UV mapping")
parser.add_argument('--visual', type=bool, default=False, help="Display map")
parser.add_argument('--fill_mesh', type=bool, default=True)
parser.add_argument('--create_dict', dest='create_dict', action='store_true')
parser.add_argument('--panoram_size', type=tuple, default=(512, 256))
parser.add_argument('--UV_size', type=tuple, default=(2048, 2048))
parser.add_argument('--scene_number', type=int, default=4)
parser.add_argument('--distance_threshold', type=int, default=20)
parser.add_argument('--processes_number', type=int, default=10)
parser.add_argument('--UV_output_path', type=str, default=10)
parser.add_argument('--step', type=int, default=4)
parser.add_argument('--no_dis_filter', type=bool, default=False)
parser.add_argument('--mesh_name', type=str, default='mesh')
# parser.add_argument('--create_3D_mapping', type=bool, default=False)
parser.add_argument('--create_3D_mapping', dest='create_3D_mapping', action='store_true')
parser.add_argument('--feature', dest='feature', action='store_true')
pars = parser.parse_args()

# 从指定目录加载相机信息,包括相机的旋转和平移矩阵。
def load_camera_info_np(directory, start=pars.start, offset=pars.offset):
    camera_RT_matrices = []
    camera_locations = []
    count = 0
    for filename in sorted(os.listdir(directory)):
        if count < start + offset and count >= start and (count % pars.step == 0):
            RTmatrix = np.loadtxt(os.path.join(directory, filename))
            print('RTm: ', filename)
            # Camera rotation and translation matrix
            camera_RT_matrices.append(np.loadtxt(os.path.join(directory, filename)))
            # World coordin<3 location
            camera_locations.append(np.dot(-1 * RTmatrix[:, :-1].T, RTmatrix[:, -1]))
        count += 1
    print('Camera location list: ', len(camera_locations))
    return camera_RT_matrices, camera_locations

# 从指定目录加载全景图像。
def load_panoramas(directory, start=pars.start, offset=pars.offset):
    im_x, im_y = pars.panoram_size

    A_source = igl.eigen.MatrixXuc(im_x, im_y)
    R_source = igl.eigen.MatrixXuc(im_x, im_y)
    G_source = igl.eigen.MatrixXuc(im_x, im_y)
    B_source = igl.eigen.MatrixXuc(im_x, im_y)

    images_R_source = []
    images_G_source = []
    images_B_source = []
    images_A_source = []

    count 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/282622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库导入100万数据不同方式的性能差异

本文将介绍MySQL数据库导入100万数据的三种方式性能比较。 三种方式分别为&#xff1a; &#xff08;1&#xff09;逐条INSERT &#xff08;2&#xff09;批量INSERT提交 &#xff08;3&#xff09;通过mysql自带的load data命令 应用场景&#xff1a;假设需要向100万个号码…

HTML 基础

文章目录 01-标签语法标签结构 03-HTML骨架04-标签的关系05-注释06-标题标签07-段落标签08-换行和水平线09-文本格式化标签10-图像标签图像属性 11-路径相对路径绝对路径 12-超链接标签13-音频14-视频 01-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本…

Plantuml之YAML效果图语法介绍(二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Apollo自动驾驶系统:实现城市可持续交通的迈向

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 ChatGPT体验地址 文章目录 前言引言&#xff1a;1. 什么是微服务架构&#xff1f;2. 微服务架构的组成要素3. 微服务架构的挑战和解决方案4. 微服务架构的可扩展性和弹性 第二部分&#x…

【Simulink系列】——用扫地机器人实例快速引入

目录 一、Simulink基本认知 1、模块图建模 2、仿真基本流程 3、调试技巧 二、基于模型的simulink设计实例&#xff08;两轮扫地机器人&#xff09; 1、系统定义与布局 确定建模目的 确定系统组件和接口 确定系统布局 2、建模并验证系统 对组件建模 ①物理组件建模 …

短说社区运营的使用工具分享(一)

本文是一篇针对短说社区运营的使用工具分享帖&#xff0c;是小编结合日常使用&#xff0c;总结的一些可以帮助网站管理员和运营人员进行日常操作和管理的工具。 1. 想天工作台之运营面板 想天工作台可以将桌面划分不同的类型来辅助办公&#xff0c;我分享下我当前的桌面情况&…

程序员必备IDEA插件,什么是是IDE?

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;插件&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。 我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。今天就给大家介绍一款IDEA插件&#xff…

SpringCloud(H版alibaba)框架开发教程之nacos做配置中心——附源码(2)

上篇主要讲了使用eureka&#xff0c;zk&#xff0c;nacos当注册中心 这篇内容是nacos配置中心 代码改动部分mysql驱动更新到8.0&#xff0c;数据库版本升级到了8.0&#xff0c;nacos版本更新到了2.x nacos2.x链接 链接&#xff1a;https://pan.baidu.com/s/11nObzgTjWisAfOp…

工程(十七)——自己数据集跑R2live

博主创建了一个科研互助群Q&#xff1a;772356582&#xff0c;欢迎大家加入讨论。 r2live是比较早的算法&#xff0c;编译过程有很多问题&#xff0c;通过以下两个博客可以解决 编译R2LIVE问题&解决方法-CSDN博客 r2live process has died 问题解决了_required process …

Kafka安装及简单使用介绍

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

鸿蒙HarmonyOS-带笔锋手写板(三)

笔者用ArkTS 写了一个简单的带笔锋的手写板应用&#xff0c;并且可以将手写内容保存为图片。 一、效果图 手写效果如下&#xff08;在鸿蒙手机模拟器上运行&#xff0c;手写时反应可能会有点慢&#xff09; 二、实现方法 参考文章&#xff1a; 支持笔锋效果的手写签字控件_a…

【数据结构】详细剖析线性表

顺序表与链表的比较 导言一、线性表二、线性表的存储结构三、顺序表和链表的相同点四、顺序表与链表之间的差异五、存储结构的选择六、静态顺序表的基本操作七、无头结点单链表的基本操作结语 导言 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff0…

VStudio2022导出Qt项目在Linux的Qtcreator中运行修复错误记录

公司项目中的代码在VStudio2022中编写&#xff0c;交给我需要移植Linux的Qtcreator中&#xff0c;记录一下移植过程中的遇到的坑&#xff0c;按照错误顺序由高到低记录一下&#xff0c;边尝试边解决边记录&#xff0c;写作方面没有逻辑&#xff0c;每个人项目环境不一样&#x…

P1019 [NOIP2000 提高组] 单词接龙 刷题笔记

P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路来自 大佬 Chardo 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 匹配 &#xff1a; 将 第一个字符串末尾 和第二个字符串第一个开始匹配 如果 j<i这段走完了 flag还没…

【ROS2】MOMO的鱼香ROS2(二)ROS2入门篇——ROS2初体验

ROS2初体验 引言专业术语认识1 认识ROS21.1 ROS2版本对照表1.2 ROS与ROS2对比1.3 ROS2架构1.3.1 DDS实现层1.3.2 ROS中间件接口&#xff08;RMW&#xff09;1.3.3 ROS2客户端库 RCL 2 安装ROS22.1 ROS安装&#xff08;一键式&#xff09;2.2 手动安装ROS22.2.1 添加ROS软件源2.…

4.28 构建onnx结构模型-Unfold

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Unfold 结点进行分析 方式 方法…

鸿蒙(OpenHarmony)系统之智能语音部件(1)

本文重点参考&#xff1a; OpenHarmony/ai_intelligent_voice_framework 一、总体概述 1. 功能简介及架构 智能语音组件包括智能语音服务框架和智能语音驱动&#xff0c;主要实现了语音注册及语音唤醒相关功能。 智能语音组件架构图如下图所示&#xff1a; &#xff08;1&a…

【ONE·MySQL || 数据类型 表的约束】

总言 主要内容&#xff1a;介绍MySQL中的常见数据类型&#xff08;数值类型、文本二进制类型、时间日期、字符串类型&#xff09;&#xff0c;以及对表的约束&#xff08;非空约束、默认约束、列描述、零填充约束、自增长约束、主键约束、唯一键约束、外键约束&#xff09;。  …

详解维吉尼亚密码(附四种攻击策略)

目录 一. 介绍 二. 破解维吉尼亚密码 2.1 频率统计 2.2 提高型频率统计法 2.3 Kasiski攻击法 2.4 重合指数攻击法&#xff08;index of coincidence method&#xff09; 三. 小结 一. 介绍 我们知道英语字母的出现频率是有规律的&#xff0c;比如像下表&#xff1a; 掌…

2023-12-23 LeetCode每日一题(移除石子使总数最小)

2023-12-23每日一题 一、题目编号 1962. 移除石子使总数最小二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k &#xff0c;请你执行下述…