分享

三维重构

 lzqkean 2014-04-05
 (一)

空间的三维重构问题按照不同的实际情况来看算法的种类非常多,但核心的思想还是利用三角形来覆盖待重构区域的表面。传统的算法将“覆盖”的思想体现的并不是非常形象,通常只是将待重构区域利用各种方法撒一些点,然后利用三角形来连接这些节点。如:假如已知某物体的空间的三个剖面,那么如何重建这个物体呢?

     第一步:将每个剖面的轮廓线提取出来。

     第二步:从每条轮廓线中取出拐点和端点。

     第三步:利用这些点和三角形来实现物体的重构。

下面是例图:

这个物体由四层剖面中共6条线段得来,可以看到重构过程用下面的一小段程序便可以控制实现。
 三维重构

function f = AreaRecov(mLayer1,mLayer2)

% 此函数采用最短对角线方法重构图像

% 输入:

   mLayer1  第一层的点坐标集 n*3

   mLayer2  第二层的点坐标集 m*3

% 输出:

         输出的三角形顶点集 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,物体表面的弯曲度的重构。事实上由于三角形的计算比较简单,运算量小,才得以广泛的应用。我们同样可以采用二次曲面、三次曲面来重构。关键是如何来判断曲面的弯曲程度,以及如何处理物体表面的光滑程度。

对于这些问题,目前多是着眼于如何更巧妙的设置三角形或曲面。这样往往得到的结果只是针对某一种具体情况下的应用。对于物体的重构人的智能才是根本,可以采用人工智能算法来解决这个问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约