我需要解释一下霍夫代码的具体部分(opencv/c++)

I need to explain the specific part of the Hough code(opencv/c++)

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

为什么要进行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));
    }

您可能已经知道,C/C++ int(短整型和无符号短整型)变量通常以 16 位存储,而 C/C++ 数组将其元素存储在 RAM 中的连续位置内存。

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

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

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

"shift" 变量可以轻松更改 "unsigned int" 变量的大小,可能是为了以防万一他们需要为不同的体系结构进行编译,而这种变量类型不是以 2 字节存储的。

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