OpenCV每日函数 几何图像变换模块 (2) getAffineTransform函数

一、概述

        getAffineTransform函数从三对对应点计算仿射变换。该函数计算仿射变换的 2×3 矩阵,使得:

        其中dst(i)=({x}'_i,{y}'_i),src(i)=(x_i,y_i),i=0,1,2

二、getAffineTransform函数

1、函数原型

cv::getAffineTransform (const Point2f src[], const Point2f dst[])
cv::getAffineTransform (InputArray src, InputArray dst)

2、参数详解

src 源图像中三角形顶点的坐标。
dst 目标图像中相应三角形顶点的坐标。

三、OpenCV源码

1、源码路径

opencv\modules\imgproc\src\imgwarp.cpp

2、源码代码

cv::Mat cv::getAffineTransform(InputArray _src, InputArray _dst)
{
    Mat src = _src.getMat(), dst = _dst.getMat();
    CV_Assert(src.checkVector(2, CV_32F) == 3 && dst.checkVector(2, CV_32F) == 3);
    return getAffineTransform((const Point2f*)src.data, (const Point2f*)dst.data);
}
cv::Mat cv::getAffineTransform( const Point2f src[], const Point2f dst[] )
{
    Mat M(2, 3, CV_64F), X(6, 1, CV_64F, M.ptr());
    double a[6*6], b[6];
    Mat A(6, 6, CV_64F, a), B(6, 1, CV_64F, b);

    for( int i = 0; i < 3; i++ )
    {
        int j = i*12;
        int k = i*12+6;
        a[j] = a[k+3] = src[i].x;
        a[j+1] = a[k+4] = src[i].y;
        a[j+2] = a[k+5] = 1;
        a[j+3] = a[j+4] = a[j+5] = 0;
        a[k] = a[k+1] = a[k+2] = 0;
        b[i*2] = dst[i].x;
        b[i*2+1] = dst[i].y;
    }

    solve( A, B, X );
    return M;
}

四、简单使用示例

# src原图 dst_warpTransformation平移变换图片
Point2f srcPoints1[3];
Point2f dstPoints1[3];
 
srcPoints1[0] = Point2i(0, 0);
srcPoints1[1] = Point2i(0, src.rows);
srcPoints1[2] = Point2i(src.cols, 0);
 
dstPoints1[0] = Point2i(src.cols / 3, 0);
dstPoints1[1] = Point2i(src.cols / 3, src.rows);
dstPoints1[2] = Point2i(src.cols + src.cols / 3, 0);
 
Mat M3 = getAffineTransform(srcPoints1, dstPoints1);
warpAffine(src, dst_warpTransformation, M3, Size(src.cols + src.cols / 3, src.rows));

        根据两组点计算得到的3 * 2的矩阵。 

        另一组示例数据得到的矩阵,清楚表明一个任意的仿射变换都能表示为乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移)。

五、仿射变换相关参考

Opencv学习笔记 - 仿射变换/透视变换/对数极坐标变换_坐望云起的博客-CSDN博客_对数极坐标变换Opencv学习笔记 - 仿射变换/透视变换/对数极坐标变换https://skydance.blog.csdn.net/article/details/109705939

Opencv学习笔记 常用函数、基础知识三 仿射变换_坐望云起的博客-CSDN博客仿射变换代表的是两幅图之间的关系。1、一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移).2、用仿射变换来处理,旋转 (线性变换),平移 (向量加),缩放操作 (线性变换)https://skydance.blog.csdn.net/article/details/108885176

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125260191
今日推荐