OPenCV版本:4.4

IDE:VS2019

功能描述

将图像重新映射到极坐标或半对数极坐标空间,这个函数用于实现图像的极坐标变换。

使用以下变换来转换图像:
dst(ρ,ϕ)=src(x,y)dst(\rho , \phi ) = src(x,y) dst(ρ,ϕ)=src(x,y)
此处:
I⃗=(x−center.x,y−center.y)ϕ=Kangle⋅angle(I⃗)ρ={Klin⋅magnitude(I⃗)defaultKlog⋅loge(magnitude(I⃗))ifsemilog\begin{array}{l} \vec{I} = (x - center.x, \;y - center.y) \\ \phi = Kangle \cdot \texttt{angle} (\vec{I}) \\ \rho = \left\{\begin{matrix} Klin \cdot \texttt{magnitude} (\vec{I}) & default \\ Klog \cdot log_e(\texttt{magnitude} (\vec{I})) & if \; semilog \\ \end{matrix}\right. \end{array} I=(x−center.x,y−center.y)ϕ=Kangle⋅angle(I)ρ={Klin⋅magnitude(I)Klog⋅loge​(magnitude(I))​defaultifsemilog​​

并且:
Kangle=dsize.height/2ΠKlin=dsize.width/maxRadiusKlog=dsize.width/loge(maxRadius)\begin{array}{l} Kangle = dsize.height / 2\Pi \\ Klin = dsize.width / maxRadius \\ Klog = dsize.width / log_e(maxRadius) \\ \end{array} Kangle=dsize.height/2ΠKlin=dsize.width/maxRadiusKlog=dsize.width/loge​(maxRadius)​

线性与半对数映射
极坐标映射可以是线性或半对数,添加WarpPolarMode中的一个到flags来确定极坐标映射模式,。
线性是缺省模式。
半对数映射模拟人类的“中心凹”视觉,允许在视线(中心视觉)上具有非常高的锐度,而周围视觉的锐度较小。

dsize的选项:

  • 如果dsize中的两个值均<=0(默认),则目标图像将具有(几乎)相同的源边界圆面积
    dsize.area←(maxRadius2⋅Π)dsize.width=cvRound(maxRadius)dsize.height=cvRound(maxRadius⋅Π)\begin{array}{l} dsize.area \leftarrow (maxRadius^2 \cdot \Pi) \\ dsize.width = \texttt{cvRound}(maxRadius) \\ dsize.height = \texttt{cvRound}(maxRadius \cdot \Pi) \\ \end{array} dsize.area←(maxRadius2⋅Π)dsize.width=cvRound(maxRadius)dsize.height=cvRound(maxRadius⋅Π)​
  • 如果只是 dsize.height <= 0,目标图像区域将与边界圆区域按比例Kx * Kx:缩放。
    dsize.height=cvRound(dsize.width⋅Π)\begin{array}{l} dsize.height = \texttt{cvRound}(dsize.width \cdot \Pi) \\ \end{array} dsize.height=cvRound(dsize.width⋅Π)​
  • 如果dsize所有的成员的值都 > 0, 目标图像将具有给定的大小,因此边界圆的面积将缩放为dsize.

反向映射

你可以通过添加WARP_INVERSE_MAP到flags获取反向映射。

 // 直接变换warpPolar(src, lin_polar_img, Size(),center, maxRadius, flags);                     // 线性极坐标warpPolar(src, log_polar_img, Size(),center, maxRadius, flags + WARP_POLAR_LOG);  // 半对数极坐标// 反变换warpPolar(lin_polar_img, recovered_lin_polar_img, src.size(), center, maxRadius, flags + WARP_INVERSE_MAP);warpPolar(log_polar_img, recovered_log_polar, src.size(), center, maxRadius, flags + WARP_POLAR_LOG + WARP_INVERSE_MAP);

在编程中,通过(ρ,φ)−>(x,y)从极坐标计算原始坐标:

 double angleRad, magnitude;double Kangle = dst.rows / CV_2PI;angleRad = phi / Kangle;if (flags & WARP_POLAR_LOG){double Klog = dst.cols / std::log(maxRadius);magnitude = std::exp(rho / Klog);}else{double Klin = dst.cols / maxRadius;magnitude = rho / Klin;}int x = cvRound(center.x + magnitude * cos(angleRad));int y = cvRound(center.y + magnitude * sin(angleRad));

函数原型

void cv::warpPolar   (   InputArray  src,OutputArray     dst,Size    dsize,Point2f   center,double   maxRadius,int   flags
)

参数

  • src 源图像.
  • dst 目标图像,类型和src相同.
  • dsize 目标图像大小 (see description for valid options).
  • center 转换中心 The transformation center.
  • maxRadius 要变换的边界圆的半径,它还确定了逆震级比例参数。
    flags 插值方法的组合, InterpolationFlags + WarpPolarMode.
  • 添加 WARP_POLAR_LINEAR 选择线性极坐标映射 (默认)
  • 添加 WARP_POLAR_LOG 选择半对数极映射。
  • 添加 WARP_INVERSE_MAP 选择反向映射

Note

  • 本函数不支持就地转换。
  • 为了计算幅值和角度,内部使用cartToPolar,因此角度的测量范围为0到360度,精度约为0.3度。
  • 此函数使用remap。由于当前实现的限制,输入和输出图像的大小应小于32767x32767.

另请参见
cv::remap

示例代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
int main(int argc, char** argv)
{VideoCapture capture;Mat log_polar_img, lin_polar_img, recovered_log_polar, recovered_lin_polar_img;CommandLineParser parser(argc, argv, "{@input|0| camera device number or video file path}");parser.about("\nThis program illustrates usage of Linear-Polar and Log-Polar image transforms\n");parser.printMessage();std::string arg = parser.get<std::string>("@input");//if (arg.size() == 1 && isdigit(arg[0]))//    capture.open(arg[0] - '0');//else//    capture.open(samples::findFileOrKeep(arg));capture.open("D:\\OpenCVtest\\video1.mp4");if (!capture.isOpened()){fprintf(stderr, "Could not initialize capturing...\n");return -1;}namedWindow("Linear-Polar", WINDOW_AUTOSIZE);namedWindow("Log-Polar", WINDOW_AUTOSIZE);namedWindow("Recovered Linear-Polar", WINDOW_AUTOSIZE);namedWindow("Recovered Log-Polar", WINDOW_AUTOSIZE);moveWindow("Linear-Polar", 20, 20);moveWindow("Log-Polar", 700, 20);moveWindow("Recovered Linear-Polar", 20, 350);moveWindow("Recovered Log-Polar", 700, 350);int flags = INTER_LINEAR + WARP_FILL_OUTLIERS;Mat src;for (;;){capture >> src;if (src.empty())break;Point2f center((float)src.cols / 2, (float)src.rows / 2);double maxRadius = 0.7 * min(center.y, center.x);
#if 0 //deprecateddouble M = frame.cols / log(maxRadius);logPolar(frame, log_polar_img, center, M, flags);linearPolar(frame, lin_polar_img, center, maxRadius, flags);logPolar(log_polar_img, recovered_log_polar, center, M, flags + WARP_INVERSE_MAP);linearPolar(lin_polar_img, recovered_lin_polar_img, center, maxRadius, flags + WARP_INVERSE_MAP);
#endif// direct transformwarpPolar(src, lin_polar_img, Size(), center, maxRadius, flags);                     // linear PolarwarpPolar(src, log_polar_img, Size(), center, maxRadius, flags + WARP_POLAR_LOG);    // semilog Polar// inverse transformwarpPolar(lin_polar_img, recovered_lin_polar_img, src.size(), center, maxRadius, flags + WARP_INVERSE_MAP);warpPolar(log_polar_img, recovered_log_polar, src.size(), center, maxRadius, flags + WARP_POLAR_LOG + WARP_INVERSE_MAP);// Below is the reverse transformation for (rho, phi)->(x, y) :Mat dst;if (flags & WARP_POLAR_LOG)dst = log_polar_img;elsedst = lin_polar_img;//get a point from the polar imageint rho = cvRound(dst.cols * 0.75);int phi = cvRound(dst.rows / 2.0);double angleRad, magnitude;double Kangle = dst.rows / CV_2PI;angleRad = phi / Kangle;if (flags & WARP_POLAR_LOG){double Klog = dst.cols / std::log(maxRadius);magnitude = std::exp(rho / Klog);}else{double Klin = dst.cols / maxRadius;magnitude = rho / Klin;}int x = cvRound(center.x + magnitude * cos(angleRad));int y = cvRound(center.y + magnitude * sin(angleRad));drawMarker(src, Point(x, y), Scalar(0, 255, 0));drawMarker(dst, Point(rho, phi), Scalar(0, 255, 0));imshow("Src frame", src);imshow("Log-Polar", log_polar_img);imshow("Linear-Polar", lin_polar_img);imshow("Recovered Linear-Polar", recovered_lin_polar_img);imshow("Recovered Log-Polar", recovered_log_polar);if (waitKey(10) >= 0)break;}return 0;
}

运行结果

原图:

线性极坐标映射:

半对数极映射

恢复的线性极坐标映射:

恢复的半对数极映射

OpenCV极坐标转换函数warpPolar的使用相关推荐

  1. OpenCV颜色空间转换函数:cv::cvtColor介绍

    OpenCV颜色空间转换函数:cv::cvtColor介绍 Color Conversion Code(颜色转换代码) Enumerator COLOR_BGR2BGRA add alpha chan ...

  2. opencv极坐标转换成直角坐标_媲美 PS,用 Python 制作酷炫极坐标全景图

    点击上方"Python数据之道",选择"星标公众号" 收藏文章的同时,不要忘记「在看」 媲美 PS, 用 Python 制作酷炫极坐标全景图 0 概述  今天要 ...

  3. opencv学习(8):opencv距离转换函数cv::distanceTransform()

    对应头文件: #include <opencv2/imgproc.hpp> 函数功能: 计算源图像的每个像素到最近的零像素的距离.函数 cv::distanceTransform 计算从每 ...

  4. OpenCV的图像直角坐标系转极坐标系的函数warpPolar()详解,并附自己写的实现直角坐标系转极坐标系的MATLAB代码

    [草稿]详解OpenCV实现图像直角坐标系转极坐标系的函数warpPolar(),并附自己写的实现直角坐标系转极坐标系的MATLAB代码 有些时候我们需要把图像或矩阵从直角坐标系(笛卡尔坐标系)转换到 ...

  5. 【OpenCV 例程200篇】36. 直角坐标与极坐标转换(cv2.polarToCart)

    『youcans 的 OpenCV 例程200篇 - 总目录』 [youcans 的 OpenCV 例程200篇]36. 直角坐标与极坐标的转换 函数 cv2.cartToPolar 用于将直角坐标( ...

  6. OpenCV各模块函数使用实例(5)--特征检测(Feature Detection)

    特征检测是检测图像中的特征信息,比如边缘,线段,角点位置等.在OpenCV中提供了各种特征检测函数和特征提取函数,其中包括有边缘检测(canny),角点检测等,如:Harris角点.ShiTomasi ...

  7. opencv 图像操作,常用 OpenCV 内置函数

    OpenCV 如何对图像的像素进行操作 对图像的像素进行操作,我们可以实现空间增强,反色,大部分图像特效系列都是基于像素操作等目的.先来看一下内存空间中图像矩阵,也就是Mat的矩阵数值部分是怎么存储的 ...

  8. OpenCV最全函数用法

    记录OpenCV中学习的函数用法 文章目录 图像阈值 cv.threshold()全局阈值 cv.adaptiveThreshold()自适应阈值 Otsu's Binarization: 基于直方图 ...

  9. 图像边缘检测--OpenCV之cvCanny函数

    图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

最新文章

  1. 太厉害了!这应该是目前Redis可视化工具最全的横向评测
  2. 【深度学习】解析深度神经网络背后的数学原理
  3. servlet学习--Cookie小应用
  4. 智能汽车路径规划-曲线插值法、人工势场法
  5. java poi 2007,『分页符有什么用』java poi导出excel2007插入分页符无效,该如何解决,求代码!...
  6. mysql 查看校对集_MySQL教程之校对集问题
  7. 90°光混频器原理分析
  8. 计算机考研408真题(全国统考2009--2020)、985高校计算机考研资料(清北+北理+北邮+武大+华科+浙大+复旦+哈工大+西安交大+华南理工)、王道四件套、天勤四件套---百度网盘免费下载
  9. Android 仿微信语音聊天,flutter项目结构
  10. 小米手机 5 开启【开发者选项】
  11. xctf攻防世界 MISC高手进阶区 saleae
  12. web课程设计网页规划与设计----公司官网带轮播图 (页面精美 1页)
  13. JavaWeb网上商城的设计
  14. 【MATLAB】手把手教你安装MATLAB R2021b(内含安装包)
  15. 欢迎入驻A5源码市场
  16. [国家集训队]整数的lqp拆分 数学推导 打表找规律
  17. 平稳性检验(描述性)与纯随机性检验
  18. 【电子产品】联想ku0989 启用Fn键或屏蔽Fn键
  19. Nim中文社区官网现已上线!
  20. LaTeX快速入门-蔡炎龙

热门文章

  1. java utill scanner_java.util.Scanner应用详解 转
  2. AGC001E BBQ Hard [dp]
  3. 推荐专业IT电子书下载网站-https://itbook.download/
  4. 计算机毕业论文会计,会计毕业论文6000字
  5. DWZ表单验证规则一览表
  6. 一份超详细的网站推广优化方案
  7. See Finer, See More!腾讯上交提出IVT,越看越精细,进行精细全面的跨模态对比!
  8. linux系统pam配置文件,【PAM】 How to Configure and Use PAM in Linux?
  9. 【游戏开发实战】Unity使用ShaderGraph配合粒子系统,制作子弹拖尾特效(Fate/stay night金闪闪的大招效果)
  10. 在线获取外链的php源码,y.qq.com-php获取QQ音乐外链源码