我正在使用XNA构建一个项目,在这个项目中,我可以使用LCD投影仪和单色相机在墙上绘制“涂鸦”,该相机被过滤为只能看到手持激光点指针。我想要使用任意数量的激光指示器--在这一点上,我并不真正关心区分它们。
墙是10‘x 10',而摄像头只有640x480,所以我尝试使用样条曲线进行亚像素测量,如下所示:tpub.com
相机的运行速度是120fps (8位),所以我向大家提出的问题是找到亚像素激光点中心的最快方法。目前,在进行样条插值之前,我正在使用强力2D搜索来找到图像上最亮的像素(0 - 254)。这种方法不是很快,而且每一帧都需要比它们进入计算机更长的时间。
编辑:为了清楚起见,最终我的相机数据是由表示像素亮度的二维字节数组表示的。
我想要做的是使用XNA着色器为我压缩图像。这是实际的吗?据我所知,确实没有办法在Pixel Shader中保留持久变量,如运行总数、平均值等。
但为了便于讨论,假设我使用蛮力找到了最亮的像素,然后使用文本坐标将它们和样条曲线的相邻像素存储到X个顶点中。那么,用HLSL来计算一条使用文本坐标的样条曲线实用吗?
我也对XNA盒子之外的建议持开放态度,可能是DX10/DX11,也许是某种FPGA,等等。我只是没有太多以这种方式处理数据的经验。我想,如果他们可以用2节AA电池在Wii-Mote上做这样的事情,那么我可能就错了。
有什么想法吗?
发布于 2009-07-20 14:18:55
如果你所说的暴力逼迫是指独立地查看每个像素,那么这基本上是唯一的方法。无论你想对图像做什么,你都必须扫描所有的图像像素。虽然你可能不需要寻找最亮的像素,但你可以按颜色过滤图像(例如:如果你使用红色激光)。使用HSV彩色编码图像很容易做到这一点。如果您正在寻找一些更快的算法,请尝试OpenCV。它已经针对图像处理进行了一次又一次的优化,您可以通过包装器在C#中使用它:
[http://www.codeproject.com/KB/cs/Intel_OpenCV.aspx][1]
OpenCV还可以帮助您轻松找到点中心并跟踪每个点。
你使用120fps的相机有什么原因吗?你知道人眼只能看到30fps,对吧?我猜它是为了追随非常快的激光运动。你可能会考虑把它降下来,因为120fps的实时处理将非常难以实现。
发布于 2009-07-20 14:23:31
遍历640*480字节以找到最高字节应该在毫秒内运行。即使是在速度很慢的处理器上。不需要走着色器的路线。
我建议优化你的循环。例如:这真的很慢(因为它在每次数组查找时都做乘法):
byte highest=0;
foundX=-1, foundY=-1;
for(y=0; y<480; y++)
{
for(x=0; x<640; x++)
{
if(myBytes[x][y] > highest)
{
highest = myBytes[x][y];
foundX = x;
foundY = y;
}
}
}这要快得多:
byte [] myBytes = new byte[640*480];
//fill it with your image
byte highest=0;
int found=-1, foundX=-1, foundY=-1;
int len = 640*480;
for(i=0; i<len; i++)
{
if(myBytes[i] > highest)
{
highest = myBytes[i];
found = i;
}
}
if(found!=-1)
{
foundX = i%640;
foundY = i/640;
}这是我无法想象的错误,非常抱歉;^)
发布于 2009-07-20 14:31:38
暴力破解是唯一真正的方法,然而你使用着色器的想法是好的-你可以将暴力破解检查从中央处理器,它只能同时查看少量的像素(大约每个核心1个),到图形处理器,这可能有100+哑核(流水线),可以同时比较像素(您的算法可能需要修改一点,以便与图形处理器的1指令多核心排列很好地工作)。
我看到的最大的问题是你是否能足够快地将数据移动到GPU上。
https://stackoverflow.com/questions/1153806
复制相似问题