phase函数——opencv

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了phase函数——opencv相关的知识,希望对你有一定的参考价值。

 

使用示例:

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°,逆时针旋转增加,符合我们平常角度的计算方式。

 

以上是关于phase函数——opencv的主要内容,如果未能解决你的问题,请参考以下文章

拆炸弹!bomb-whu,phase-1

imgwarp.cpp:3143: error: (-215:Assertion failed) _src.total() > 0 in function ‘warpPerspective‘(代码片段

CSAPP lab2 二进制拆弹 binary bombs phase_5 施工中

将openCV python函数转换为C++

CSAPP 3e: Bomb lab (secret_phase)

如果在函数中将数字四舍五入,则将其四舍五入