我写了一段需要优化的代码。只是想与社区核实一下该代码是否确实是最佳的。它填充霍夫变换的累加器。实际上,我只是复制粘贴了 OpenCV 库中的大部分代码。谢谢!
int i,j,n,index;
for (i = 0;i<numrows;i++)
{
for (j = 0;j<numcols;j++)
{
if (img[i*numcols + j] == 100)
{
for (n = 300;n<600;n++)
{
index = cvRound(j*tabCos[n] + i * tabSin[n]) + (numrho-1)/2;
accum[(n+1) * (numrho+2) + index+1]++;
}
}
}
}
我也模糊地附加了一段代码,其中有一个大型且重复的霍夫变换。这部分代码的维护者一直在尝试稀疏数组(实际上是一个 C++std::map
如果我理解他的演示正确的话,请键入单元格索引),累加器取得了一些成功。
我认为加速与缓存局部性问题有关,并且它当然取决于数据being sparse.
Update:上面引用的软件旨在服务于许多粒子物理实验,但最初用于试验台项目(即小规模)。当我们开始认真做更大的项目并开始为它们做蒙特卡罗时,即使对于稀疏矩阵,霍夫变换也再次成为了一个瓶颈。
到目前为止我们还没有解决方案,但一位同事发现Gandalf http://gandalf-library.sourceforge.net/包括“快速霍夫变换” http://gandalf-library.sourceforge.net/tutorial/report/node134.html,它似乎以类似四叉树的方式评估变换(在 2D 中,大概您在 3D 中使用八叉树)以减少工作顺序。我们可能会对此进行实验。
进一步更新:一位同事最终在我们的代码中实现了渐进式概率霍夫变换,这似乎是我们目前最快的版本。如果您不需要将每个点分配给一条线,则效果最好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)