OpenCV——仿射变换

getRotationMatrix2D()函数用于计算旋转矩阵warpAffine()函数用于实现图像的仿射变换

Mat getRotationMatrix2D( Point2f center, double angle, double scale );
  • center:图像旋转的中心位置。
  • angle:图像旋转的角度,单位为度,正值为逆时针旋转。
  • scale:两个轴的比例因子,可以实现旋转过程中的图像缩放,不缩放输入1。

 在这里插入图片描述

在这里插入图片描述 

warpAffine()函数进行仿射变换

void cv::warpAffine(InputArray src,
                    OutputArray dst,
                    InputArray M,
                    Size dsize,
                    int  flags = INTER_LINEAR,
                    int  borderMode = BORDER_CONSTANT,
                    const Scalar& borderValue = Scalar()
)

 

  • src:输入图像。
  • dst:仿射变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
  • M:2×3的变换矩阵。
  • dsize:输出图像的尺寸。
  • flags:插值方法标志,可选参数及含义在表3-3和表3-4中给出。
  • borderMode:像素边界外推方法的标志。
  • borderValue:填充边界使用的数值,默认情况下为0

根据旋转矩阵和平移矩阵以及图像像素值,仿射变换的数学原理

在这里插入图片描述 

 

Mat getAffineTransform( const Point2f src[], const Point2f dst[] );
  • src[]:原图像中的三个像素坐标。
  • dst[]:目标图像中的三个像素坐标。

该函数两个输入量都是存放浮点坐标的数组,在生成数组的时候像素点的输入顺序无关,但是需要保证像素点的对应关系,函数的返回值是一个2×3的变换矩阵。

简单示例

//
// Created by smallflyfly on 2021/6/9.
//

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat im = imread("test.jpg");
    resize(im, im, Size(0, 0), 0.5, 0.5);
    imshow("im", im);

    Mat r1;
    double angle = 30.0;
    Size size(im.cols, im.rows);
    Point2f center(im.rows / 2.0, im.cols / 2.0);
    r1 = getRotationMatrix2D(center, angle, 1);
    Mat warp;
    warpAffine(im, warp, r1, size);
    imshow("warp1", warp);

    // 根据三个点进行仿射
    Point2f srcPoints[3];
    Point2f dstPoints[3];

    //src image 3 points
    srcPoints[0] = Point2f(0, 0);
    srcPoints[1] = Point2f(0, im.cols-1);
    srcPoints[2] = Point2f(im.rows-1, im.cols-1);
    // dst image 3 points
    dstPoints[0] = Point2f(im.rows * 0.2, im.cols * 0.2);
    dstPoints[1] = Point2f(im.rows * 0.1, im.cols * 0.7);
    dstPoints[2] = Point2f(im.rows * 0.9, im.cols * 0.7);
    r1 = getAffineTransform(srcPoints, dstPoints);
    warpAffine(im, warp, r1, size);
    imshow("warp", warp);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值