版权声明:看不懂请评论,我会积极改进的 https://blog.csdn.net/qq_36285879/article/details/82938896
S1.3 仿射变换、透视变换、极坐标映射演示
OpenCV图像变换示意表
这里列一下和变换有关的函数吧。
函数 | 作用 |
---|---|
transform(src,dst,mtx) | 稀疏仿射变换 |
warpAffine() | 仿射变换 |
warpPerspective() | 透视变换 |
logPolar() | 对数极坐标变换 |
仿射变换
在opencv中,仿射变换需要变换矩阵。我们可以通过getAffineTransform生成。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdio>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("images/favorite/Lena.jpg", 1);
Point2f srcTri[] ={
Point2f(0, 0),
Point2f(src.cols-1, 0),
Point2f(0, src.rows-1)
};
Point2f dstTri[] ={
Point2f(src.cols*0.f, src.rows*0.33f),
Point2f(src.cols*0.85f, src.rows*0.25f),
Point2f(src.cols*0.15f, src.rows*0.7f)
};
Mat warp_mat = getAffineTransform(srcTri, dstTri);
Mat dst, dst2;
warpAffine(src, dst, warp_mat, src.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar());
imshow("dst0", dst);
waitKey(0);
return 0;
}
透视变换
仿射变换只是透视变换的一个特例。
仿射变换能做到平行四边形的转化,而透视变换能做到任意四边形的转化。
在OpenCV中,我们使用getPerspectiveTransform()得到透视变换矩阵,输入需要四个点的数组。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdio>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("images/favorite/Lena.jpg", 1);
Mat dst;
Point2f srcTri[] ={
Point2f(0, 0),
Point2f(src.cols-1, 0),
Point2f(0, src.rows-1),
Point2f(src.cols-1, src.rows-1)
};
Point2f dstTri[] ={
Point2f(src.cols*0.f, src.rows*0.33f),
Point2f(src.cols*0.85f, src.rows*0.25f),
Point2f(src.cols*0.15f, src.rows*0.7f),
Point2f(src.cols-1, src.rows-1)
};
Mat warp_mat = getPerspectiveTransform(srcTri, dstTri);
warpPerspective(src, dst, warp_mat, src.size());
imshow("warp_Perspecgtive", dst);
waitKey(0);
return 0;
}
极坐标映射
对数极坐标(log-polar)类似人眼真正捕捉到的图像。它是模仿生物视网膜(比如人眼中央小凹的成像原理)而产生的。具体原理是,我们眼球中心到四周的分辨率呈指数型下降。
如图,正方形在对数极坐标中张这样。
- 对数极坐标可以做图像匹配。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdio>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("images/favorite/Lena.jpg");
Mat dst0, dst1;
logPolar(src, dst0, Point2f(src.rows*0.5f, src.cols*0.5f), 40, INTER_LINEAR|WARP_FILL_OUTLIERS);
// linearPolar(src, dst1, Point2f(src.rows*0.5f, src.cols*0.5f), 20, INTER_LINEAR|WARP_FILL_OUTLIERS);
imshow("logPolar", dst0);
// imshow("linearPolar", dst1);
waitKey(0);
return 0;
}