OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

根据 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')) warpMatrix=argWmaxECC(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,该示例演示了该函数的使用。注意,如果算法不收敛,该函数会抛出异常。 ### 函数原型 ```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) ### 代码示例 ```cpp #include #include int 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; } ``` ### 运行结果 原始图: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3489706035dd426cb5037dba9ae61eb7.png) 目标图 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c1bdd04aee97451098f8902ffdcf3952.png) 对齐的图 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7489a2a3fa3c4a3687b4bc31d7301d5a.png)

相关推荐
阿蒙Amon5 小时前
【Python小工具】使用 OpenCV 获取视频时长的详细指南
python·opencv·音视频
慕婉03076 小时前
OpenCV图像边缘检测
人工智能·opencv·计算机视觉
jndingxin8 小时前
OpenCV中超分辨率(Super Resolution)模块类cv::dnn_superres::DnnSuperResImpl
人工智能·opencv·dnn
szekl11 小时前
HDMI 2.0 4×2矩阵切换器412HN——多信号输入输出的高清解决方案
linux·矩阵·计算机外设·电脑·ekl
cver12321 小时前
野生动物检测数据集介绍-5,138张图片 野生动物保护监测 智能狩猎相机系统 生态研究与调查
人工智能·pytorch·深度学习·目标检测·计算机视觉·目标跟踪
jndingxin1 天前
OpenCV CUDA模块设备层-----反向二值化阈值处理函数thresh_binary_inv_func()
人工智能·opencv·计算机视觉
jndingxin1 天前
OpenCV CUDA模块设备层-----在 GPU 上执行类似于 std::copy 的操作函数warpCopy()
人工智能·opencv·计算机视觉
晓13131 天前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr
jndingxin1 天前
OpenCV CUDA模块设备层-----在GPU 上高效地执行两个 uint 类型值的最大值比较函数vmax2()
人工智能·opencv·计算机视觉
txwtech1 天前
第10.4篇 使用预训练的目标检测网络
人工智能·计算机视觉·目标跟踪