采集数据:
通过
color= getdata(colorVid);
depth= getdata(depthVid);
这两个函数,就可以获得424x512的深度数据和1080x1920的RGB数据
colorVid = videoinput('kinect',1);
depthVid = videoinput('kinect',2);
triggerconfig(depthVid,'manual');
triggerconfig(colorVid,'manual');
depthVid.FramesPerTrigger = 1;
depthVid.TriggerRepeat = inf;
set(getselectedsource(depthVid),'EnableBodyTracking','on');
colorVid.FramesPerTrigger = 1;
colorVid.TriggerRepeat = inf;
start(depthVid);
start(colorVid);
trigger(colorVid);
trigger(depthVid);
color= getdata(colorVid);
depth= getdata(depthVid);
imshow(img2,[0 4096])
stop(colorVid);
stop(depthVid);
采集出来的是这样的
不太正常,远处那堵墙成了死黑,而越远应该越白才对。近处也不太正常,笔记本的颜色比桌子还要黑。
后来查了下kinect参数,原来是教室太大了超出了范围。(图片来源见水印):
(确实不如一年前好使了,黑板、笔记本都不太对)
然后
由于深度图是uint16格式,所以要
depth=uint8(double(depth)/4096*255);
转化成uint8格式
坐标映射
网上博客一搜一大把,可惜我太沙雕了…
只好将彩色图手动裁一下
figure
[color,rect] = imcrop(color);
imshow(color);
再imresize一下应付过这一步去了
毕竟对后边也用不着
输出TXT
得到的图像是2个矩阵,把他们转化[x,y,z,r,g,b]这种,一行一行排下去,输出到txt。
[R,L]=size(depth);
data=zeros(R*L,6);
j=0;
for x=1:R
for y=1:L
j=j+1;
z=double(depth(x,y));%必须的必
r=double(color(x,y,1));
g=double(color((x,y,2));
b=double(color((x,y,3));
data(j,:)=[x,y,z,r,g,b];
end
end
save('data.txt','data','-ascii')
运行中有两个注意点
1、必须要double下,虽然data是double格式,x和y也是,但z,rgb都是uint8。matlab会进行格式统一,这样,x和y中大于255的部分全部变成255了(为啥不是zrgb变double?)
2、save的时候注意’-ascii’,否则打开乱码
由于采集中,有许多死黑区域,实际记录时,加了一个if depth(x,y)>0,才记录信息,滤掉无效点。
在MeshLab中绘制
1、图标左起第三个,直接导入txt
2、格式:xyzrgb
区分格式设置为space
3、把shading(底纹)设置none,这样色彩清晰
- 结果:
在matlab中绘制
x=data(:,1);
y=data(:,2);
z=data(:,3);
color(:,1)=data(:,4);
color(:,2)=data(:,5);
color(:,3)=data(:,5);
color=uint8(color);
pcshow([x(:),y(:),z(:)],color);
color是nx3的矩阵
matlab里这个空间坐标系拖着太反人类了啊