S1.3 仿射變換、透視變換、極座標對映演示
阿新 • • 發佈:2018-11-09
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;
}