用于phase()(以及cartToPolar())函数的OpenCV手册表示它使用等式返回0-360度范围内的x和y梯度的旋转角度(使用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中是否有功能(或技巧)?谢谢 :)
似乎我在OpenCV中找不到一个可以解决这个问题的函数。但是,唯一剩下的就是使用循环并应用
if (angle>180) {
angle = angle-360;
}
当您遍历每个像素时,使用上面的公式计算角度,但使用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
刚刚在OpenCV 3.4中遇到了同样的问题,并想知道为什么返回的角度与使用标准C函数atan2()获得的角度不同。
事实证明,OpenCV文档中的phase()函数的文档具有误导性,因为角度不是使用标准atan2()函数计算的,而是使用OpenCV自己的实现fastAtan2(),它返回0之间的角度范围°和360°,而不是-π和π之间,如atan2的C标准所规定。