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

本文深入探讨了OpenCV中的图像变换技术,包括仿射变换、透视变换和极坐标映射,通过实例代码展示了如何使用这些变换进行图像处理。文章详细介绍了getAffineTransform和getPerspectiveTransform函数的使用,以及logPolar函数在图像匹配中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值