C++-实现matlab的cart2pol(OpenCV)

简介: C++-实现matlab的cart2pol(OpenCV)

场景需求

      matlab的cart2pol是搭配meshgrid常用的函数,将笛卡尔坐标转成极坐标,在3D图形绘制中起了非常关键的作用。C++中运用OpenCV也可以实现同样的效果。

功能函数代码

/**
* @brief UnitCart                    生成网格采样点(笛卡尔坐标)
* @param squaresize                  生成网格区域的尺寸
* @param x                           生成的x矩阵
* @param y                           生成的y矩阵
*/
void UnitCart(int squaresize, cv::Mat& x, cv::Mat& y) {
  CV_Assert(squaresize % 2 == 1);
  x.create(squaresize, squaresize, CV_32FC1);
  y.create(squaresize, squaresize, CV_32FC1);
  //设置边界
  x.col(0).setTo(-1.0);
  x.col(squaresize - 1).setTo(1.0f);
  y.row(0).setTo(1.0);
  y.row(squaresize - 1).setTo(-1.0f);
  float delta = 2.0f / (squaresize - 1.0f);  //两个元素的间隔
  //计算其他位置的值
  for (int i = 1; i < squaresize - 1; ++i) {
    x.col(i) = -1.0f + i * delta;
    y.row(i) = 1.0f - i * delta;
  }
}
/**
* @brief UnitPolar                   生成网格采样点(极坐标)
* @param squaresize                  生成网格区域的尺寸
* @param radius                      生成的radius矩阵
* @param angle                       生成的angle矩阵
* @param indegree                    标志位(false:弧度,true:角度)
*/
void UnitPolar(int squaresize, cv::Mat& radius,cv::Mat& angle, bool indegree) {
  cv::Mat x;
  cv::Mat y;
  UnitCart(squaresize, x, y);                //产生指定范围内的指定数量点数,相邻数据跨度相同
  cv::cartToPolar(x, y, radius, angle, indegree); //坐标转换
}

C++测试代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;
void UnitCart(int squaresize, cv::Mat& x, cv::Mat& y);
void UnitPolar(int squaresize, cv::Mat& radius, cv::Mat& angle, bool indegree = false);
int main(void)
{
  cv::Mat radius, angle;
  int size = 1001;
  UnitPolar(size, radius, angle, false);
  imshow("radius", radius);
  imshow("angle", angle);
  waitKey(0);
  system("pause");
  return 0;
}
void UnitCart(int squaresize, cv::Mat& x, cv::Mat& y) {
  CV_Assert(squaresize % 2 == 1);
  x.create(squaresize, squaresize, CV_32FC1);
  y.create(squaresize, squaresize, CV_32FC1);
  //设置边界
  x.col(0).setTo(-1.0);
  x.col(squaresize - 1).setTo(1.0f);
  y.row(0).setTo(1.0);
  y.row(squaresize - 1).setTo(-1.0f);
  float delta = 2.0f / (squaresize - 1.0f);  //两个元素的间隔
  //计算其他位置的值
  for (int i = 1; i < squaresize - 1; ++i) {
    x.col(i) = -1.0f + i * delta;
    y.row(i) = 1.0f - i * delta;
  }
}
void UnitPolar(int squaresize, cv::Mat& radius,cv::Mat& angle, bool indegree) {
  cv::Mat x;
  cv::Mat y;
  UnitCart(squaresize, x, y);                //产生指定范围内的指定数量点数,相邻数据跨度相同
  cv::cartToPolar(x, y, radius, angle, indegree); //坐标转换
}

测试效果

图1 效果图

图2 matlab效果图

      如上图所示,C++所写的代码同matlab中cart2pol生成的radius和angle矩阵一致。


      注意一点,OpenCV自带的那个极坐标转化函数cartToPolar有精度限制,这个是我最近工作中发现的,我基于这个极坐标拟合的zernike倾斜面同最小二乘生成的倾斜面作减法,得到的居然是一个有周期性变化的面,按道理应该也得到一个斜面,所以后面我自己重新写了一个极坐标转换函数。。。


      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
2月前
|
存储 计算机视觉 异构计算
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
使用python&C++对bubbliiiing的yolo系列进行opencv.dnn进行推理部署
38 0
|
15天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
39 6
|
1月前
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
Opencv(C++)学习系列---Laplacian拉普拉斯边缘检测算法
|
1月前
|
算法 计算机视觉 C++
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
Opencv(C++)学习系列---Sobel索贝尔算子边缘检测
|
1月前
|
算法 C++ 计算机视觉
Opencv(C++)学习系列---Canny边缘检测算法
Opencv(C++)学习系列---Canny边缘检测算法
|
1月前
|
存储 计算机视觉 C++
Opencv(C++)学习系列---特征点检测和匹配
Opencv(C++)学习系列---特征点检测和匹配
|
1月前
|
算法 测试技术 计算机视觉
Opencv(C++)系列学习---opencv_contrib安装
Opencv(C++)系列学习---opencv_contrib安装
|
1月前
|
C++ 计算机视觉
Opencv(C++)系列学习---读取视频文件和打开摄像头
Opencv(C++)系列学习---读取视频文件和打开摄像头
|
1月前
|
存储 计算机视觉 C++
Opencv (C++)系列学习---模板匹配
Opencv (C++)系列学习---模板匹配