3D物体分类---ModelNet .OFF格式生成多视角图像(Mat方法之第二步))
强烈建议使用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
- 首先要实现Blender对.OFF文件的读取与显示
- Mat方法
- 首先将.OFF文件转为.MAT文件(可生成不同视角的.MAT)
https://blog.csdn.net/jorg_zhao/article/details/86647696 - 然后用python将不同视角的.MAT文件转为多视角图片
https://blog.csdn.net/jorg_zhao/article/details/88345366
- 首先将.OFF文件转为.MAT文件(可生成不同视角的.MAT)
2. python将不同视角的.MAT文件转为多视角图片
2.1 数据格式说明
实际上经过步骤一得到的.MAT文件是这种的:
-ModelNet10_voxelized_mat
|--bathtub
|--- bathtub_0001.off
|---- bathtub_0001_01.mat
|---- bathtub_0001_02.mat
...
|---- bathtub_0001_32.mat
|--- bathtub_0002.off
|---- bathtub_0002_01.mat
|---- bathtub_0002_02.mat
...
|---- bathtub_0002_32.mat
.....
|--- bathtub_0300.off
|---- bathtub_0300_01.mat
|---- bathtub_0300_02.mat
...
|---- bathtub_0300_32.mat
|--bed
|--- bed_0001.off
|---- bed_0001_01.mat
|---- bed_0001_02.mat
...
|---- bed_0001_32.mat
对于每一个.off文件都生成了32个视角的.MAT文件,虽然.MAT文件是三维结构,可以通过matlab显示,并可由鼠标进行操作旋转,但是如果只单单获取一个视角mat文件,对MAT2PNG的方法就会造成很大的麻烦,所以步骤一对每一个.off文件保存了32个不同视角的mat文件。
2.2 如何将三维MAT文件投影为图片格式呢?
- 依赖库:
pip install mayavi
利用mayavi库实现对mat文件的显示和保存,具体代码如下:
def voxel_mat2img(mat_filepath, png_filepath):
mlab.clf()
mlab.contour3d(mat_filepath)
f = mlab.gcf()
mlab.savefig(png_filepath)
mat_filepath 是 xx.mat文件路径
png_filepath 是 转为png格式的路径
代码运行单个.mat文件转为的png格式图片:
实际上png_filepath可以由mat_filepath名字自动获取,我在演示代码中这么应用的
import numpy as np
import mayavi.mlab as mlab
from scipy.io import loadmat
import time, os
mat_filepath = 'bathtub_0107_16.mat'
# function: voxel mat 2 image(.png)
def voxel_mat2img(mat_filepath, png_filepath):
mlab.clf()
mlab.contour3d(mat_filepath)
f = mlab.gcf()
mlab.savefig(png_filepath)
print(png_filepath, 'saved ##############')
if __name__ == '__main__':
voxelmat_ = loadmat(mat_filepath)['instance']
png_filepath = mat_filepath.split('.')[0] + '.png'
voxel_mat2img(voxelmat_, png_filepath)
当然,为了更简单的让你运行这段代码,我上传了两个.mat文件,实测代码无误。
此外,为了能够对ModelNet整个数据集自动处理,我也上传了我的代码,代码名为Modelnet_mat2png_Modelnet10.py,但是我的代码太具有针对性,实际需要你更改的不少,所以建议你看一下上段代码,便于你修改路径。
2.3 你想要的代码地址
最直接粗暴的就是上代码,简单明了!
但是
但是
但是
但是,需要说明的是,其实这种方法是比较麻烦的,而且必须显示出图像来才能保存,呵呵哒,所以很麻烦,
强烈建议你们看blender方法!!!
强烈建议你们看blender方法!!!
强烈建议你们看blender方法!!!
Github地址 |
---|
https://github.com/zeaggler/ModelNet_Mat2PNG |