一、概述
getAffineTransform函数从三对对应点计算仿射变换。该函数计算仿射变换的 2×3 矩阵,使得:
其中。
二、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的矩阵。
另一组示例数据得到的矩阵,清楚表明一个任意的仿射变换都能表示为乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移)。