在使用 kinect 时,我发现位图及其深度信息不可靠,并且由于某种原因比实际字节数组中的数据更受干扰。
当我尝试通过像这样访问位图来获取最小值和最大值时,我意识到了这一点
for (var y = 0; y < height; y++)
{
var heightOffset = y * width;
for (var x = 0; x < width; x++)
{
var index = ((width - x - 1) + heightOffset) * 4;
var distance = GetDistance(depth[depthIndex], depth[depthIndex + 1]);
但另一方面,当我使用此方法直接访问深度字节数组时,我获得了更好的结果(正如 Stackoverflow 成员 Chris 指出的那样,谢谢你,Chris):
int min2 = int.MaxValue, max2 = int.MinValue;
for (int i = 0; i < depth.Length; i += 2)
{
int dist = GetDistance(depth[i], depth[i + 1]);
if (dist < min2 && dist > 0)
min2 = dist;
if (dist > max2)
max2 = dist;
}
我的问题是:
- 我想计算一定距离间隔内的所有点。
- 然后我想得到他们的实际位置(x,y)。
我如何获得位置或直接将这些点添加到列表中 - 以便采取进一步行动?
我的最终目标是通过计算特定间隔内的像素数来识别某些预定义对象(例如,将球与块区分开来)。
for (int i = 0; i < depth.Length; i += 2)
{
int dist = GetDistance(depth[i], depth[i + 1]);
if (dist < z2 && dist > z1)
a++;
}
假设depth
是一个每行 2 * width
个字节的字节数组,并且height
行,请尝试如下操作:
var points = new List<Point>();
for( int y = 0; y < height; y++ )
for( int x = 0; x < width; x++ )
{
int i = y * width * 2 + x * 2;
int dist = GetDistance( depth[i], depth[i + 1] );
if( dist < z2 && dist > z1 )
points.Add( new Point( x, y ) );
}
显然,您必须将Point
替换为某种类型来表示整数 x/y 对!
您也可以像以前一样使用简单的for (int i = 0; i < depth.Length; i += 2)
来执行此操作,然后从i
计算 x/y 值。(提示:模运算符会给你x值,一个简单的整数除法会得到y,或多或少)