OpenCV相机标定与3D重建(18)根据基础矩阵(Fundamental Matrix)校正两组匹配点函数correctMatches()的使用

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

算法描述

优化对应点的坐标。

cv::correctMatches 是 OpenCV 库中的一个函数,用于根据基础矩阵(Fundamental Matrix)校正两组匹配点。该函数通过最小化重投影误差来优化匹配点的位置,从而提高特征点匹配的准确性。

函数原型

cpp 复制代码
void cv::correctMatches
(
	InputArray 	F,
	InputArray 	points1,
	InputArray 	points2,
	OutputArray 	newPoints1,
	OutputArray 	newPoints2 
)		

参数

  • 参数F:3x3 的基础矩阵。
  • 参数points1:包含第一组点的 1xN 数组。
  • 参数points2:包含第二组点的 1xN 数组。
  • 参数newPoints1:优化后的第一组点。
  • 参数newPoints2:优化后的第二组点。

该函数实现了最优三角化方法(详见《Multiple View Geometry》[115])。对于每个给定的点对应关系points1[i] <-> points2[i] 和一个基础矩阵 F,它计算校正后的对应关系 newPoints1[i] <-> newPoints2[i],以最小化几何误差 d ( p o i n t s 1 [ i ] , n e w P o i n t s 1 [ i ] ) 2 + d ( p o i n t s 2 [ i ] , n e w P o i n t s 2 [ i ] ) 2 d(points1[i], newPoints1[i])^2 + d(points2[i],newPoints2[i])^2 d(points1[i],newPoints1[i])2+d(points2[i],newPoints2[i])2(其中 d ( a , b ) d(a,b) d(a,b) 是点 a 和点 b 之间的几何距离),同时满足极线约束 n e w P o i n t s 2 T ⋅ F ⋅ n e w P o i n t s 1 = 0 newPoints2^T \cdot F \cdot newPoints1 = 0 newPoints2T⋅F⋅newPoints1=0

使用场景

  • 立体视觉:在双目或多目视觉系统中,用于提高特征点匹配的精度。
  • 结构光扫描:在校正三维重建过程中使用的匹配点时非常有用。
  • 运动估计:在基于特征点的运动估计任务中,可以提高估计的准确性。

代码示例

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

int main()
{
    // 假设我们已经得到了基础矩阵 F 和两组匹配点 points1 和 points2
    cv::Mat F = ( cv::Mat_< double >( 3, 3 ) << 0.998, -0.062, 0.007, 0.062, 0.998, -0.05, 0.007, 0.05, 1.0 );

    // 定义一些匹配点
    std::vector< cv::Point2f > points1 = { cv::Point2f( 100, 150 ), cv::Point2f( 200, 250 ) };
    std::vector< cv::Point2f > points2 = { cv::Point2f( 105, 155 ), cv::Point2f( 205, 255 ) };

    // 创建输出容器
    std::vector< cv::Point2f > newPoints1;
    std::vector< cv::Point2f > newPoints2;

    // 优化对应点的坐标
    cv::correctMatches( F, points1, points2, newPoints1, newPoints2 );

    // 打印结果
    for ( size_t i = 0; i < newPoints1.size(); ++i )
    {
        std::cout << "Original Points: (" << points1[ i ].x << ", " << points1[ i ].y << ") -> (" << points2[ i ].x << ", " << points2[ i ].y << ")\n";
        std::cout << "Optimized Points: (" << newPoints1[ i ].x << ", " << newPoints1[ i ].y << ") -> (" << newPoints2[ i ].x << ", " << newPoints2[ i ].y << ")\n";
    }

    return 0;
}

运行结果

bash 复制代码
Original Points: (100, 150) -> (105, 155)
Optimized Points: (-39.0672, 88.7914) -> (146.107, 75.3975)
Original Points: (200, 250) -> (205, 255)
Optimized Points: (-46.7855, 188.856) -> (259.562, 81.6427)
相关推荐
_李小白1 分钟前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
dgaf18 分钟前
DX12 快速教程(17) —— 立体图标与合并渲染
c语言·c++·3d·图形渲染·d3d12
xp_fangfei1 小时前
通过 Marker(视觉标记)获取机器人位姿
opencv·机器人
动恰客流管家3 小时前
动恰3DV3丨客流统计系统:旺季人手不够淡季闲人太多?客流统计帮你科学优化人力成本
大数据·运维·人工智能·3d
接着奏乐接着舞4 小时前
3D Tiles tileset.jso 数据格式
运维·服务器·3d
Lhan.zzZ5 小时前
笔记_2026.4.28_003
c++·笔记·qt·opencv
神探小白牙6 小时前
echarts,3d堆叠图
android·3d·echarts
zhangrelay6 小时前
三分钟云课实践速通--工程制图基础-3D--FreeCAD
笔记·学习·3d
qq_387459587 小时前
浩辰CAD看图王轻松绘制CAD局部放大图
图像处理·3d·cad·cad看图·cad看图软件·cad看图王·浩辰cad看图王
三维频道8 小时前
3C电子制造破局:高精度蓝光3D扫描仪在形位公差分析中的应用
3d·制造·3c电子制造·新拓三维·xtom·形位公差分析·蓝光3d扫描仪