一、函数原型
该函数 参数 angleInDegrees 默认为false,即弧度,当置为true时,则输出为角度。
phase函数根据函数
来计算角度,计算精度大约为0.3弧度,当x,y相等时,angle为0。
数学上函数atan2为:
该函数的值域为
,可以通过对负数结果加
的方法,将函数的结果映射到
范围内。
而c++中atan2函数是通过正切值返回弧度的,并通过判断x,y的正负决定象限,因此c++中atan2函数值域是从-Pi到Pi的。
二、小实验
Mat mat1(Size(
4
,
1
), CV_32FC1), mat2(Size(
4
,
1
), CV_32FC1), mat3;
mat1.at
<
float
>
(
0
,
0
)
=
1
; mat2.at
<
float
>
(
0
,
0
)
=
1
;
mat1.at
<
float
>
(
0
,
1
)
=
1
; mat2.at
<
float
>
(
0
,
1
)
=
-
1
;
mat1.at
<
float
>
(
0
,
2
)
=
-
1
; mat2.at
<
float
>
(
0
,
2
)
=
1
;
mat1.at
<
float
>
(
0
,
3
)
=
-
1
; mat2.at
<
float
>
(
0
,
3
)
=
-
1
;
phase(mat1,mat2,mat3,
true
);
最后mat3的计算结果:
。由此可以看出opencv phase计算出的角度从0°-360°是已x轴正方向为0°,逆时针旋转增加,符合我们平常角度的计算方式。
三、实际运用
使用函数来计算图像方向场
原始图像
代码
说明
在进行角度计算之前,对sobel计算的两个结果分别进行了6*6的平均卷积,这是基本的去噪思路。而后到phase一行,角度就已经求出来了,后面是为了方便显示。
注意,这里的角度是以x正方向为0,以逆时针为正方向,0-360的度量。并且显而易见分了内外。这个圆是比较简单的,如果对于复杂图像,就必须对角度的概念有深入理解。