我正在使用XNA建立一个项目,我可以使用LCD投影机和单色相机在墙上绘制“涂鸦”,该照相机被过滤,只能看到手持激光点指针.我想使用任何数量的激光笔 – 在这一点上并不关心区分它们.
墙壁是10’x 10′,相机只有640×480,所以我试图使用子像素测量使用样条曲线,如下所示:tpub.com
相机以120fps(8位)运行,所以我的问题是您找到该子像素激光点中心的最快方法.目前,在进行样条插值之前,我正在使用强力2D搜索来找到图像上最亮的像素(0 – 254).这种方法不是很快,每个框架比计算机花费更长的时间.
编辑:为了澄清,最后我的相机数据由表示像素亮度的二维字节数组表示.
我想做的是使用XNA着色器来缩小图像.这是否实用?从我所理解的,真正没有办法在像素着色器中保持持久变量,例如运行总计,平均值等.
但是为了争论的缘故,我们假设我使用暴力找到最亮的像素,然后使用texcoords将它们和它们的样条曲线的相邻像素存储为X个顶点.使用HLSL可以使用texcoords来计算样条曲线吗?
我也可以在我的XNA框外提出建议,无论是DX10 / DX11,也许某种FPGA等.我只是没有太多的经验,以这种方式来处理数据.我想,如果他们可以使用2节AA电池在Wii-Mote上做这样的事情,那我可能就这样做错了.
有任何想法吗?
解决方法
如果您想要亚像素精度,您正在处理一些非常复杂的数学问题.我认为
this paper是值得考虑的.不幸的是,您必须付费才能使用该网站查看.如果您有权访问一个合适的图书馆,他们可能会为您保留.
原始帖子中的链接建议对每个轴进行1000次样条计算 – 它独立地处理x和y,这对于圆形图像是好的,但是如果图像是偏斜的椭圆,则有点偏离.您可以使用以下内容获得合理估计:
xc = sum(xn.f(xn))/ sum(f(xn))
其中xc是平均值,xn是沿x轴的一个点,f(xn)是xn点处的值.所以为此:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * ------------------ 2 3 4 5 6 7
得到:
sum(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轴重复.