快速亚像素激光点检测

buf*_*erz 10 c# xna visual-studio-2008

我正在使用XNA构建一个项目,我可以使用液晶投影仪和单色相机在墙上画"涂鸦",过滤后只能看到手持激光点指针.我想使用任意数量的激光指针 - 此时并不关心区分它们.

墙是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上做这样的事情,那么我可能会以错误的方式解决这个问题.

有任何想法吗?

Dav*_*ard 5

如果通过暴力强迫你的意思是独立地观察每个像素,它基本上是唯一的方法.无论您想对图像做什么,都必须扫描所有图像像素.虽然您可能不需要找到最亮的像素,但您可以按颜色过滤图像(例如:如果使用红色激光).使用HSV彩色编码图像可以轻松完成.如果您正在寻找更快的算法,请尝试OpenCV.它已经被反复优化用于图像处理,您可以通过包装器在C#中使用它:

[ http://www.codeproject.com/KB/cs/Intel_OpenCV.aspx] [1 ]

OpenCV还可以帮助您轻松找到点中心并跟踪每个点.

您是否有使用120fps相机的原因?你知道人眼只能看到大约30fps吗?我猜测它是跟随非常快速的激光运动...你可能想要考虑降低它,因为实时处理120fps将很难实现.


Ski*_*izz 3

如果您想要亚像素精度,您就需要处理一些相当复杂的数学问题。我认为这篇论文值得考虑。不幸的是,您必须付费才能使用该网站观看它。如果您可以访问合适的图书馆,他们也许可以为您找到它。

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

x c = 总和 (x n .f(x n )) / 总和 (f(x n ))

其中 x c是平均值,x n是沿 x 轴的 a 点,f(x n ) 是点 x n处的值。所以对于这个:

          *
       *  *
       *  *
       *  *
       *  *
       *  *
       *  *  *
    *  *  *  *
    *  *  *  *
 *  *  *  *  *  *
------------------
 2  3  4  5  6  7 
Run Code Online (Sandbox Code Playgroud)

给出:

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

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

xc = 128 / 28 = 4.57

并对 y 轴重复此操作。