imgproc模块—仿射变换

1.目的
(1)使用OpenCV函数 warpAffine 来实现一些简单的重映射.
(2)使用OpenCV函数 getRotationMatrix2D 来获得一个 2×3 旋转矩阵
(3)使用OpenCV函数getAffineTransform获取仿射变换矩阵

2.原理
[1]仿射变换
使用仿射变换可以实现: 旋转 (线性变换) ,平移 (向量加) ,缩放操作 (线性变换) 。通常使用 2×3 矩阵来表示仿射变换.
仿射变换

考虑到我们要使用矩阵 A 和 B 对二维向量 X 做变换, 所以也能表示为下列形式:
这里写图片描述

我们能通过两组三点求出仿射变换 (你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点。
这里写图片描述

3.部分代码解释
(1)getAffineTransform

    /*
    getAffineTransform参数解释
    srcTri:三个不共线的点
    dstTri:变换后的三个点
    warp_mat:2×3的仿射变换矩阵
    */
    warp_mat = getAffineTransform(srcTri, dstTri);

(2)getRotationMatrix2D

    /*
    getRotationMatrix2D参数解释
    center:旋转中心
    angle:旋转角度50 degrees,负数为顺时针,正数为逆时针
    */
    warp_rotation_mat = getRotationMatrix2D(center, angle, scale);

(3)warpAffine

    /*
    warpAffine参数解释
    src:输入图像
    warp_dst:变换后图像
    warp_mat:仿射变换矩阵
    src.size():输出图像大小
    */
    warpAffine(src, warp_dst, warp_mat, src.size());

4.完整代码
(1)CommonInclude.h

#ifndef COMMON_INCLUDE
#define COMMON_INCLUDE
#include<iostream>
using namespace std;
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
#endif

(2)Affine.cpp

#include "CommonInclude.h"

int main(int argc, char** argv){
    if(argc<2){
        cout << "more parameters are required!!!" << endl;
        return(-1);
    }
    //创建图像矩阵
    Mat src;
    Mat warp_dst;
    Mat warp_rotation_dst;
    Mat warp_mat, warp_rotation_mat;
    //窗口名称
    char origin_win[] = "Origin";
    char warpAffine_win[] = "Affine";
    char warpAffineRotation_win[] = "Affine Rotation";
    //图像读取
    src = imread(argv[1]);
    if(!src.data){
        cout << "error to read image!!!" << endl;
        return(-1);
    }
    imshow(origin_win, src);

    Point2f srcTri[3];
    Point2f dstTri[3];
    srcTri[0] = Point2f( 0,0 );
    srcTri[1] = Point2f( src.cols - 1, 0 );
    srcTri[2] = Point2f( 0, src.rows - 1 );

    dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
    dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
    dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );     
    //获取仿射变换矩阵
    /*
    getAffineTransform参数解释
    srcTri:三个不共线的点
    dstTri:变换后的三个点
    warp_mat:2×3的仿射变换矩阵
    */
    warp_mat = getAffineTransform(srcTri, dstTri);
    cout << warp_mat << endl;
    //仿射变换
    /*
    warpAffine参数解释
    src:输入图像
    warp_dst:变换后图像
    warp_mat:仿射变换矩阵
    src.size():输出图像大小
    */
    warpAffine(src, warp_dst, warp_mat, src.size());
    imshow(warpAffine_win, warp_dst);
    //仿射旋转变换
    Point2f center = Point2f(src.cols/2.0, src.rows/2.0);
    double angle = 45;
    double scale = 0.6;
    //获取旋转矩阵
    /*
    getRotationMatrix2D参数解释
    center:旋转中心
    angle:旋转角度50 degrees,负数为顺时针,正数为逆时针
    */
    warp_rotation_mat = getRotationMatrix2D(center, angle, scale);
    warpAffine(src, warp_rotation_dst, warp_rotation_mat, src.size());
    imshow(warpAffineRotation_win, warp_rotation_dst);
    waitKey(0);
    return(0);
}

参考文献
1.http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值