cartToPolar Opencv

CV_EXPORTS_W void cartToPolar(InputArray x, InputArray y,
                              OutputArray magnitude, OutputArray angle,
                              bool angleInDegrees = false);

x:Mat,这必须是单精度或双精度浮点数组
y:Mat,其大小和类型必须与x相同
magnitude:输出与x相同大小和类型的大小数组
angle:与x具有相同大小和类型的角度的输出数组;角度以弧度(从0到2*Pi)或度(0到360度)度量
angleInDegrees:标志,指示结果是以弧度(默认情况下是以弧度)还是以度度量
注意:输入数组必须具有相同精度

作用1:根据勾股定理求出另一条边的长度和三角形的角度(y/x=tan α)。
作用2:取梯度幅值和方向。先用sobel求出水平和垂直方向的梯度,再用cartToPolar求出梯度幅值和方向。

输入x/y均为2维向量,其实现如下:
在这里插入图片描述

代码1:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    Mat xx = Mat(2, 3, CV_32FC1, Scalar(6, 0, 0));
    Mat yy = Mat(2, 3, CV_32FC1, Scalar(6, 0, 0));

    cout << xx << endl;
    cout << yy << endl;

    Mat mag, angle;

    cartToPolar(xx, yy, mag, angle, true);
    cout << mag << endl;
    cout << angle << endl;
}
// out
//看xx和yy的0,0位置,都是6,根据勾股定理第三边是6*根号2=8.485281,角度是45度。
[6, 6, 6;
 6, 6, 6]
[6, 6, 6;
 6, 6, 6]
[8.485281, 8.485281, 8.485281;
 8.485281, 8.485281, 8.485281]
[44.990456, 44.990456, 44.990456;
 44.990456, 44.990456, 44.990456]

代码2:

vector<Point2f> sides;//建立容器存坐标
sides.push_back(Point2f(3, 4));
sides.push_back(Point2f(6, 8));
sides.push_back(Point2f(1, 1));
 
Mat xpts(sides.size(), 1, CV_32F, &sides[0].x, 2 * sizeof(float));
Mat ypts(sides.size(), 1, CV_32F, &sides[0].y, 2 * sizeof(float));
 
cout << "x: " << xpts.t() << endl;
cout << "y: " << ypts.t() << endl;
 
Mat magnitude, angle;
cartToPolar(xpts, ypts, magnitude, angle);//调用库函数
 
cout << "\nmagnitude: " << magnitude.t();
cout << "\nangle: " << angle.t() *180. / CV_PI << endl;
 
 
x: [3, 6, 1]
y: [4, 8, 1]
 //看xx和yy的0,0位置分别是3和4,根据勾股定理第三边是5,4/3 = tanα,α=53.136284度
magnitude: [5, 10, 1.4142135]
angle: [53.136284, 53.136284, 44.990456]

参考:
https://zj-image-processing.readthedocs.io/zh_CN/latest/opencv/code/[cartToPolar]%E4%BA%8C%E7%BB%B4%E5%90%91%E9%87%8F%E7%9A%84%E5%A4%A7%E5%B0%8F%E5%92%8C%E8%A7%92%E5%BA%A6/

https://blog.csdn.net/qq_30460949/article/details/91393048

https://zhuanlan.zhihu.com/p/75705284

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值