我正在使用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轴。