参考原文地址:https://www.cnblogs.com/bnuvincent/p/6691189.html
仿射变换(Affine Transformation) :一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。

仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。
仿射变换可以用下面公式表示:

通过简单过程的组合,实现复杂的过程:

coding: 主要看你的需求 什么时候应用放射变换,找到两张图中的三个对应的定位点
#include <opencv2/opencv.hpp> #include <iostream> int main() {// 读取两张图像cv::Mat imgA = cv::imread("imageA.jpg");cv::Mat imgB = cv::imread("imageB.jpg");// 检查图像是否加载成功if (imgA.empty() || imgB.empty()) {std::cerr << "Error: Could not open or find the images!" << std::endl;return -1;}// 定义图像A中的三个点std::vector<cv::Point2f> pointsA = {cv::Point2f(x1, y1),cv::Point2f(x2, y2),cv::Point2f(x3, y3)};// 定义图像B中的三个点std::vector<cv::Point2f> pointsB = {cv::Point2f(x'_1, y'_1),cv::Point2f(x'_2, y'_2),cv::Point2f(x'_3, y'_3)};// 计算仿射变换矩阵cv::Mat affineMatrix = cv::getAffineTransform(pointsB, pointsA);// 使用仿射变换矩阵对图像B进行变换cv::Mat correctedImgB;cv::warpAffine(imgB, correctedImgB, affineMatrix, imgA.size());// 显示结果cv::imshow("Original Image A", imgA);cv::imshow("Original Image B", imgB);cv::imshow("Corrected Image B", correctedImgB);cv::waitKey(0);return 0; }