[一]在这里:
http://www.hudo.it/index.php/topic,133.0.html上一节讲到我们可以用 kinect.getRawDepth() 来获取一个代表depth map里所有像素的的数列。这节用一个比较简单的例子讲一下可以如何使用这些数据。
这里我们通过设定一个阈值,只侦测距离小于这个值的点。通过计算出这些点的中心位置,我们就可以实现一个粗糙的hand tracking.
首先在程序开头添加一些全局变量
int dw = 640; //depth map的默认宽度
int dh = 480; //depth map的默认高度
int threshold = 700; //阈值,可以根据你的实际情况自己调整
int[] depth; //一个数列,用来容纳获取的数据
PVector loc; //一个向量,用来代表track到的位置
PVector smoothedLoc; //这个向量用来使track点的移动更顺畅
然后在 draw() 里面:
//这几个一会儿有用,用来计算中心点
int sumX = 0;
int sumY = 0;
int count = 0;
//用两个for loop走遍depth数列,一个横向一个竖向,这样可以知道当前像素的x, y位置
for (int x = 0; x < dw; x++) {
for (int y = 0; y < dh; y++) {
int pixelIndex = y*dw + x; //算出当前像素在数列里的位置。
/* 这里需要注意的是,getVideoImage() 和 getDepthImage() 得到的图像都是镜像过的,但是 getRawDepth()得到的数据是没有镜像过的。*/
int rawDepth = depth[pixelIndex]; //得到当前像素的深度,也就是该点离kinect有多远
if (rawDepth < threshold) {
//假如当前像素深度小于我们给定的值,那么我们就把它的x和y加进总和
sumX += x;
sumY += y;
count++;
}
}
}
//把所有深度小于阈值的点的x和y的总和分别除以总数,就得到了它们的x和y的平均值,也就是中心点(centroid)的位置
if (count != 0) {
loc = new PVector(sumX/count, sumY/count);
}
//用lerp()来使得track点的移动更顺畅
smoothedLoc.x = lerp(smoothedLoc.x, loc.x, 0.3f);
smoothedLoc.y = lerp(smoothedLoc.y, loc.y, 0.3f);
然后你可以利用smoothedLoc来画些东西:
line(width/2, height/2, smoothedLoc.x, smoothedLoc.y);
ellipse(smoothedLoc.x, smoothedLoc.y, 20, 20);
这个例子基本上就是追踪一定距离以内有没有物体,然后算出距离以内所有点的中心点。
当然,这些数据还可以用来做别的事情。下一节会介绍一个Blob Detection的库,可以用来描绘距离内所有像素的轮廓和bounding box等等。