仿射变换

参考原文地址:https://www.cnblogs.com/bnuvincent/p/6691189.html

   仿射变换(Affine Transformation) :一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。

image

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

仿射变换可以用下面公式表示:

image

 

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

 

image

 

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;
}

 

posted @ 2025-07-30 12:00  Wind_Swing_Dunn  阅读(254)  评论(0)    收藏  举报