Библиотека облаков точек Вращение ограничивающей рамки по осям

Я использую ограничивающую рамку с выравниванием по оси в PCL после кластеризации облаков. Я использую это приложение для обнаружения и отслеживания транспортных средств. Есть ли способ повернуть блок с выравниванием оси в соответствии с облаком, поскольку мне нужна информация о рысканье из поля.

Спасибо

при использовании OOB не создается поле, представляющее транспортное средство. Щелкните здесь, чтобы получить исх. изображение


person Lakshman ram    schedule 06.04.2018    source источник


Ответы (2)


Использование pcl :: MomentOfInertiaEstimation

Официальное руководство по PCL по дескрипторам, основанным на моменте инерции и эксцентриситета.

Если вас интересует рыскание, вам нужно использовать OBB (ориентированную ограничивающую рамку), а не AABB (ограничивающая рамка с выравниванием по оси). AABB, как следует из названия, выровнен по оси и в основном эквивалентен минимальному / максимальному значению каждой координаты. OBB в PCL основан на собственных векторах анализа главных компонентов (направления максимальной дисперсии) .

Код (из учебника) для извлечения OBB:

pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
feature_extractor.setInputCloud (cloud);
feature_extractor.compute ();

pcl::PointXYZ min_point_OBB;
pcl::PointXYZ max_point_OBB;
pcl::PointXYZ position_OBB;
Eigen::Matrix3f rotational_matrix_OBB;
Eigen::Vector3f major_vector, middle_vector, minor_vector;
Eigen::Vector3f mass_center;

feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);
feature_extractor.getMassCenter (mass_center);

Из документации:

Обратите внимание, что для получения OBB каждая вершина данного AABB (указанного с помощью min_point и max_point) должна быть повернута с заданной матрицей вращения (преобразование вращения), а затем позиционирована.

Итак, чтобы получить окончательный OBB - координаты:

Eigen::Vector3f p1 (min_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p2 (min_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p3 (max_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p4 (max_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p5 (min_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p6 (min_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p7 (max_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p8 (max_point_OBB.x, max_point_OBB.y, min_point_OBB.z);

p1 = rotational_matrix_OBB * p1 + position;
p2 = rotational_matrix_OBB * p2 + position;
p3 = rotational_matrix_OBB * p3 + position;
p4 = rotational_matrix_OBB * p4 + position;
p5 = rotational_matrix_OBB * p5 + position;
p6 = rotational_matrix_OBB * p6 + position;
p7 = rotational_matrix_OBB * p7 + position;
p8 = rotational_matrix_OBB * p8 + position;

Использование pcl :: pca

Документация PCL

Учебное пособие на codextechnicanum.blogspot.co. il

Если вас просто интересует вектор направления транспортного средства, предположим, что он находится вдоль основного собственного вектора:

pcl::PCA<pcl::PointXYZ> pca(cloud, true);
Eigen::Matrix3f eigen_vector = pca.getEigenVectors(); // returns a matrix where the columns are the axis of your bounding box    
Eigen::Vector3f direction = eigen_vector.col(0);
person Mark Loyman    schedule 07.04.2018
comment
Спасибо за ваш ответ. Но я попытался использовать OOB, поскольку точки, отраженные от транспортного средства, покрывают только частичную поверхность транспортного средства, которая зависит от положения транспортного средства относительно датчика. Таким образом, OOB не дает прямоугольника, представляющего транспортное средство, если нет плоскости коробки, параллельной земле. - person Lakshman ram; 09.04.2018

Нашел для этого решение. Я использовал OOBB с ограничением вращения только по оси z, поэтому вращение двух других осей не рассматривается.

Eigen :: Vector3f ea = rotational_matrix_OBB.eulerAngles (0, 0, рыскание);

person Lakshman ram    schedule 30.04.2018
comment
Можете поделиться решением, как не включать вращение по оси Z? - person Hector Esteban; 10.05.2020
comment
@VictorSanchez отредактировал мой комментарий. Для OBB вы можете создать матрицу вращения и указать ее в качестве входных данных при создании OBB в PCL. - person Lakshman ram; 13.05.2020