S1.3 仿射变换、透视变换、极坐标映射演示

版权声明:看不懂请评论,我会积极改进的 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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36285879/article/details/82938896
今日推荐