微信放在网站根目录,抖音电商,备案域名网站大全,建网站后如何运营操作系统#xff1a;ubuntu22.04 OpenCV版本#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言#xff1a;C11
算法描述
根据 ECC 标准 78找到两幅图像之间的几何变换#xff08;warp#xff09;。
该函数根据 ECC 标准 ([78]) 估计最优变换#xff08;warpMatri… 操作系统ubuntu22.04 OpenCV版本OpenCV4.9 IDE:Visual Studio Code 编程语言C11
算法描述
根据 ECC 标准 78找到两幅图像之间的几何变换warp。
该函数根据 ECC 标准 ([78]) 估计最优变换warpMatrix也就是说 warpMatrix arg max W ECC ( templateImage ( x , y ) , inputImage ( x ′ , y ′ ) ) \texttt{warpMatrix} \arg\max_{W} \texttt{ECC}(\texttt{templateImage}(x,y),\texttt{inputImage}(x,y)) warpMatrixargWmaxECC(templateImage(x,y),inputImage(x′,y′)) 此处 [ x ′ y ′ ] W ⋅ [ x y 1 ] \begin{bmatrix} x \\ y \end{bmatrix} W \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} [x′y′]W⋅ xy1
方程在单应性变换中使用齐次坐标时成立。它返回最终的增强相关系数即模板图像和最终变形的输入图像之间的相关系数。当给定一个 3×3 矩阵且 motionType 为 0、1 或 2 时第三行被忽略。
与 findHomography 和 estimateRigidTransform 不同findTransformECC 函数实现了一种基于区域的对齐方法该方法基于强度相似性。本质上该函数更新初始变换该变换大致对齐图像。如果缺少这些信息则使用单位变换单位矩阵作为初始化。注意如果图像经历了强烈的位移/旋转需要一个初始变换来大致对齐图像例如一个简单的欧氏变换/相似变换允许图像显示大致相同的内容。在第二幅图像中使用逆向变形以使图像接近第一幅图像即在使用 warpAffine 或 warpPerspective 时使用 WARP_INVERSE_MAP 标志。还可以参见 OpenCV 示例 image_alignment.cpp该示例演示了该函数的使用。注意如果算法不收敛该函数会抛出异常。
函数原型
double cv::findTransformECC
(InputArray templateImage,InputArray inputImage,InputOutputArray warpMatrix,int motionType,TermCriteria criteria,InputArray inputMask,int gaussFiltSize
) 参数 参数 templateImage单通道模板图像CV_8U 或 CV_32F 数组。 参数inputImage单通道输入图像该图像应使用最终的 warpMatrix 进行变形以提供与 templateImage 类似的图像类型与 templateImage 相同。 参数warpMatrix浮点型 2×3 或 3×3 映射矩阵变形矩阵。 参数motionType参数指定运动类型 MOTION_TRANSLATION 设置平移运动模型warpMatrix 是 2×3 的矩阵前 2×2 部分为单位矩阵其余两个参数被估计。MOTION_EUCLIDEAN 设置欧氏刚性变换作为运动模型估计三个参数warpMatrix 是 2×3 的矩阵。MOTION_AFFINE 设置仿射运动模型默认估计六个参数warpMatrix 是 2×3 的矩阵。 MOTION_HOMOGRAPHY 设置单应性作为运动模型估计八个参数warpMatrix 是 3×3 的矩阵。 -参数criteria参数指定 ECC 算法的终止条件criteria.epsilon 定义了两次迭代之间相关系数增量的阈值负的 criteria.epsilon 使 -criteria.maxcount 成为唯一的终止条件。默认值如上声明所示。 参数inputMask一个可选的掩码用于指示 inputImage 的有效值。 参数gaussFiltSize一个可选值指示高斯模糊滤波器的大小默认值- 5
代码示例 #include opencv2/opencv.hpp
#include iostreamint main() {// 读取图像cv::Mat image1 cv::imread(/media/dingxin/data/study/OpenCV/sources/images/ecc1.png, cv::IMREAD_GRAYSCALE);cv::Mat image2 cv::imread(/media/dingxin/data/study/OpenCV/sources/images/ecc2.png, cv::IMREAD_GRAYSCALE);if (image1.empty() || image2.empty()) {std::cout Could not open or find the images std::endl;return -1;}// 定义变换矩阵cv::Mat warp_matrix cv::Mat::eye(2, 3, CV_32F);// 设置终止条件const int MAX_ITER 1000;const double EPSILON 1e-5;cv::TermCriteria criteria(cv::TermCriteria::COUNT cv::TermCriteria::EPS, MAX_ITER, EPSILON);// 计算变换矩阵double ecc cv::findTransformECC(image1, image2, warp_matrix, cv::MOTION_AFFINE, criteria);// 输出变换矩阵std::cout Transformation Matrix:\n warp_matrix std::endl;// 使用计算出的变换矩阵对第二张图像进行变换cv::Mat aligned_image;cv::warpAffine(image2, aligned_image, warp_matrix, image1.size());// 显示原图和对齐后的图像cv::imshow(Original Image, image1);cv::imshow(Aligned Image, aligned_image);cv::imshow(Target Image, image2);cv::waitKey(0);return 0;
}运行结果
原始图 目标图 对齐的图