0

霍夫变换的这一部分对我来说很难。

为什么要进行 16 位(和 15 位)移位操作,并想知道“-sin”是什么意思。

原始代码:https ://github.com/opencv/opencv/blob/master/modules/imgproc/src/hough.cpp

    a = -ttab[max_n*2+1];
    b = ttab[max_n*2];
    x0 = j;
    y0 = i;
    if( fabs(a) > fabs(b) )
    {
        xflag = 1;
        dx0 = a > 0 ? 1 : -1;
        dy0 = cvRound( b*(1 << shift)/fabs(a) );
        y0 = (y0 << shift) + (1 << (shift-1));
    }
    else
    {
        xflag = 0;
        dy0 = b > 0 ? 1 : -1;
        dx0 = cvRound( a*(1 << shift)/fabs(b) );
        x0 = (x0 << shift) + (1 << (shift-1));
    }
4

1 回答 1

0

您可能已经知道,C/C++ int(short 和 short unsigned)变量通常存储在 16 位中,而 C/C++ 数组将它们的元素存储在 RAM 内存中的连续位置中。

这意味着只要您知道第一个数组元素的地址和每个元素的字节数,您就可以通过增加指针值(这只是一个 64 位数字)来手动横向数组。

为了回答您的问题,他们使用指针而不是数组位置手动增加指针值以横穿坐标集。移位操作只是将指针增加适量的过度优化方法(从二进制数的角度来看)。

我不打算讨论他们为什么这样做或者这在平台和编译器之间是如何变化的,但他们可能认为这会提高这个特定算法的性能。

“shift”变量可以轻松更改“unsigned int”变量的大小,可能是为了以防他们需要为不同的架构进行编译,其中该变量类型不存储在 2 个字节中。

这与 Hough 变换没有任何关系,我建议不要使用此特定代码来研究 Hough,除非您有兴趣为 OpenCV 做出贡献。作为替代方案,我推荐这个非常清晰的Py​​thon 实现

于 2019-05-17T01:26:45.820 回答