2016-04-27 6 views
4

У меня есть 2 набора данных, полученных от kinect 1- глубина изображения размером 480 * 640 (uint16) из сцены 2- цветное изображение с таким же размер (480 * 640 * 3 одиночный) из той же сцены Вопрос в том, как объединить эти данные для создания цветных 3D-облаков точек с PLY-форматом в Matlab. Мне нужно сказать, что, к сожалению, у меня больше нет доступа к kinect, и я должен использовать только эти данные.Как создать 3D-облако точек из изображения глубины и цветного изображения, полученного у Matlab

ответ

1

Я никогда не пытался сделать это в MATLAB, но я думаю, что это то, что вы ищете:

http://es.mathworks.com/help/vision/ref/pcfromkinect.html

Инструмент находится внутри Computer Vision System Toolbox ™.

+0

Не будет работать без устройства kinect. – havakok

0

Хороший вопрос. Вы должны использовать этот учебник от Burrus - в основном вам нужно использовать информацию о глубине, чтобы преобразовать центрифуги цвета/глубины в 3-мерное измерение. Имейте в виду, что потоки глубины и цвета Kinect v1 слегка несовместимы, поэтому учитывайте это также.

В учебнике можно найти здесь: http://nicolas.burrus.name/index.php/Research/KinectCalibration Вы можете также использовать произведение этого автора: Khoshelham, К., & Elberink, SO (2012) - Точность и разрешение данных глубины Kinect для применения внутри помещений отображения

Код в MATLAB должен быть примерно таким:

% All formulas and values from: 
% Khoshelham, K., & Elberink, S. O. (2012). 
% Accuracy and resolution of Kinect depth data for indoor mapping applications. 
% Sensors (Basel, Switzerland), 12(2), 1437–54. doi:10.3390/s120201437 

load('janFrameThousand.mat') 
pc=zeros([size(D) 3]); 
W=size(D,2); 
H=size(D,1); 
f=5.453; 
for indWidth = 1:W 
    for indHeight= 1:H 
     % copy z value 
     pc(indHeight,indWidth,3)=D(indHeight,indWidth); 
     % calc x value 
     pc(indHeight,indWidth,1)=-(pc(indHeight,indWidth,3)/f)*... 
      ((indWidth-W/2)*0.0093+0.063); 
     % calc y value 
     pc(indHeight,indWidth,2)=-(pc(indHeight,indWidth,3)/f)*... 
      ((indHeight-H/2)*0.0093+0.039); 
    end 
end 
X=pc(:,:,1); 
% X=X(:); 
Y=pc(:,:,2); 
% Y=Y(:); 
Z=-pc(:,:,3); 
Z(Z==0)=NaN; 

Surface=surf(X,Y,Z,'edgecolor','none','facecolor','interp'); 
lighting gouraud 
camlight 
% colormap(repmat(winter,20,1)) 
axis image 
axis vis3d 
xlabel('X axis') 
ylabel('Y axis') 
zlabel('Z axis') 
+0

После прочтения статьи я все еще озадачен, поэтому я сумку несколько вопросов о вас. Почему вы взяли f = 5.453? Это ваши собственные значения калибровки? 0,063 и 0,039 являются дельта x и y? что представляет собой 0,0093? – havakok

+0

из того, что я помню из этого, они связаны с внутренними параметрами Kinect v1. – 16per9