使用示例:
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°,逆时针旋转增加,符合我们平常角度的计算方式。
时间: 2024-10-13 00:20:39