Угол со знаком в фазе () в OpenCV

В руководстве по OpenCV для функции Phase() (и, следовательно, cartToPolar()) говорится, что она возвращает угол поворота для x- и y-градиентов в диапазоне 0-360 градусов (с параметром TRUE), используя уравнение

atan2(y(i),x(i)) * 180/pi           

Однако, применяя вручную для некоторых случайных значений x/y-градиентов и используя то же вышеприведенное уравнение, я получаю результаты со значениями со знаком

Пример:

Gx=46 и Gy=-22

атан2(-22/46)*180/3,14 = -25,572929

в то время как результаты с использованием Phase() = 334,437073

Да, они под одним и тем же углом, но я хотел бы сохранить знак (если возможно) с помощью функций и без использования ручных итераций. Есть ли функция (или трюк) для этого в OpenCV? Спасибо :)


person Sanny    schedule 12.01.2014    source источник
comment
Привет, извините, если я не объяснил это хорошо, потому что ваш ответ сбивает меня с толку. Он удаляет знак, в то время как я хочу сохранить его, используя встроенные функции opencv (если есть).   -  person Sanny    schedule 01.03.2014
comment
Извините, тогда не понял вопроса. Извини   -  person Micka    schedule 03.03.2014


Ответы (3)


Кажется, я не смог найти функцию в OpenCV, которая делает свое дело. Однако мне осталось только использовать цикл и применить if (angle>180) { angle = angle-360; }

person Sanny    schedule 01.03.2014

Когда вы перебираете каждый пиксель, вычисляйте угол по приведенной выше формуле, но используйте значения float/double и сохраняйте их в соответствующем cv::Mat varName:

for y.rows
 for x.cols
   //calculate angle ( formula from above)
   // Hint: Use same access to G_x and G_y gradients
   *varname*.at<float>(y,x) = angle;
 end for
end for

person Ryad Kovach    schedule 03.04.2019

Только что наткнулся на ту же проблему с OpenCV 3.4 и задался вопросом, почему возвращаемые углы отличаются от углов, полученных с помощью стандартной функции C atan2().

Оказалось, что документация функции phase() в документах OpenCV вводит в заблуждение, поскольку угол не вычисляется с помощью стандартного atan2(), но с собственной реализацией OpenCV fastAtan2(), которая возвращает диапазон углов в градусах от 0° до 360°, а не между - и , как указано в стандарте C для атан2.

person cdalitz    schedule 26.04.2019