1. 程式人生 > >S1.3 仿射變換、透視變換、極座標對映演示

S1.3 仿射變換、透視變換、極座標對映演示

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;
}

在這裡插入圖片描述