2013-04-19 5 views
3
  • У меня есть трехмерная геометрическая форма, которую я должен преобразовать в облако точек.
  • Результирующее облако точек можно считать эквивалентным выходу точечного облака из лазерного сканирования объекта.
  • Нет генерация сетки не neeeded
  • Точка, сгенерированная может быть равномерно распределена, или могут быть просто случайным образом разнесены - не имеет значения
  • Форма 3-D может быть представлена ​​в виде 3-D математической формулы
  • Это должно быть сделано с помощью MATLAB
+0

Можете ли вы разместить образец ввода и вывода? как выглядит трехмерная математическая формула? – Nishanth

ответ

4

трудно ответить без примера, но это звучит, как вы просто хотите выполнить montecarlo simulation?

Скажем, ваша форма определяется функцией f и что у вас есть пределы X, Y, хранящиеся в двух векторных элементах, например. xlim = [-10 10], то есть все возможные значения x этой формы лежат между x = -10 и x = 10, тогда я бы предположил, что вы делаете f, возвращаете какой-то код ошибки, если нет значения для конкретной пары x-y. Я собираюсь предположить, что это будет NaN. Так f(x,y) это функция, которую вы пишете, что либо возвращает z, если он может или NaN, если он не может

n= 10000; 
counter = 1; 
shape = nan(n, 3) 
while counter < n 
    x = rand*diff(xlim) + mean(xlmin); 
    y = rand*diff(ylim) + mean(ylim); 
    z = f(x,y) 
    if ~isnan(z) 
     shape(counter, :) = [x, y, z]; 
     counter = counter + 1  
    end 
end 

Таким образом, приведенный выше код будет генерировать 10000 (не уникальный, но это легко адаптировать для) точек случайным образом выборки по вашей форме.

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

for x = xlim(1):xstep:xlim(2) 
    for y = ylim(1):ystep:ylim(2) 
     shape(counter, :) = [x, y, f(x,y)]; 
    end 
end 

или если вы пишете f быть векторизации (предпочтительно)

shape = [(xlim(1):xstep:xlim(2))', (ylim(1):ystep:ylim(2))', f(xlim(1):xstep:xlim(2), ylim(1):ystep:ylim(2)); 

, а затем в любом случае

shape(isnan(shape(:, 3), :) = []; %remove the points that fell outside the shape 
1

Вот код для создания облачного изображения с изображением глубины с камеры PrimeSense.

вход/выход из этой функции:

-inputs 
depth   -depth map 
topleft  -topleft coordinates of the segmented image in the whole image 

-outputs 
pclouds  -3d point clouds 

MatLab код:

depth = double(depth); 
% Size of camera image 
center = [320 240]; 
[imh, imw] = size(depth); 
constant = 570.3; 

% convert depth image to 3d point clouds 
pclouds = zeros(imh,imw,3); 
xgrid = ones(imh,1)*(1:imw) + (topleft(1)-1) - center(1); 
ygrid = (1:imh)'*ones(1,imw) + (topleft(2)-1) - center(2); 
pclouds(:,:,1) = xgrid.*depth/constant; 
pclouds(:,:,2) = ygrid.*depth/constant; 
pclouds(:,:,3) = depth; 
distance = sqrt(sum(pclouds.^2,3)); 

Edit: Этот источник из этой текущей статьи http://www.cs.washington.edu/rgbd-dataset/software.html

Вы можете найти некоторые другие функции Cloud в MatLab и C++, которые могут вас заинтересовать.

Смежные вопросы