空间的三维重构问题按照不同的实际情况来看算法的种类非常多,但核心的思想还是利用三角形来覆盖待重构区域的表面。传统的算法将“覆盖”的思想体现的并不是非常形象,通常只是将待重构区域利用各种方法撒一些点,然后利用三角形来连接这些节点。如:假如已知某物体的空间的三个剖面,那么如何重建这个物体呢?
function f = AreaRecov(mLayer1,mLayer2)
% 此函数采用最短对角线方法重构图像
% 输入:
% mLayer1 第一层的点坐标集 n*3
% mLayer2 第二层的点坐标集 m*3
% 输出:
% f 输出的三角形顶点集 max(n,m)*3*3 max(n,m)*三个顶点*三维坐标
% 注: 原对角线的重构方法只适用于两层点数相同的情况,
% 现在的算法对原算法进行了一些改动。
[Len1,vTemp2,vTemp3] = size(mLayer1) ;
[Len2,vTemp2,vTemp3] = size(mLayer2) ;
mMaxNum = max([Len1,Len2]) ;
f = zeros(mMaxNum,3,3) ;
if mMaxNum == Len1
vLayer1 = mLayer1 ;
vLayer2 = mLayer2 ;
else
vLayer1 = mLayer2 ;
vLayer2 = mLayer1 ;
Len2 = Len1 ; % 用Len2存储小长度
end
for counter = 1:mMaxNum-1
f(counter,1,:) = vLayer1(counter,:) ;
[f(counter,2,:),mIndexTemp] = NearPoint(vLayer1(counter,:),vLayer2) ;
% 寻找三角形的第三个顶点
if mIndexTemp<=Len2-1 %如果点少的一层还有剩余点
vTemp2 = DistanJudg( vLayer1(counter,1:2),vLayer1(counter+1,1:2),...
vLayer2(mIndexTemp,1:2),vLayer2(mIndexTemp+1,1:2) ) ;
f(counter,3,:) = vLayer2(mIndexTemp+1,:) ;
if vTemp2 == -1
f(counter,3,:) = vLayer1(counter+1,:) ;
end
else % 如果点少的一层没有剩余点,则直接取临点作为第三个顶点
f(counter,3,:) = vLayer1(counter+1,:) ;
end
end
对于这个简单的例子来说实现的很完美,但实际中的问题有如下几点:
1,寻找物体表层的点时会有很复杂的判断问题,即选择哪几个点作为小三角形的定点来连接。
2,是否有外延部分或凹陷部分的判断。也就是说假如例子中的物体不是尖顶的,没有最上的青色部分,是平顶。那么根据什么来判断其是否有尖顶部分。
3,物体表面的弯曲度的重构。事实上由于三角形的计算比较简单,运算量小,才得以广泛的应用。我们同样可以采用二次曲面、三次曲面来重构。关键是如何来判断曲面的弯曲程度,以及如何处理物体表面的光滑程度。
对于这些问题,目前多是着眼于如何更巧妙的设置三角形或曲面。这样往往得到的结果只是针对某一种具体情况下的应用。对于物体的重构人的智能才是根本,可以采用人工智能算法来解决这个问题。