Ъгъл със знак във фаза() в OpenCV

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

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

Въпреки това, прилагайки ръчно за някои произволни x/y-градиенти стойности и използвайки същото горно уравнение, получавам резултати със стойности със знак

Пример:

Gx=46 и Gy=-22

atan2(-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 за atan2.

person cdalitz    schedule 26.04.2019