3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第二步)
强烈建议使用Blender方法!!!
说明
2 python调用Blender生成多视角图像
2.1 Blender准备工作
2.2 python代码实现.off文件读取和投影成像
2.3 python和blender联合使用生成多视角图像
2.3.1 单个.off文件生成多视角图像
2.3.2 数据集txt生成多视角图像
2.4 最想要的开箱即用代码
问题汇总:
1.blender版本问题
2. Import blender-off-addon failed
以上是邮件或公众号里问我的问题,遇到的频率还比较多,如果有其他问题我会后续更新,感谢拉坑出来的小伙伴们。
有问题关注公众号“pytorch理解与实战”,直接后台留言或评论即可,或发邮件zeaggler@gmail.com
邮件看的频次有点低,几天才会看一次,公众号后台提醒,我看到比较及时。我看到,肯定回复,尽量提供力所能及的帮助!
强烈建议使用Blender方法!!!
- 授人以鱼不如授人以渔 -
写文章的初衷是我在处理ModelNet的.OFF文件时遇到太多困难,只为后来的你减少不必要的麻烦,思路和代码都是我历经千辛万苦才摸索出来的,百度很难找到,代码现已全部上传至GitHub。需要特别说明的是,代码不是拿来即用的,你需要仔细按照你自己的路径修改
说明
回顾一下ModelNet10/40 .OFF文件生成多视角图像的方法,我找到的有两种方法,实际推荐Blender方法!!!

两种方法具体步骤:

Blender方法
首先要实现Blender对.OFF文件的读取与显示
https://blog.csdn.net/jorg_zhao/article/details/86309774
然后利用python调用Blender完成多视角数据集的生成
https://blog.csdn.net/jorg_zhao/article/details/88345324
Mat方法
首先将.OFF文件转为.MAT文件(可生成不同视角的.MAT)
https://blog.csdn.net/jorg_zhao/article/details/86647696
然后用python将不同视角的.MAT文件转为多视角图片
https://blog.csdn.net/jorg_zhao/article/details/88345366
2 python调用Blender生成多视角图像
2.1 Blender准备工作
为了能够利用python调用blender,我们需要首先在项目文件夹下用blender生成一个空的模型blend文件,在此空模型中,需要提前构造出背景、纹理和灯光等,为了方便,我为你们提供了一个空背景模型,灯光设置成了点光源,并分布于各个角落,这样可以防止读入模型时,造成模型表面光影变化太大,以免影响后续分类精度。

图1 为代码中附上的blender空背景图像,添加了8个角度上的点光源

图1文件名为phong.blend,此文件可用blender直接打开,除非你对blender很熟悉,不建议你修改此文件,实测生成的多视角图像还是很清晰的。

2.2 python代码实现.off文件读取和投影成像
python的代码直接放出来吧:

import bpy
import os.path
import math
import sysC = bpy.context
D = bpy.data
scene = D.scenes['Scene']# cameras: a list of camera positions
# a camera position is defined by two parameters: (theta, phi),
# where we fix the "r" of (r, theta, phi) in spherical coordinate system.# 5个固定视角:前 右 后 左 上
# cameras = [(60, 0), (60, 90), (60, 180), (60, 270),(0, 0)]# 连续视角:固定某一个角度,然后环视3D物体,环视角度间隔inter=30度
fixed_view = 60
inter = 30
cameras = [(fixed_view, i) for i in range(0, 360, inter)] # 这会生成360/30=12个视角图片
render_setting = scene.render# 输出图像大小 (W, H)
w = 224
h = 224
render_setting.resolution_x = w*2
render_setting.resolution_y = h*2'''****************************************************************'''
def main():argv = sys.argvargv = argv[argv.index('--') + 1:]if len(argv) != 2:print('phong.py args: <3d mesh path> <image dir>')exit(-1)model_path = argv[0]        # 输入: 单个 .off 或 dataset.txtimage_dir = argv[1]         # 输出: 保存多视角图像的路径# blender 对.off文件没有原生支持,需要安装插件install_off_addon()init_camera()fix_camera_to_origin()'''************* 自动判别输入的是单个off文件还是数据集txt文件 *****************'''if model_path.split('.')[-1] == 'off':print('model path is ********', model_path) # model_path:'./airplane.off'do_model(model_path, image_dir)elif model_path.split('.')[-1] == 'txt':with open(model_path) as f:models = f.read().splitlines()for model in models:one_model = model[:-2]print('model path is ********', one_model) # model_path:'F:\DATA3D\ModelNet10\monitor\train\monitor_0003.off'do_model(one_model, image_dir)else:print('......Please input correct parameters......')exit(-1)
'''****************************************************************'''def install_off_addon():try:bpy.ops.wm.addon_install(overwrite=False,filepath=os.path.dirname(__file__) +'/blender-off-addon/import_off.py')bpy.ops.wm.addon_enable(module='import_off')except Exception:print("""Import blender-off-addon failed.Did you pull the blender-off-addon submodule?$ git submodule update --recursive --remote""")exit(-1)def init_camera():cam = D.objects['Camera']# select the camera objectscene.objects.active = camcam.select = True# set the rendering mode to orthogonal and scaleC.object.data.type = 'ORTHO'C.object.data.ortho_scale = 2.def fix_camera_to_origin():origin_name = 'Origin'# create origintry:origin = D.objects[origin_name]except KeyError:bpy.ops.object.empty_add(type='SPHERE')D.objects['Empty'].name = origin_nameorigin = D.objects[origin_name]origin.location = (0, 0, 0)cam = D.objects['Camera']scene.objects.active = camcam.select = Trueif 'Track To' not in cam.constraints:bpy.ops.object.constraint_add(type='TRACK_TO')cam.constraints['Track To'].target = origincam.constraints['Track To'].track_axis = 'TRACK_NEGATIVE_Z'cam.constraints['Track To'].up_axis = 'UP_Y'def do_model(model_path, image_dir):# model_path= 'F:\\DATA3D\ModelNet10_MV\\bathtub\\train\\bathtub_0003.off'# image_dir = 'F:\\DATA3D\\ModelNet10_MV_32_train\\'name = load_model(model_path) # -> name = 'bathtub_0003'center_model(name)normalize_model(name)image_subdir = os.path.join(image_dir, name.split('_')[0], name) # path: image_dir\\bathtub\\bathtub_0003for i, c in enumerate(cameras):move_camera(c)render()save(image_subdir, '%s_%d' % (name, i))delete_model(name)def load_model(model_path):# single .off: model_path='./airplane.off'# dataset.txt: model_path= 'F:\\DATA3D\ModelNet10_MV\\bathtub\\train\\bathtub_0003.off'd = os.path.dirname(model_path) # invalide for .off fileext = model_path.split('.')[-1] # ext: 'off'# Attention!  win10: ..path.split('\\')  linux: ..path.split('/')_model_path_tmp = model_path.split('\\')[-1] # _model_path_tmp: 'bathtub_0003.off'name = os.path.basename(_model_path_tmp).split('.')[0] # bathtub_0003# handle weird object naming by Blender for stl filesif ext == 'stl':name = name.title().replace('_', ' ')if name not in D.objects:print('loading :' + name)if ext == 'stl':bpy.ops.import_mesh.stl(filepath=model_path, directory=d,filter_glob='*.stl')elif ext == 'off':bpy.ops.import_mesh.off(filepath=model_path, filter_glob='*.off')elif ext == 'obj':bpy.ops.import_scene.obj(filepath=model_path, filter_glob='*.obj')else:print('Currently .{} file type is not supported.'.format(ext))exit(-1)return name # name='airplane' -> 'bathtub_0003'def delete_model(name):for ob in scene.objects:if ob.type == 'MESH' and ob.name.startswith(name):ob.select = Trueelse:ob.select = Falsebpy.ops.object.delete()def center_model(name):bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN')D.objects[name].location = (0, 0, 0)def normalize_model(name):obj = D.objects[name]dim = obj.dimensionsprint('original dim:' + str(dim))if max(dim) > 0:dim = dim / max(dim)obj.dimensions = dimprint('new dim:' + str(dim))def move_camera(coord):def deg2rad(deg):return deg * math.pi / 180.r = 3.theta, phi = deg2rad(coord[0]), deg2rad(coord[1])loc_x = r * math.sin(theta) * math.cos(phi)loc_y = r * math.sin(theta) * math.sin(phi)loc_z = r * math.cos(theta)D.objects['Camera'].location = (loc_x, loc_y, loc_z)def render():bpy.ops.render.render()def save(image_dir, name):path = os.path.join(image_dir, name + '.png')D.images['Render Result'].save_render(filepath=path)print('save to ' + path)if __name__ == '__main__':main()

代码需要你关注的地方 我都已经加了注释,其余部分基本不需要你修改,并且我直接加了对输入的判断,尽可能减少你们的工作量。

!!!!!!!!!!!!上述代码不能直接运行!!!!!!!!!!!!
2.3 python和blender联合使用生成多视角图像
我之前在写第一篇blender方法之第一步的时候,是在ubuntu系统上实现的,但是后续我就换到了win10上,所以第一篇我没有添加win10上的安装和设置步骤,一没时间二是步骤基本相同,但是接下来的步骤就要有所不同了,仔细听我慢慢道来。为了两个系统我是煞费苦心啊。。。。。
代码我整理合成了两种方法:

一种是输入单个off文件生成多视角图像,主要是为了让你方便调整参数,测试你想要的结果,这也是我最开始操作的方法;
一种是直接输入dataset.txt文件,代码会一次性把数据集全部生成多视角图像,为了保险起见,强烈建议您先使用单个off文件输入方法确定是您想要的结果,再对整个数据集进行处理。
命令行执行说明:
<blender安装路径> phong.blend --background --python phong.py -- <输入off路径> <输出保存多视角图像路径>
1
需要注意不同系统,第一个blender的差异,我最开始就蛋疼在这一步! 下面逐一说明具体使用方法。

2.3.1 单个.off文件生成多视角图像
ubuntu系统
blender phong.blend --background --python phong.py -- ./single_off_samples/airplane_0001.off ./single_samples_MV
win10系统
"C:\\Program Files\\Blender Foundation\\Blender\\blender.exe" phong.blend --background --python phong.py -- .\\single_off_samples\\airplane_0001.off .\\single_samples_MV
2.3.2 数据集txt生成多视角图像
ubuntu系统
blender phong.blend --background --python phong.py -- dataset.txt ./dataset_samples_MV
win10系统
"C:\\Program Files\\Blender Foundation\\Blender\\blender.exe" phong.blend --background --python phong.py -- dataset.txt .\\dataset_samples_MV
为了方便你们运行代码,我上传代码同时也上传了单个off文件,并且也制作了一个很小的数据集
2.4 最想要的开箱即用代码
代码全部上传至GitHub,包括开箱即用源码和数据集,代码可直接使用。

https://github.com/zeaggler/ModelNet_Blender_OFF2Multiview
使用步骤如下:

文件夹下打开命令行,方法有很多,我为了方便直接右键打开了以示说明

命令行中输入单个off文件命令

执行过程类似下图

生成的多视角图像如下,设置角度间隔为30,所以一共获取360/30=12个视角的图像

===========================我是一条分割线===========================
1
问题汇总:
1.blender版本问题
我在文中所用版本为blender v2.79b,其他版本并未测试,如果有网友看到,有用v2.8x版本成功的可以留言确认一下,谢谢了。
blender v2.79b版本下载地址:

https://download.blender.org/release/Blender2.79/blender-2.79b-windows64.zip

其余os地址可以在下面地址自己查找:

https://download.blender.org/release/Blender2.79/

2. Import blender-off-addon failed
这个问题暂时不知道是什么原因,在看我解决办法之前,一定要确保按照我的步骤全部走完了,不然您改了代码后,还会出现其他问题。
如果addon安装成功,仍然出现“did you pull the xxxx”,可以注释phong.py中的下图这行代码,跳过错误提示即可。
————————————————
版权声明:本文为CSDN博主「柚有所思」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jorg_zhao/article/details/88345324

3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第二步)相关推荐

  1. 3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第一步)

    3D物体分类---ModelNet .OFF格式生成多视角图像(Blender方法之第一步) 强烈建议使用Blender方法!!! 说明 1. ModelNet .OFF格式生成多视角图像方法(Ble ...

  2. 基于pointnet的3D物体分类和分割检测(复现不出来你直接敲我家门)

    录 前言 一.资料下载 1.代码下载 2.数据集下载 二.环境配置 1.本文采用设备配置说明 2.虚拟环境配置 三.训练部分 1.分类训练部分 2.分割的训练部分 四.预测部分 1.分类结果展示 2. ...

  3. 超分辨率重建生成低分辨率图像,生成降质图像公认方法代码

    目录 1背景 2.BI 3.BD 4.DN 5总结 1背景 超分辨率重建中经典的生成降质图像通常使用MATLAB实现的,通常有四种方法: 类型 说明 BI bicubic-down BD blur-d ...

  4. 用PHP生成等比图像的方法

    PHP代码 <?php /************************************************************************ * 函数名称:crea ...

  5. H5播放器标签video播放mp4格式有声音没有图像解决方法

    在使用h5的video标签播放视频很方便,但是有时会出现有声音没有图像的情况,这个时候我们考虑一下视频编码的问题 下载转换工具,对视频进行格式的变化,视频编码选择AVC(H264)这样就可以直接播放了 ...

  6. 图像物体分类与检测算法综述

    图像物体分类与检测算法综述 转自<计算机学报> 目录 图像物体分类与检测算法综述 目录 图像物体分类与检测概述 物体分类与检测的难点与挑战 物体分类与检测数据库 物体分类与检测发展历程 图 ...

  7. CVPR2021|基于分类深度分布网络的单目3D物体检测

    1.要解决的问题 单目3D物体检测核心问题是如何准确估计物体的深度信息.已有方法尝试显式地或隐式地学习深度信息. 显式地学习存在的问题:1:深度估计的过度置信.一些方法[14,38,39,62]通过深 ...

  8. 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )

    文章目录 一.向 Unity 中添加 FBX 模型 二.向 Scene 场景中添加 FBX 模型 三.3D 物体渲染 四.3D 物体材质设置 一.向 Unity 中添加 FBX 模型 Unity 中使 ...

  9. 自动驾驶中的3D物体状态检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 摘要 3D物体检测是自动驾驶的一项重要技术,KITTI提供了一种用 ...

最新文章

  1. 常用的css3的新属性
  2. OpenCV Python教程(1、图像的载入、显示和保存)
  3. 柳昀哲课题组在Nature Reviews Neuroscience上发表长篇综述提出表征富集理论
  4. 优秀Java开发者的10条共性
  5. Potplayer使用必看
  6. metasploit终端命令大全 MSF
  7. 《树莓派渗透测试实战》——2.12 用例子总结以上步骤
  8. 记一次.NET 与R语言交互
  9. c语言连接mysql_聊聊数据库MySQL、SqlServer、Oracle的区别,哪个更适合你?
  10. JavaScript中的嵌套事件处理(在鼠标移动事件上)
  11. 手把手带你玩转Tensorflow 物体检测 API (1)——运行实例
  12. 设备管理器android感叹号,设备管理器其他设备感叹号
  13. Web前后端笔记-vue cli及java进行AES加解密
  14. 【Flink】Flink实验特性--reinterpretAsKeyedStream 将DataStream重新解释为KeyedStream
  15. 拉普拉斯定理_拉普拉斯妖:通晓宇宙一切,深知过去未来,最终被量子力学终结!...
  16. 给 Vuepress 和 ElementUI 添加夜间暗色模式
  17. 数据结构上机实验1——线性表——班级管理系统
  18. 岁月温柔-24 妈妈转到省医院第4天
  19. 3D游戏物理开发引擎Panda3D基础
  20. 面向单片机编程(三)- 数码管显示

热门文章

  1. 解决windows图片查看器背景色变成米黄色
  2. Android开发RSS阅读器
  3. Linux0.11中对文本文件进行修改的策略
  4. Android--判断发送短信后的状态/发送成功Or发送失败
  5. Mysql/Mairadb主从复制
  6. Qemu之Network Device全虚拟方案
  7. 回收站功能在 Linux 中的实现
  8. 阿里巴巴云舒:弹性计算的安全问题
  9. 快速整理excel_3小时整理了33个excel动图技巧,能快速提高工作效率,收藏备用吧...
  10. feignclient对象找不到_为什么我找不到对象呢,一个33岁大龄剩女的疑惑