仿射变换
参考原文地址: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; }
 
                    
                     
                    
                 
                    
                

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号