与PCA的边界框

时间:2013-07-30 09:13:52

标签: pca bounding-box point-cloud-library point-clouds

我尝试用PCA创建一个Oriented Bounding Box。在图像中,您可以看到我的结果:

enter image description here

  • 红点:点云
  • 蓝色载体: PCA组件

我试图在矢量上投射点,以获得最小值,最大值和平均值。

但是我现在如何定义我的盒子呢?有什么想法吗?

我想得到一个像:质心的盒子,以及两个方向的最大最大值。

1 个答案:

答案 0 :(得分:0)

你的问题不是关于PCA, 关于如何处理平面中的点和线: 移动点,并将点投射到一条线上。 (有关基础知识,请仔细阅读 SO questions/tagged/2d+geometry, 或者用这些标签问一个新问题。) 没有那些基础知识,还有一点Python或Matlab, 这个小Python程序没有任何意义, 但无论如何它在这里:

from __future__ import division
import numpy as np  # http://www.numpy.org/

def pcabox( Pointcloud, Pca1, Pca2 ):
    """ Lo1, Hi1, Lo2, Hi2 = pcabox( Pointcloud, Pca1, Pca2 )
        In: Pointcloud: an N x 2 array of points
        In: Pca1, Pca2: unit vectors at right angles, from PCA
        Out: Lo1, Hi1, Lo2, Hi2: midpoints of the sides of a bounding box
    """
        # convert inputs to numpy arrays (if they aren't already) --
    Pointcloud = np.asarray(Pointcloud)
    Pca1 = np.asarray(pca1)
    Pca2 = np.asarray(pca2)
        # check N x 2 --
    assert Pointcloud.ndim == 2  and  Pointcloud.shape[1] == 2, Pointcloud.shape

    C = np.mean( Pointcloud, axis=0 )  # the centre of all the points
    Pointcloud = Pointcloud - C  # shift the cloud to be centred at [0 0]

        # distances along the long axis t * Pca1 --
    Dist1 = np.dot( Pointcloud, Pca1 )
    Lo1 = Dist1.min() * Pca1
    Hi1 = Dist1.max() * Pca1
        # and along the short axis t * Pca2 --
    Dist2 = np.dot( Pointcloud, Pca2 )
    Lo2 = Dist2.min() * Pca2
    Hi2 = Dist2.max() * Pca2

    return [Lo1, Hi1, Lo2, Hi2] + C  # 4 points