OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
几何图像变换

详细描述

本节中的函数执行二维图像的各种几何变换。它们不会改变图像内容,而是变形像素网格并将此变形网格映射到目标图像。事实上,为了避免采样伪像,映射是按反向顺序进行的,从目标到源。也就是说,对于目标图像的每个像素\((x, y)\),函数计算源图像中相应“捐赠者”像素的坐标并复制像素值。

\[\texttt{dst} (x,y)= \texttt{src} (f_x(x,y), f_y(x,y))\]

如果您指定了正向映射\(\left<g_x, g_y\right>: \texttt{src} \rightarrow \texttt{dst}\),OpenCV函数首先计算相应的反向映射\(\left<f_x, f_y\right>: \texttt{dst} \rightarrow \texttt{src}\),然后使用上述公式。

几何变换的实际实现,从最通用的重映射到最简单和最快的调整大小,需要解决上述公式的两个主要问题:

注意
几何变换不适用于CV_8SCV_32S图像。

枚举

枚举  cv::InterpolationFlags {
  cv::INTER_NEAREST = 0 ,
  cv::INTER_LINEAR = 1 ,
  cv::INTER_CUBIC = 2 ,
  cv::INTER_AREA = 3 ,
  cv::INTER_LANCZOS4 = 4 ,
  cv::INTER_LINEAR_EXACT = 5 ,
  cv::INTER_NEAREST_EXACT = 6 ,
  cv::INTER_MAX = 7 ,
  cv::WARP_FILL_OUTLIERS = 8 ,
  cv::WARP_INVERSE_MAP = 16 ,
  cv::WARP_RELATIVE_MAP = 32
}
 插值算法 更多…
 
枚举  cv::InterpolationMasks {
  cv::INTER_BITS = 5 ,
  cv::INTER_BITS2 = INTER_BITS * 2 ,
  cv::INTER_TAB_SIZE = 1 << INTER_BITS ,
  cv::INTER_TAB_SIZE2 = INTER_TAB_SIZE * INTER_TAB_SIZE
}
 
枚举  cv::WarpPolarMode {
  cv::WARP_POLAR_LINEAR = 0 ,
  cv::WARP_POLAR_LOG = 256
}
 指定极坐标映射模式。 更多…
 

函数

void cv::convertMaps (InputArray map1, InputArray map2, OutputArray dstmap1, OutputArray dstmap2, int dstmap1type, bool nninterpolation=false)
 将图像变换映射从一种表示转换为另一种表示。
 
Mat cv::getAffineTransform (const Point2f src[], const Point2f dst[])
 根据三对对应点计算仿射变换。
 
Mat cv::getAffineTransform (InputArray src, InputArray dst)
 
Mat cv::getPerspectiveTransform (const Point2f src[], const Point2f dst[], int solveMethod=DECOMP_LU)
 
Mat cv::getPerspectiveTransform (InputArray src, InputArray dst, int solveMethod=DECOMP_LU)
 根据四对对应点计算透视变换。
 
void cv::getRectSubPix (InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType=-1)
 以亚像素精度从图像中检索像素矩形。
 
Mat cv::getRotationMatrix2D (Point2f center, double angle, double scale)
 计算二维旋转的仿射矩阵。
 
Matx23d cv::getRotationMatrix2D_ (Point2f center, double angle, double scale)
 
void cv::invertAffineTransform (InputArray M, OutputArray iM)
 反转仿射变换。
 
void cv::linearPolar (InputArray src, OutputArray dst, Point2f center, double maxRadius, int flags)
 将图像重新映射到极坐标空间。
 
void cv::logPolar (InputArray src, OutputArray dst, Point2f center, double M, int flags)
 将图像重新映射到半对数极坐标空间。
 
void cv::remap (InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
 对图像应用通用的几何变换。
 
void cv::resize (InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
 调整图像大小。
 
void cv::warpAffine (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
 对图像应用仿射变换。
 
void cv::warpPerspective (InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar &borderValue=Scalar())
 对图像应用透视变换。
 
void cv::warpPolar (InputArray src, OutputArray dst, Size dsize, Point2f center, double maxRadius, int flags)
 将图像重新映射到极坐标或半对数极坐标空间。
 

枚举类型文档

◆ InterpolationFlags

#include <opencv2/imgproc.hpp>

插值算法

枚举器
INTER_NEAREST 
Python: cv.INTER_NEAREST

最近邻插值

INTER_LINEAR 
Python: cv.INTER_LINEAR

双线性插值

INTER_CUBIC 
Python: cv.INTER_CUBIC

双三次插值

INTER_AREA 
Python: cv.INTER_AREA

使用像素面积关系进行重采样。对于图像抽取,这可能是一种更好的方法,因为它可以产生无摩尔纹的结果。但是当图像放大时,它类似于INTER_NEAREST方法。

INTER_LANCZOS4 
Python: cv.INTER_LANCZOS4

在8x8邻域上的Lanczos插值

INTER_LINEAR_EXACT 
Python: cv.INTER_LINEAR_EXACT

位精确双线性插值

INTER_NEAREST_EXACT 
Python: cv.INTER_NEAREST_EXACT

位精确最近邻插值。这将产生与PIL、scikit-image或Matlab中的最近邻方法相同的结果。

INTER_MAX 
Python: cv.INTER_MAX

插值代码掩码

WARP_FILL_OUTLIERS 
Python: cv.WARP_FILL_OUTLIERS

标志,填充所有目标图像像素。如果其中一些对应于源图像中的异常值,则将其设置为零。

WARP_INVERSE_MAP 
Python: cv.WARP_INVERSE_MAP

标志,反向变换

例如,linearPolarlogPolar 变换

  • 未设置标志:\(dst( \rho , \phi ) = src(x,y)\)
  • 设置标志:\(dst(x,y) = src( \rho , \phi )\)
WARP_RELATIVE_MAP 
Python: cv.WARP_RELATIVE_MAP

◆ InterpolationMasks

#include <opencv2/imgproc.hpp>

枚举器
INTER_BITS 
Python: cv.INTER_BITS
INTER_BITS2 
Python: cv.INTER_BITS2
INTER_TAB_SIZE 
Python: cv.INTER_TAB_SIZE
INTER_TAB_SIZE2 
Python: cv.INTER_TAB_SIZE2

◆ WarpPolarMode

#include <opencv2/imgproc.hpp>

指定极坐标映射模式。

另请参阅
warpPolar
枚举器
WARP_POLAR_LINEAR 
Python: cv.WARP_POLAR_LINEAR

将图像重新映射到/从极坐标空间。

WARP_POLAR_LOG 
Python: cv.WARP_POLAR_LOG

将图像重新映射到/从半对数极坐标空间。

函数文档

◆ convertMaps()

void cv::convertMaps ( InputArray map1,
InputArray map2,
OutputArray dstmap1,
OutputArray dstmap2,
int dstmap1type,
bool nninterpolation = false )
Python
cv.convertMaps(map1, map2, dstmap1type[, dstmap1[, dstmap2[, nninterpolation]]]) -> dstmap1, dstmap2

#include <opencv2/imgproc.hpp>

将图像变换映射从一种表示转换为另一种表示。

该函数将用于remap的一对映射从一种表示转换为另一种表示。支持以下选项((map1.type(), map2.type()) → (dstmap1.type(), dstmap2.type())):

  • \(\texttt{(CV_32FC1, CV_32FC1)} \rightarrow \texttt{(CV_16SC2, CV_16UC1)}\)。这是最常用的转换操作,其中原始浮点映射(参见remap)被转换为更紧凑且速度更快的定点表示。第一个输出数组包含四舍五入的坐标,第二个数组(仅当nninterpolation=false时创建)包含插值表中的索引。
  • \(\texttt{(CV_32FC2)} \rightarrow \texttt{(CV_16SC2, CV_16UC1)}\)。与上面相同,但原始映射存储在一个2通道矩阵中。
  • 反向转换。显然,重建的浮点映射不会与原始映射完全相同。
参数
map1第一个输入映射,类型为 CV_16SC2、CV_32FC1 或 CV_32FC2。
map2第二个输入映射,类型为 CV_16UC1、CV_32FC1 或无(空矩阵)。
dstmap1第一个输出映射,类型为 dstmap1type,大小与 src 相同。
dstmap2第二个输出映射。
dstmap1type第一个输出映射的类型,应为 CV_16SC2、CV_32FC1 或 CV_32FC2。
最近邻插值标志位,指示是否使用定点映射进行最近邻插值或更复杂的插值。
另请参阅
remapundistortinitUndistortRectifyMap

◆ getAffineTransform() [1/2]

Mat cv::getAffineTransform ( const Point2f src[],
const Point2f dst[] )
Python
cv.getAffineTransform(src, dst) -> retval

#include <opencv2/imgproc.hpp>

根据三对对应点计算仿射变换。

该函数计算仿射变换的\(2 \times 3\)矩阵,使得

\[\begin{bmatrix} x'_i \\ y'_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\]

其中

\[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2\]

参数
src源图像中三角形顶点的坐标。
dst目标图像中对应三角形顶点的坐标。
另请参阅
warpAffinetransform

◆ getAffineTransform() [2/2]

Mat cv::getAffineTransform ( InputArray src,
InputArray dst )
Python
cv.getAffineTransform(src, dst) -> retval

#include <opencv2/imgproc.hpp>

◆ getPerspectiveTransform() [1/2]

Mat cv::getPerspectiveTransform ( const Point2f src[],
const Point2f dst[],
int solveMethod = DECOMP_LU )
Python
cv.getPerspectiveTransform(src, dst[, solveMethod]) -> retval

#include <opencv2/imgproc.hpp>

这是一个重载的成员函数,为了方便提供。它与上面的函数的区别仅仅在于它接受的参数。

◆ getPerspectiveTransform() [2/2]

Mat cv::getPerspectiveTransform ( InputArray src,
InputArray dst,
int solveMethod = DECOMP_LU )
Python
cv.getPerspectiveTransform(src, dst[, solveMethod]) -> retval

#include <opencv2/imgproc.hpp>

根据四对对应点计算透视变换。

该函数计算透视变换的\(3 \times 3\)矩阵,使得

\[\begin{bmatrix} t_i x'_i \\ t_i y'_i \\ t_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\]

其中

\[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3\]

参数
src源图像中四边形顶点的坐标。
dst目标图像中对应四边形顶点的坐标。
solveMethod传递给cv::solve的方法(DecompTypes)
另请参阅
findHomographywarpPerspectiveperspectiveTransform

◆ getRectSubPix()

void cv::getRectSubPix ( InputArray image,
Size patchSize,
Point2f center,
OutputArray patch,
int patchType = -1 )
Python
cv.getRectSubPix(image, patchSize, center[, patch[, patchType]]) -> patch

#include <opencv2/imgproc.hpp>

以亚像素精度从图像中检索像素矩形。

函数 getRectSubPix 从 src 中提取像素

\[patch(x, y) = src(x + \texttt{center.x} - ( \texttt{dst.cols} -1)*0.5, y + \texttt{center.y} - ( \texttt{dst.rows} -1)*0.5)\]

其中,使用双线性插值检索非整数坐标处像素的值。多通道图像的每个通道独立处理。图像也应该是一个单通道或三通道图像。虽然矩形的中心必须在图像内部,但矩形的部分区域可能在外部。

参数
image源图像。
patchSize提取的补丁的大小。
center源图像中提取矩形中心的浮点坐标。中心必须在图像内部。
patch提取的补丁,大小为 patchSize,与 src 的通道数相同。
patchType提取像素的深度。默认情况下,它们与 src 的深度相同。
另请参阅
warpAffinewarpPerspective

◆ getRotationMatrix2D()

Mat cv::getRotationMatrix2D ( Point2f center,
double angle,
double scale )
inline
Python
cv.getRotationMatrix2D(center, angle, scale) -> retval

#include <opencv2/imgproc.hpp>

计算二维旋转的仿射矩阵。

该函数计算以下矩阵

\[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}\]

其中

\[\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}\]

该变换将旋转中心映射到自身。如果这不是目标,请调整偏移量。

参数
center源图像中旋转的中心。
angle旋转角度(度)。正值表示逆时针旋转(坐标原点假定为左上角)。
scale各向同性缩放因子。
另请参阅
getAffineTransformwarpAffinetransform
以下是此函数的调用图

◆ getRotationMatrix2D_()

Matx23d cv::getRotationMatrix2D_ ( Point2f center,
double angle,
double scale )

#include <opencv2/imgproc.hpp>

另请参阅
getRotationMatrix2D

◆ invertAffineTransform()

void cv::invertAffineTransform ( InputArray M,
OutputArray iM )
Python
cv.invertAffineTransform(M[, iM]) -> iM

#include <opencv2/imgproc.hpp>

反转仿射变换。

该函数计算由\(2 \times 3\)矩阵 M 表示的逆仿射变换

\[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ a_{21} & a_{22} & b_2 \end{bmatrix}\]

结果也是与 M 类型相同的\(2 \times 3\)矩阵。

参数
M原始仿射变换。
iM输出反向仿射变换。

◆ linearPolar()

void cv::linearPolar ( InputArray src,
OutputArray dst,
Point2f center,
double maxRadius,
int flags )
Python
cv.linearPolar(src, center, maxRadius, flags[, dst]) -> dst

#include <opencv2/imgproc.hpp>

将图像重新映射到极坐标空间。

已弃用
此函数产生的结果与cv::warpPolar(src, dst, src.size(), center, maxRadius, flags)相同

◆ logPolar()

void cv::logPolar ( InputArray src,
OutputArray dst,
Point2f center,
double M,
int flags )
Python
cv.logPolar(src, center, M, flags[, dst]) -> dst

#include <opencv2/imgproc.hpp>

将图像重新映射到半对数极坐标空间。

已弃用
此函数产生的结果与cv::warpPolar(src, dst, src.size(), center, maxRadius, flags+WARP_POLAR_LOG);相同

◆ remap()

void cv::remap ( InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int 插值,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar() )
Python
cv.remap(src, map1, map2, interpolation[, dst[, borderMode[, borderValue]]]) -> dst

#include <opencv2/imgproc.hpp>

对图像应用通用的几何变换。

该函数使用指定的映射变换源图像

\[\texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y))\]

使用WARP_RELATIVE_MAP标志

\[\texttt{dst} (x,y) = \texttt{src} (x+map_x(x,y),y+map_y(x,y))\]

其中,非整数坐标像素的值使用一种可用的插值方法计算。\(map_x\) 和 \(map_y\) 可以分别编码为\(map_1\)和\(map_2\)中的单独浮点映射,或者编码为\(map_1\)中的\((x,y)\)交错浮点映射,或者使用convertMaps创建的定点映射。将映射从浮点表示转换为定点表示的原因是,它们可以产生快得多的(2倍)重新映射操作。在转换后的情况下,\(map_1\)包含对(cvFloor(x), cvFloor(y)),\(map_2\)包含插值系数表中的索引。

此函数无法就地操作。

参数
src源图像。
dst目标图像。它与map1具有相同的大小,与src具有相同的类型。
map1第一个映射,可以是(x,y)点,也可以只是x值,类型为CV_16SC2、CV_32FC1或CV_32FC2。有关将浮点表示转换为定点表示以提高速度的详细信息,请参见convertMaps
map2第二个y值映射,类型为CV_16UC1、CV_32FC1或无(如果map1是(x,y)点,则为空映射)。
插值插值方法(参见InterpolationFlags)。此函数不支持INTER_AREAINTER_LINEAR_EXACTINTER_NEAREST_EXACT方法。可以将额外的标志WARP_RELATIVE_MAP与插值方法进行按位或运算(例如INTER_LINEAR | WARP_RELATIVE_MAP)。
borderMode像素外推方法(参见BorderTypes)。当borderMode=BORDER_TRANSPARENT时,这意味着目标图像中对应于源图像中“异常值”的像素不会被函数修改。
borderValue常数边界情况下使用值。默认情况下,它是0。
注意
由于当前实现的限制,输入和输出图像的大小应小于32767x32767。

◆ resize()

void cv::resize ( InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR )
Python
cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst

#include <opencv2/imgproc.hpp>

调整图像大小。

resize函数将图像src调整为指定大小或放大到指定大小。请注意,不会考虑初始dst类型或大小。相反,大小和类型是从srcdsizefxfy派生的。如果要调整src的大小以使其适合预先创建的dst,可以按如下方式调用该函数:

//显式指定dsize=dst.size(); fx和fy将由此计算。
resize(src, dst, dst.size(), 0, 0, interpolation);
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
调整图像大小。

如果要沿每个方向将图像缩小2倍,可以按如下方式调用该函数:

//指定fx和fy,并让函数计算目标图像大小。
resize(src, dst, Size(), 0.5, 0.5, interpolation);
Size2i Size
定义 types.hpp:370

为了缩小图像,通常最好使用INTER_AREA插值,而为了放大图像,通常最好使用INTER_CUBIC(慢)或INTER_LINEAR(快,但看起来仍然不错)。

参数
src输入图像。
dst输出图像;它具有dsize大小(当它非零时)或从src.size()、fx和fy计算的大小;dst的类型与src相同。
dsize输出图像大小;如果它等于零(Python中的None),则计算为:

\[\texttt{dsize = Size(round(fx*src.cols), round(fy*src.rows))}\]

dsize或fx和fy都必须非零。
fx沿水平轴的比例因子;当它等于0时,计算为:

\[\texttt{(double)dsize.width/src.cols}\]

fy沿垂直轴的比例因子;当它等于0时,计算为:

\[\texttt{(double)dsize.height/src.rows}\]

插值插值方法,参见InterpolationFlags
另请参阅
warpAffinewarpPerspectiveremap

◆ warpAffine()

void cv::warpAffine ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar() )
Python
cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst

#include <opencv2/imgproc.hpp>

对图像应用仿射变换。

warpAffine函数使用指定的矩阵变换源图像

\[\texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23})\]

当设置标志WARP_INVERSE_MAP时。否则,变换将首先使用invertAffineTransform反转,然后在上面的公式中代替M。该函数无法就地操作。

参数
src输入图像。
dst输出图像大小为dsize,类型与src相同。
M2×3变换矩阵。
dsize输出图像的大小。
标志插值方法的组合(参见InterpolationFlags)和可选标志WARP_INVERSE_MAP,表示M是逆变换(\(\texttt{dst}\rightarrow\texttt{src}\))。
borderMode像素外推方法(参见BorderTypes);当borderMode=BORDER_TRANSPARENT时,这意味着函数不会修改目标图像中对应于源图像中“异常值”的像素。
borderValue常数边界情况下使用的值;默认为0。
另请参阅
warpPerspectiveresizeremapgetRectSubPixtransform

◆ warpPerspective()

void cv::warpPerspective ( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar() )
Python
cv.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst

#include <opencv2/imgproc.hpp>

对图像应用透视变换。

warpPerspective函数使用指定的矩阵变换源图像

\[\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right )\]

当设置标志WARP_INVERSE_MAP时。否则,变换将首先使用invert反转,然后在上面的公式中代替M。该函数无法就地操作。

参数
src输入图像。
dst输出图像大小为dsize,类型与src相同。
M3×3变换矩阵。
dsize输出图像的大小。
标志插值方法的组合(INTER_LINEARINTER_NEAREST)和可选标志WARP_INVERSE_MAP,它将M设置为逆变换(\(\texttt{dst}\rightarrow\texttt{src}\))。
borderMode像素外推方法(BORDER_CONSTANTBORDER_REPLICATE)。
borderValue常数边界情况下使用的值;默认为0。
另请参阅
warpAffineresizeremapgetRectSubPixperspectiveTransform

◆ warpPolar()

void cv::warpPolar ( InputArray src,
OutputArray dst,
Size dsize,
Point2f center,
double maxRadius,
int flags )
Python
cv.warpPolar(src, dsize, center, maxRadius, flags[, dst]) -> dst

#include <opencv2/imgproc.hpp>

将图像重新映射到极坐标或半对数极坐标空间。

使用以下变换转换源图像

\[ dst(\rho , \phi ) = src(x,y) \]

其中

\[ \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} \]

\[ \begin{array}{l} Kangle = dsize.height / 2\Pi \\ Klin = dsize.width / maxRadius \\ Klog = dsize.width / log_e(maxRadius) \\ \end{array} \]

线性与半对数映射

极坐标映射可以是线性的或半对数的。向flags中添加一个WarpPolarMode来指定极坐标映射模式。

线性是默认模式。

半对数映射模拟人类的“中央凹”视觉,与周边视觉的辨别力较低相比,它允许视线(中央视觉)具有非常高的辨别力。

关于dsize的选项
  • 如果dsize中的两个值都小于等于0(默认值),则目标图像将具有与源边界圆(几乎)相同的面积

    \[\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.height <= 0,则目标图像面积将与边界圆面积成比例,但按Kx * Kx缩放

    \[\begin{array}{l} dsize.height = \texttt{cvRound}(dsize.width \cdot \Pi) \\ \end{array} \]

  • 如果dsize中的两个值都大于0,则目标图像将具有给定大小,因此边界圆的面积将缩放为dsize
反向映射

您可以通过向flags添加WARP_INVERSE_MAP来获得反向映射

// 直接变换
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);

此外,要根据极坐标映射坐标\((rho, phi)->(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));
参数
src源图像。
dst目标图像。其类型与源图像相同。
dsize目标图像大小(参见描述以了解有效选项)。
center变换中心。
maxRadius变换的边界圆的半径。它也决定了逆幅度缩放参数。
标志插值方法的组合,InterpolationFlags + WarpPolarMode
注意
  • 该函数不能就地操作。
  • 为了计算以度为单位的幅度和角度,内部使用了 cartToPolar,因此角度从 0 到 360 测量,精度约为 0.3 度。
  • 此函数使用 remap。由于当前实现的限制,输入和输出图像的大小应小于 32767x32767。
另请参阅
cv::remap