obj转binvox
由于实验需求,用到shapenet数据集,但原始的shapenet数据集只有obj格式的,我要的是把它变成任意分辨率的numpy数组,一个比较好的解决方法是用binvox.exe转化obj文件,把obj文件转化成binvox文件,再用python读进来numpy中。
在实践的过程中也非常简单,用到了一行命令:binvox -c -d 64 model.obj
参数意义
其中-c意义不明,-d后面的参数代表要转化成多大分辨率的,后面是文件名,必须切换到文件所在的路径,我对windows批处理命令不太熟悉,所以都是切换到路径下执行的。
添加环境变量
还需要把binvox.exe文件和viewbinvox.exe文件所在的目录添加到环境变量中,很简单,加到系统变量的Path中就可以了,如果不这样的话就必须把这两个.exe文件移动到obj文件所在的目录,很麻烦。
批处理命令
要处理大量的数据集,还是要用到批处理命令,就用了这一句,回头再好好研究for /r ShapeNetCore.v1/ %%i in (*.obj) do binvox -c -d 64 -cb %%i
其中的ShapeNetCore.v1是路径,后面的binvox命令前面已经讲解了。因为有\r的存在,所以会遍历去找所有的.obj文件,还支持off文件等格式的转化
问题
偶尔转化的模型会出现这样的情况:
obj文件可以直接打开,没有问题
但是转化的binvox文件会有问题
全是0,就很不好,苦恼了很久
解决方法
把-c命令改成-e命令
这样就没有问题了。
修改后的binvox命令以及批处理命令
单个文件命令binvox -e -d 64 model.obj
批处理命令for /r ShapeNetCore.v2/ %%i in (*.obj) do binvox -e -d 64 -cb %%i
可以根据自己需要更改分辨率哦
-c 与-e文件的对比
右边是-e命令可视化效果
可以看到,其实-e文件更好一些,所以尽量使用-e命令吧
如果-c -e同时添加上的话,和只有-e效果是一样的本人还是对binvox不太熟悉,也没看懂-c -e的意义
后续补充:
-c 命令的含义是实例化出来的体素是实心的
-e 命令的含义是实例化出来的体素是空心的
两者并不相同,如果实在想要实心的体素,可以用下面这条命令
binvox -aw -dc -cb -d 64 model.obj
查看体素是实心还是空心的,需要打开命令行窗口,输入
viewvox -ki model.binvox
因为直接双击打开的话,默认是用空心的方式,即使你的体素是实心的,也只能看到空心的体素,所以要用ki命令限制一下
打开体素之后,按s就可以看切片,jk用来控制切片位置。
比如,这样就是空心的
这样就是实心的
第一个是直接双击打开,第二是用-ki命令打开