OpenCV视觉分析之目标跟踪(10)估计两个点集之间的刚性变换函数estimateRigidTransform的使用

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

算法描述

计算两个2D点集之间的最优仿射变换

estimateRigidTransform 是 OpenCV 中的一个函数,用于估计两个点集之间的刚性变换(即平移和旋转)。这个函数在计算机视觉中常用于图像配准、运动估计等任务。

该函数找到一个最优的仿射变换 A\|b(一个 2x3 的浮点矩阵),该变换最佳地逼近两个点集之间的仿射变换。

两个点集

两个栅格图像。在这种情况下,函数首先在 src 图像中找到一些特征,并在 dst 图像中找到对应的特征。之后,问题就简化为第一种情况。

在点集的情况下,问题表述如下:你需要找到一个 2x2 矩阵 A 和一个 2x1 向量 b,使得:
A ∗ ∣ b ∗ = a r g min ⁡ A ∣ b ∑ i ∥ dst i − A src i T − b ∥ 2 A\^\*\|b\^\* = arg \min _{A\|b} \sum _i \| \texttt{dst}i - A { \texttt{src}i}^T - b \| ^2 A∗∣b∗=argA∣bmini∑∥dsti−AsrciT−b∥2

其中 srci 和 dsti 分别是 src 和 dst 中的第 i 个点。A\|b 可以是任意的(当 fullAffine=true 时),或者具有以下形式:

a 11 a 12 b 1 − a 12 a 11 b 2 \] \\begin{bmatrix} a_{11} \& a_{12} \& b_1 \\\\ -a_{12} \& a_{11} \& b_2 \\end{bmatrix} \[a11−a12a12a11b1b2

当 fullAffine=false 时。

函数原型

cpp 复制代码
Mat cv::estimateRigidTransform	
(
	InputArray 	src,
	InputArray 	dst,
	bool 	fullAffine 
)		

参数

  • 参数src:第一个输入的2D点集,存储在 std::vector 或 Mat 中,或存储在 Mat 中的图像。
  • 参数dst:第二个输入的2D点集,与 src 大小和类型相同,或另一个图像。
  • 参数fullAffine:如果为 true,函数将寻找一个没有额外限制的最优仿射变换(6个自由度)。否则,可选择的变换类别仅限于平移、旋转和均匀缩放的组合(4个自由度)

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 创建源图像
    Mat src_image = Mat::zeros( 300, 300, CV_8UC3 );
    rectangle( src_image, Point( 50, 50 ), Point( 150, 150 ), Scalar( 255, 0, 0 ), -1 );
    circle( src_image, Point( 200, 200 ), 50, Scalar( 0, 255, 0 ), -1 );

    // 创建目标图像
    Mat dst_image = Mat::zeros( 300, 300, CV_8UC3 );
    Mat M         = getRotationMatrix2D( Point( 150, 150 ), 45, 1.0 );  // 旋转45度
    M.at< double >( 0, 2 ) += 50;                                       // 平移50个像素
    M.at< double >( 1, 2 ) += 50;                                       // 平移50个像素
    warpAffine( src_image, dst_image, M, dst_image.size() );

    // 显示生成的图像
    imshow( "Source Image", src_image );
    imshow( "Destination Image", dst_image );

    // 提取特征点
    vector< Point2f > src_points = { { 50, 50 }, { 150, 50 }, { 50, 150 }, { 200, 200 } };
    vector< Point2f > dst_points = { { 100, 100 }, { 200, 100 }, { 100, 200 }, { 250, 250 } };

    // 估计刚性变换矩阵
    Mat rigid_transform = estimateRigidTransform( src_points, dst_points, false );

    if ( rigid_transform.empty() )
    {
        cerr << "Error: Could not estimate rigid transform." << endl;
        return -1;
    }

    // 输出变换矩阵
    cout << "Rigid Transform Matrix:\n" << rigid_transform << endl;

    // 应用变换
    Mat transformed_image;
    warpAffine( src_image, transformed_image, rigid_transform, dst_image.size() );

    // 显示结果
    imshow( "Transformed Image", transformed_image );

    waitKey( 0 );

    return 0;
}

运行结果

相关推荐
sunneo16 分钟前
磐石2.0发布,科学建模新突破
人工智能
煎饼学大模型17 分钟前
Agent 的“大脑-手“解耦架构:当推理层和工具执行层各自独立演进
数据库·人工智能·oracle·架构·agent
南京码讯光电技术有限公司1 小时前
2026年4G/5G工业CPE推荐:从极端场景看硬核选型
人工智能
企业智能研究2 小时前
企业如何落地企微私域智能客服来降本增效:从技术选型到实施落地的完整指南
大数据·人工智能·企业微信·智能客服
AI办公探索者2 小时前
仓储物流AI任务执行的技术拆解:从WMS自动化到多设备协同的落地路径
运维·人工智能·ai·自动化
delishcomcn2 小时前
边缘计算+AI模型:电化铝分切装备的智能化改造路径
大数据·人工智能·边缘计算
fai厅的秃头姐!2 小时前
OpenCV——进阶
人工智能·opencv·计算机视觉
蓝速科技2 小时前
蓝速 AI 双屏翻译机酒店涉外接待部署指南
人工智能
q567315232 小时前
人工智能训练数据采集:稳定代理IP高并发方案全解析
人工智能·爬虫·网络协议·tcp/ip·代理模式·代理ip
太原geo小侦探2 小时前
2026门店AI流量实测测评:同为实体门店,AI问答曝光差距在哪?
大数据·人工智能·生活·流量运营·内容运营