Подгонка плоскости к трехмерному облаку точек в Переполнении стека

Я хочу подогнать плоскость к трехмерному облаку точек. Я использую подход RANSAC, где я выбираю несколько точек из облака точек, вычисляю плоскость и сохраняю плоскость с наименьшей ошибкой. Ошибка — это расстояние между точками и плоскостью. Я хочу сделать это в C ++, используя Eigen.

До сих пор я выбираю точки из облака точек и центрирую данные. Теперь мне нужно подогнать самолет к точкам выборки. Я знаю, что мне нужно решить Mx = 0, но как мне это сделать? Пока у меня есть M (мои образцы), я хочу знать x (плоскость), и это соответствие должно быть как можно ближе к 0. Я понятия не имею, где продолжить отсюда. Все, что у меня есть, это мои точки выборки, и мне нужно больше данных. Я чувствую, что вся информация есть, я что-то упускаю.

0

Решение

Из вашего вопроса я предполагаю, что вы знакомы с алгоритмом Ransac, поэтому я избавлю вас от долгих разговоров.

На первом этапе вы выбираете три случайные точки. Вы можете использовать случайный класс для этого, но выбор их не совсем случайно, как правило, дает лучшие результаты. К этим точкам вы можете просто подогнать плоскость, используя Гиперплоскость :: Через.

На втором шаге вы многократно вычеркиваете Гиперплоскость :: absDistance и выполнить подгонку наименьших квадратов к оставшимся. Это может выглядеть так:

Vector3f mu = mean(points);
Matrix3f covar = covariance(points, mu);
Vector3 normal = smallest_eigenvector(covar);
JacobiSVD<Matrix3f> svd(covariance, ComputeFullU);
Vector3f normal = svd.matrixU().col(2);
Hyperplane<float, 3> result(normal, mu);

К сожалению, функции mean а также covariance не являются встроенными, но они довольно просты в коде.

0

Другие решения


По вопросам рекламы [email protected]