我有一个RGB-D图像,我正在尝试在matlab中进行3D可视化。目前我在做:
depth = imread('img_031_depth.png');
depth = double(depth);
img = imread('img_031.png');
surf(depth, img, 'FaceColor', 'texturemap', 'EdgeColor', 'none' )
view(158, 38)
这给了我一个像这样的图像:
我有两个问题:
1)如何在不模糊的情况下保存图像
2)如你所见,有些边缘显示为零(例如咖啡杯的顶部),我想删除这些。
我想要制作的是一个3D外观点云,因为它们只有2.5D我必须从正确的角度显示它们。
感谢任何帮助
编辑:添加图像(注意深度图像需要标准化以便可视化)
答案 0 :(得分:2)
如果您只对点云感兴趣,可以考虑scatter3
。
您可以选择要绘制的点(丢弃depth
== 0)。
你需要有明确的x-y坐标。
[y x] = ndgrid( 1:size(img,1), 1:size(img,2) );
sel = depth > 0 ; % which points to plot
% "flatten" the matrices for scatter plot
x = x(:);
y = y(:);
img = reshape( img, [], 3 );
depth = depth(:);
scatter3( x(sel), y(sel), depth(sel), 20, img( sel, : ), 'filled' );
view(158, 38)
修改采样版本
[y x] = ndgrid( 1:2:size(img,1), 1:2:size(img,2) );
sel = depth( 1:2:end, 1:2:end ) > 0;
x = x(:);
y = y(:);
img = reshape( img( 1:2:end, 1:2:end, : ), [], 3 );
depth = depth( 1:2:end, 1:2:end );
scatter( x(sel), y(sel), depth(sel), 20, img( sel, : ), 'filled' );
view( 158, 38 );
或者,您可以直接操作sel
掩码。
答案 1 :(得分:1)
我建议您首先恢复x = zu / f和y = zv / f,以获得x,y,z,其中f是您的相机焦距;
然后在显示它们之前应用你想要的任何旋转,平移[x',y',z'] = R [x,y,z] + t;
然后使用col = xf / z + w / 2,row = h / 2-yf / z将它们投影回来,以获得一个可以快速显示的简单图像;您可以为上一次操作添加深度缓冲区以保证
通过在每个像素处写入深度来确定重复写入,并且仅在新z较小(即新像素接近观察者)时才检查重复写入。由于点云的性质,得到的图像仍然会有孔。您可以在这些孔中进行插值,但这意味着您必须跟踪从图像中的每个像素到点云的光线,并找到光线的最近邻居,这可能在Matlab中永远存在。
答案 2 :(得分:1)
我也正在做一些3D图像恢复和重建。第一个问题很简单。你的照片是由相机拍摄的。因此,您需要将位置转换为摄像机坐标系。换句话说,你需要知道你的相机的一些内在价值!或者你永远无法用一张图片恢复它。谷歌的kinect内在价值'你可以得到焦距等 另外,更改您的视图。 试试这个!如果它不起作用,请再次询问。