基于visual-hull算法的图像三维重建matlab仿真

简介: 基于visual-hull算法的图像三维重建matlab仿真

1.算法仿真效果
matlab2022a仿真结果如下:

6272d114c0c75242a0b3a3d3b79537c7_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
1650c1b141f55b394556f3511c63973a_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
b284501758f6d0c70a0fd06a9cf07b3d_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
7d4b4fae3e396d3968231225e394ead6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

2.算法涉及理论知识概要
visual hull用于简单、快速地获取三维模型。目前,获取三维模型的方式有:
利用传统几何构造技术直接构造模型.利用三维扫描设备对真实物体进行扫描,进而重建出模型.利用从各个视角拍摄的真实物体的多幅图像重建模型.由图像重建三维模型技术又可分为两类:一类是通过多幅深度图像重建模型,另一类是通过多幅照片生成物体的可见外壳visual hull.
Laurentini 最早提出了可见外壳(visual hulls )的概念,即可见外壳就是由空间物体的所有已知侧影轮廓线决定的该物体的凸包,是一种由形状到轮廓的3D重建技术来构建几何对象。具体方法是,假定场景中的前景物体可以和背景相分离。基于这样的假设,原始图像可以经过阈值化前/背景二值图像,得到轮廓图像(silhouette image)。前景掩膜,所谓的轮廓,是相应3D前景物体的2D投影。伴随着相机外参,轮廓定义了反向投影的通用椎体,该锥体包含这个前景物体。
当利用透视投影的方式从多个视角观察某一空间物体时,在每一个视角上都会得到一条该物体的侧影轮廓线。这条侧影轮廓线和对应的透视投影中心将共同决定一个三维空间中一般形状的锥体,轮廓椎体(silhouette cone)。而由所有已知侧影轮廓线和对应的透视投影中心决定的锥体的intersection相交点,最终将决定一个包含该物体的凸包,即物体的可见外壳。在多数情况下,空间物体的可见外壳是该物体的合理逼近.

  Visual hull(可视外壳)是由Laurentini引入的有形状到轮廓的3D重建技术构建的几何实体。这种技术假定场景中的前景物体可以和背景相分离。基于这样的假设,原始图像可以经过阈值化处理成前/背景二值图像,我们将这种图像称作轮廓图像(silhouette image)。所谓的轮廓,是相应3D前景物体的2D投影。伴随着相机观看参数,轮廓定义了后向投影的涵盖实际物体的通用锥体。这个锥体被称作轮廓锥体(silhouette cone)。两个锥体相交的地方被称作可视外壳,它是实际3D物体的几何边界。

  所以说,可视外壳就是由空间物体的所有已知侧影轮廓线决定的该物体的凸包。当利用透视投影的方式从多个视角观察某一空间物体时,在每一个视角上都会得到一条该物体的侧影轮廓线。这条侧影轮廓线和对应的透视投影中心将共同决定一个三维空间中一般形状的锥体。显然,该物体必将落于这个锥体之内;而由所有已知侧影轮廓线和对应的透视投影中心决定的锥体的交最终将决定一个包含该物体的凸包,这个凸包就是物体的可视外壳。在多数情况下,空间物体的可视外壳是该物体的合理逼近。

  Martin和Aggarwal 最早提出了用多幅照片生成可视外壳的方法。他们利用真实物体在照片上的侧影轮廓线和相关的相机参数实现了物体的三维重建。Chien等人采用八叉树结构来表示物体的可视外壳。这种八叉树结构是通过预先在平行投影照片上生成表示物体的四叉树的基础上建立的。Potmesil和Szeliski同样建立了可视外壳的八叉树表示,但输入改为从任意视角拍摄的透视投影照片。Garcia 等人也提出了一种改进的八叉树表示方法。

3.MATLAB核心程序```object_points3D = [voxels(:,1)'; voxels(:,2)'; voxels(:,3)'; ones(1, length(voxels))];
voxels(:, 4) = zeros(size(voxels(:, 4)));
voxel_inds = {};
img_vals = {};
dmin = depth_range(1);
dmax = depth_range(2);
img_size = size(silhouettes);
for i = 1:size(M,3)
r = M(1:3, 1:3, i);
t = M(1:3, 4, i);
if t == [0;0;0]
continue;
end

center = [-(r')* t; 1]; 

cam_center = repmat(center, 1, size(object_points3D,2));

KM = [K]*M(1:3, 1:4, i);

points2D = KM*object_points3D;
points2D = points2D./[points2D(3,:); points2D(3,:); points2D(3,:)];

cur_silhouette = silhouettes(:,:,i);

pixThresh = mean(cur_silhouette(:)) + std(cur_silhouette(:));
cur_mask = cur_silhouette > pixThresh;
saliencyFlag = zeros(1,size(points2D,2),'logical');
for ii = 1:size(points2D,2)
    if points2D(2,ii) > 1 && points2D(2,ii) < img_size(1) && ...
       points2D(1,ii) > 1 && points2D(1,ii) < img_size(2)
        saliencyFlag(ii) = cur_mask(round(points2D(2,ii)),round(points2D(1,ii)));
    end
end

saliencyFlag = ones(1,size(points2D,2),'logical');

d = sqrt(sum((cam_center - object_points3D).^2, 1));
pts_ind = find(... %d > dmin & d < dmax ...
    points2D(2,:) > 1 & points2D(2,:) < img_size(1) ...
    & points2D(1,:) > 1 & points2D(1,:) < img_size(2) ...
    & saliencyFlag);

 pi = points2D(1,pts_ind);
 pj = points2D(2,pts_ind);


[img_val, ind, object_points_cam] = GetSilhouetVals([pi;pj],  cur_silhouette);

ind = pts_ind(ind);

voxel_inds{i} = ind;
img_vals{i} = img_val;

if(display_projected_voxels)
    figure(fid), 
    imagesc(cur_silhouette);title(i);hold on
    plot(object_points_cam(1,:), object_points_cam(2,:), '.g');hold off

end

end
```

相关文章
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
270 0
|
2月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
132 0
|
2月前
|
算法 机器人 计算机视觉
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
【图像处理】水下图像增强的颜色平衡与融合技术研究(Matlab代码实现)
118 0
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
178 8
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
188 8
|
2月前
|
新能源 Java Go
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
【EI复现】参与调峰的储能系统配置方案及经济性分析(Matlab代码实现)
132 0
|
2月前
|
机器学习/深度学习 编解码 算法
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
172 8
|
2月前
|
机器学习/深度学习 数据采集 测试技术
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
基于CEEMDAN-VMD-BiLSTM的多变量输入单步时序预测研究(Matlab代码实现)
|
2月前
|
编解码 运维 算法
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
【分布式能源选址与定容】光伏、储能双层优化配置接入配电网研究(Matlab代码实现)
176 12
|
2月前
|
人工智能 数据可视化 网络性能优化
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究(Matlab代码实现)
132 9

热门文章

最新文章