1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/ZJaUl5xu
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
visual hull用于简单、快速地获取三维模型。目前,获取三维模型的方式有,利用传统几何构造技术直接构造模型.利用三维扫描设备对真实物体进行扫描,进而重建出模型.利用从各个视角拍摄的真实物体的多幅图像重建模型.由图像重建三维模型技术又可分为两类:一类是通过多幅深度图像重建模型,另一类是通过多幅照片生成物体的可见外壳visual hull.
4.部分源码
...............................................................
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
cumulCount = zeros(size(voxels,1),1);
for i=1:size(voxel_inds,2)
ind = voxel_inds{i};
img_val = img_vals{i};
voxels(ind, 4) = voxels(ind, 4) + img_val;
cumulCount(ind) = cumulCount(ind) + 1;
end
end
function [img_val, ind, object_points_cam] = GetSilhouetVals(points2D, silhouette)
img_size = size(silhouette);
pi = floor(points2D(1,:));
pj = floor(points2D(2,:));
a = (points2D(1,:) - pi)';
b = (points2D(2,:) - pj)';
object_points_cam = floor([points2D(1,:); points2D(2,:)]);
ind_bad = [];
ind_img = int32(sub2ind(img_size(1:2), object_points_cam(2,:)', object_points_cam(1,:)'));
ind_img(ind_bad) = [];
img_val = silhouette(uint32(ind_img));
ind_img2 = int32(sub2ind(img_size(1:2), object_points_cam(2,:)'+1, object_points_cam(1,:)'));
ind_img2(ind_bad) = [];
img_val2 = silhouette(uint32(ind_img2));
ind_img3 = int32(sub2ind(img_size(1:2), object_points_cam(2,:)', object_points_cam(1,:)'+1));
ind_img3(ind_bad) = [];
img_val3 = silhouette(uint32(ind_img3));
ind_img4 = int32(sub2ind(img_size(1:2), object_points_cam(2,:)'+1, object_points_cam(1,:)'+1));
ind_img4(ind_bad) = [];
img_val4 = silhouette(uint32(ind_img4));
%
ind = 1:size(object_points_cam, 2);
ind(ind_bad) = [];
img_val = (1-a(ind)).*(1-b(ind)).*img_val+...
(a(ind)).*(1-b(ind)).*img_val3+...
(1-a(ind)).*(b(ind)).*img_val2+...
(a(ind)).*(b(ind)).*img_val4;
end
A457