使用示例:
cvtColor(left, left, CV_BGR2GRAY); Sobel(left, grad1, CV_64FC1, 1, 0); //求梯度 Sobel(left, grad2, CV_64FC1, 0, 1); phase(grad1, grad2, angle, true); //求角度 double min, max; minMaxLoc(angle, &min, &max); cout << "min:" << min << " max:" << max << endl; normalize(angle, angle, 0, 255, NORM_MINMAX); //歸一化
left:

grad1:

grad2:

nomalize前的angle中的最大值和最小值:

normalize后的angle:

分析:

參數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°,逆時針旋轉增加,符合我們平常角度的計算方式。
