Мне нужно объяснить специфическую часть кода Hough (opencv / c ++) - PullRequest
0 голосов
/ 17 мая 2019

Эта часть Преобразования Хафа трудна для меня.

Почему 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));
    }

1 Ответ

0 голосов
/ 17 мая 2019

Как вы, возможно, уже знаете, переменные C / C ++ int (short и short unsigned) часто хранятся в 16 битах, а массивы C / C ++ хранят свои элементы в последовательных позициях в оперативной памяти.

Это означает, чточто до тех пор, пока вы знаете адрес первого элемента массива и количество байтов на элемент, вы можете вручную перемещать массив, увеличивая значение указателя (которое является просто 64-битным числом).

Toответьте на ваш вопрос, они вручную увеличивают значение указателя, чтобы пересечь набор координат, используя указатели вместо позиций массива.Операции сдвига - это просто чрезмерно оптимизированные способы увеличения указателя на нужную величину (с точки зрения двоичного числа).

Я не буду обсуждать, почему они это делают или как это меняется между платформами икомпиляторы, но они, вероятно, думали, что это повысит производительность в этом конкретном алгоритме.

Переменная «shift» предназначена для простого изменения размера переменной «unsigned int», вероятно, в случае, если им нужно скомпилировать для разныхархитектуры, где этот тип переменной не хранится в 2 байтах.

Это никак не связано с преобразованием Хафа, и я бы не советовал использовать этот конкретный код для изучения Хафа, если вы не заинтересованы в участии в OpenCV.,В качестве альтернативы я рекомендую эту очень ясную реализацию Python .

...