我正在使用XNA来构建一个项目,在该项目中,可以使用LCD投影仪和单色相机在墙壁上绘制“涂鸦”,该单色相机经过过滤后只能看到手持激光点指示器。我想使用任何数量的激光笔-一点也不在乎区分它们。

墙是10'x 10',而相机只有640x480,因此我尝试使用此处概述的样条曲线使用亚像素测量:tpub.com

相机的运行速度为120fps(8位),因此,我想向所有人提出的问题是找到亚像素激光点中心的最快方法。目前,在进行样条插值之前,我正在使用2D蛮力搜索来找到图像上最亮的像素(0-254)。这种方法不是很快,并且每帧花费在计算机上的时间比它们进入的时间更长。

编辑:为明确起见,最后,我的相机数据由指示像素亮度的2D字节数组表示。

我想做的是使用XNA着色器为我处理图像。那可行吗?据我了解,实际上没有一种方法可以将持久性变量(例如运行总计,平均值等)保留在Pixel Shader中。

但是为了论证,假设我使用蛮力找到了最亮的像素,然后使用texcoords将它们及其相邻的样条曲线像素存储为X个顶点。那么使用HLSL通过texcoords计算样条曲线是否可行?

我也乐于接受XNA之外的建议,例如DX10/DX11,也许是某种FPGA等。我只是对使用这种方式处理数据的方法并没有太多的经验。我认为他们是否可以使用2节AA电池在Wii-Mote上做类似的事情,而不是我可能会以错误的方式解决。

有任何想法吗?

最佳答案

如果要获得亚像素精度,则需要处理一些非常复杂的数学运算。我认为this paper是要考虑的事情。不幸的是,您必须付费才能在该网站上看到它。如果您可以访问合适的库,他们也许可以为您提供帮助。

原始帖子中的链接建议为每个轴进行1000个样条计算-它独立地处理x和y,这对于圆形图像来说可以,但是如果图像是椭圆形则有点偏离。您可以使用以下方法得出合理的估算值:

xc =总和(xn.f(xn))/总和(f(xn))

其中xc是平均值,xn是沿x轴的点,f(xn)是在点xn的值。所以为此:

          *
       *  *
       *  *
       *  *
       *  *
       *  *
       *  *  *
    *  *  *  *
    *  *  *  *
 *  *  *  *  *  *
------------------
 2  3  4  5  6  7

给出:

总和(xn.f(xn))= 1 * 2 + 3 * 3 + 4 * 9 + 5 * 10 + 6 * 4 + 7 * 1

总和(f(xn))= 1 + 3 + 9 + 10 + 4 + 1

xc = 128/28 = 4.57

并重复y轴。

10-06 08:21