继上文:
首先透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面。在透视变换中,透视前的图像和透视后的图像之间的变换关系可以用一个3*3的变换矩阵表示,该矩阵可以通过两幅图像中4个对应点的坐标求取,因此透视变换又称作“四点变换”。在OpenCV中提供了根据4个对应点求取变换矩阵的getPerspectiveTransform()函数和透视变换的warpPerspective()函数。
getPerspectiveTransform()函数原型:
Mat cv::getPerspectiveTransform(const Point2f src[],
const Point2f dst[],
int solveMethod = DECOMP_LU
)
src[]:原图像中的4个像素坐标。
dst[]:目标图像中的4个像素坐标。
solveMethod:选择计算透视变换矩阵方法的标志,可以选择的参数及含义在下表中给出。
标志参数 | 简记 | 作用 |
DECOMP_LU | 0 | 最佳主轴元素的高斯消元法 |
DECOMP_SVD | 1 | 奇异值分解(SVD)方法 |
DECOMP_EIG | 2 | 特征值分解法 |
DECOMP_CHOLESKY | 3 | Cholesky分解法 |
DECOMP_QR | 4 | QR分解法 |
DECOMP_NORMAL | 16 | 使用正规方程式,可以与其他的标志一起使用 |
warpPerspective()函数原型:
void cv::warpPerspective(InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar()
)
src:输入图像。
dst:透视变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
M:3*3的变换矩阵。
dsize:输出图像的尺寸。
flags:插值方法标志。
borderMode:像素边界外推方法的标志。
borderValue:填充边界使用的数值,默认情况下为0。
这个函数的参数含义与warpAffine()函数(在上文)的参数含义相同,不过多赘述。
极坐标变换就是将图像在直角坐标系与极坐标系中互相变换,可以将一个圆形的图像变成一个矩形图像,它常用语处理钟表、圆盘等图像。在OpenCV中提供了warpPolar()函数用于实现图像的极坐标变换,代码原型如下:
void cv::warpPolar(InputArray src,
OutputArray dst,
Size dsize,
Point2f center,
double maxRadius,
int flags
)
src:源图像。
dst:极坐标变换后输出图像,与源图像具有相同的数据类型和通道数。
dsize:目标图像大小。
center:极坐标变换时极坐标的原点坐标。
maxRadius:变换时边界圆的半径,它也决定了逆变换时的比例参数。
flags:插值方法与极坐标映射方法标志,两个方法之间通过“+”或者“|”号连接。
标志参数 | 作用 |
WARP_POLAR_LINEAR | 极坐标 |
WARP_POLAR_LOG | 半对数极坐标变换 |
WARP_INVERSE_MAP | 逆变换 |
代码实例:
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("D:\\lena.jpg");
if (img.empty())
{
cout << "请确认图像的文件名字是否正确" << endl;
return -1;
}
Mat img1, img2;
Point2f center = Point2f(img.cols / 2, img.rows / 2); //极坐标在图像中的原点
//正极坐标变换
warpPolar(img, img1, Size(300, 600), center, center.x, INTER_LINEAR + WARP_POLAR_LINEAR);
//逆极坐标变换
warpPolar(img, img2, Size(img.rows, img.cols), center, center.x, INTER_LINEAR + WARP_POLAR_LINEAR + WARP_INVERSE_MAP);
imshow("源图像", img);
imshow("正极坐标变换", img1);
imshow("逆极坐标变换", img2);
waitKey(0);
return 0;
}