Разрезать изображение облака точек на две половины — Matlab

У меня есть трехмерное изображение облака точек (формат .ply). Мне нужно разрезать его по центру, разделив на две части. Пытался выбрать только половину облака точек, используя следующий код, но случайные точки получаются не те, которые нужны. Используя следующую логику, разделите облако точек пополам (1/2 исходного) и сохраните результат в новом облаке точек. Невозможно правильно разрезать изображение облака из центра и сохранить его в новом облаке.

  stepSize = 1;
  indices = 1:stepSize:(i1.Count)/2;
  pt = select(i1, indices);

Я также проверил следующий код:

points3d = i1.Location;
points3d_1 = points3d(points3d(:, 1) < 100, :);
points3d_2 = points3d(points3d(:, 1) >= 100, :);
ptCloud1 = pointCloud(points3d_1);
ptCloud2 = pointCloud(points3d_2);
pcshow(ptCloud1);
figure
pcshow(ptCloud2);

Оба фрагмента делают то же самое случайным образом, часть делится, и независимо от того, в каком диапазоне я пытаюсь

point3d(:,1)‹диапазон

второй фрагмент всегда представляет собой полное исходное изображение. Также фрагмент изображения содержит фон исходного изображения, как показано ниже. как получить только облачный регион, хранящийся в новых ptCloud1 и ptCloud2.

Ожидаемые результаты Как я могу получить новое нарезанное облако точек. Использование MatalbR2014b

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


person BASEER ULHASSAN    schedule 21.12.2015    source источник
comment
Здесь недостаточно информации. Предоставьте минимальный, полный и проверяемый пример. Как вы определяете, где находится центр облака точек? Какова логика кода, который вы пробовали?   -  person excaza    schedule 21.12.2015
comment
Добавлена ​​деталь. не могли бы вы взглянуть на это   -  person BASEER ULHASSAN    schedule 21.12.2015
comment
Это не отвечает на вопрос, как вы определяете, где находится центр облака точек. Если ваш файл *.ply не создан путем сканирования слева направо, вы получите бесполезные точки данных, которые вы видели. Даже если бы это было отсканировано как таковое, это была бы ужасно ненадежная методология. Вам нужно посмотреть на свои данные в 3D-пространстве и определить, где находится промежуточная плоскость.   -  person excaza    schedule 21.12.2015
comment
Ручное определение является накладным. Я пытаюсь сделать это в общем. но логический код я использовал нарезанное изображение из неожиданного места (не совсем из центра облака).   -  person BASEER ULHASSAN    schedule 21.12.2015
comment
@BASEERULHASSAN У вас нет закодированной логики, вы просто разрезаете свой *.ply файл пополам. Я нигде не говорил, что процесс должен быть ручным, но в какой-то момент вы должны установить критерии для своей промежуточной платы.   -  person excaza    schedule 21.12.2015
comment
Обозначьте ось на рисунке, используя xlabel('X'); ylabel('Y'); zlabel('Z');. Затем посмотрите, есть ли у вас точки с x > 100 в первом облаке точек или точки с x ‹ 100 во втором.   -  person Dima    schedule 22.12.2015


Ответы (1)


Вам нужно будет смотреть на координаты точек, а не только на их индексы.

Допустим, ptCloud — это ваш объект pointCloud, и вы используете MATLAB R2015b или более позднюю версию с набором инструментов Computer Vision System Toolbox.

>> points3d = ptCloud.Location;

дает вам координаты [X, Y, Z] ваших точек облака точек в форме или матрице с 3 столбцами. Допустим, вы хотите разрезать облако точек пополам по оси X плоскостью X = 10. Это можно сделать следующим образом:

points3d_1 = points3d(points3d(:, 1) < 10, :);
points3d_2 = points3d(points3d(:, 1) >= 10, :);
ptCloud1 = pointCloud(points3d_1);
ptCloud2 = pointCloud(points3d_2);
person Dima    schedule 21.12.2015
comment
Это скорее комментарий, чем ответ. - person excaza; 21.12.2015
comment
Позволю себе не согласиться. Baseer явно пытается пространственно разделить облако точек. Он использует индексы, которые не работают, потому что точки не расположены в каком-то определенном порядке. Поэтому ему нужно выбирать точки исходя из того, где они находятся в пространстве, т.е. исходя из их координат. Мой ответ указывает на правильный подход и предлагает лучшие инструменты, доступные в более поздней версии MATLAB. - person Dima; 21.12.2015
comment
Дима. Не могли бы вы посмотреть подробнее и сообщить мне, как я могу получить доступ к координатам, поскольку доступ к координатам облака точек, таким как матрица, невозможен, поэтому я в значительной степени застрял. - person BASEER ULHASSAN; 21.12.2015
comment
@BASEERULHASSAN, почему доступ к координатам точек, как к матрице, невозможен? Как хранятся координаты? Можете ли вы поместить их в матрицу? Как только вы это сделаете, вам нужно будет знать уравнение плоскости, которая пересекает облако точек. Затем вам нужно будет пройтись по точкам и выбрать те, что слева или справа от плоскости. - person Dima; 21.12.2015
comment
Формирование массива и индексирование в круглых скобках с объектами класса pointCloud не допускается. Это сообщение я получаю, когда пытаюсь получить доступ к одной точке облака. - person BASEER ULHASSAN; 21.12.2015
comment
Хорошо, теперь я в замешательстве. Используете ли вы объект pointCloud в панели инструментов системы компьютерного зрения? Затем используйте i1.Location, чтобы получить координаты. Или используйте findPointsInROI для выбора точек внутри 3D-объема. Это странно, потому что в документации сказано, что pointCloud появился только в R2015a. - person Dima; 21.12.2015
comment
проблема пока не решена. Не могли бы вы помочь с примером кода или фрагментом. - person BASEER ULHASSAN; 22.12.2015
comment
Доброе утро. Только что проверил ответ. Я отредактировал проблемы. Я не знаю, почему обработка облака точек так сложна в CVST. - person BASEER ULHASSAN; 22.12.2015