Hough变换的累加器填充

时间:2010-11-19 19:16:19

标签: c++ opencv hough-transform

我写了一段需要优化的代码。只是想与社区核实,看看该代码是否确实是最佳的。它填充了Hough变换的累加器。我实际上只是复制粘贴了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]++;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

在一段代码中我有一个大而重复的Hough变换,我也很模糊。这部分代码的维护者一直在尝试使用稀疏数组(实际上是一个C ++ std::map,如果我理解他的表示正确的话,它会在单元索引上键入)累加器并取得一些成功。

我认为加速与缓存局部性问题有关,它当然取决于 稀疏的数据。


更新:上面提到的软件旨在服务于许多粒子物理实验,但最初用于测试床项目(即小规模)。当我们认真做大型项目并开始为他们做蒙特卡罗时,即使使用稀疏矩阵,Hough变换也会变得有点瓶颈。

到目前为止,我们还没有解决方案,但其中一位同事发现Gandalf包括"fast hough transform",它似乎以四叉树的方式评估变换(在2D中,可能是您使用的3D中的oct-tree)以减少工作的顺序。我们可能会尝试这个。

进一步更新:同事最终在我们的代码中实现了渐进的概率Hough变换,目前这似乎是我们获得的最快版本。如果您不要求将每个点分配到一行,则效果最佳。

答案 1 :(得分:1)

不,不是。通过简单的指针算法替换尽可能多的[]用法,以迭代有问题的数组。将不变表达式抽象为局部变量。

然而,第一个问题是,您的探查器是否显示此代码是整个应用程序环境中的瓶颈。如果没有,为什么还要对此进行微观优化?

EDIT:循环微优化 - 更喜欢第二种,因为不需要数组索引(mult与add)

int ints[100];
int i;
int *pi;

for (i = 0; i < 100; ++i)
{
  printf("%d", ints[i]);
}

for (pi = ints; pi < ints + 100; ++pi)
{
  printf("%d", *pi);
}

答案 2 :(得分:0)

根据您的应用程序,有许多方法可以优化Hough变换,并且摆弄低级代码可能是最后一个。 我将从Randomized HT或Multiresolution HT开始,遵循Hybrid方法合并。 我相信首先优化算法会更好。最后一步是使用像CAD内存这样的硬件优化。