Ограничивающая рамка с PCA

Я пытаюсь создать ориентированную ограничивающую рамку с помощью PCA. На картинке вы можете увидеть мои результаты:

введите здесь описание изображения

  • Красные точки: облако точек
  • Синие векторы: компоненты PCA.

Я попытался спроецировать точки на векторы, чтобы получить минимальное, максимальное и среднее значения.

Но как я могу определить свою коробку сейчас? Любые идеи?

Я хотел бы получить коробку, например: центроид и минимальную максимальную в двух направлениях.


person user2576458    schedule 30.07.2013    source источник


Ответы (1)


Ваш вопрос не столько о 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
person denis    schedule 09.08.2013
comment
Я предполагаю, что он использует PCL (библиотека pointcloud), и ответ должен использовать классы/функции pcl. - person NKN; 22.01.2014