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)。对于每个给定的点对应关系points1i <-> points2i 和一个基础矩阵 F,它计算校正后的对应关系 newPoints1i <-> newPoints2i,以最小化几何误差 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(points1i, newPoints1i)^2 + d(points2i,newPoints2i)^2 d(points1i,newPoints1i)2+d(points2i,newPoints2i)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)
相关推荐
进哥AI研习社9 小时前
从像素到3D开放世界:Kimi K3在游戏开发中的引擎级能力实测
3d
小宇的天下9 小时前
3D IC 与 TSV:设计挑战与需求
3d
leoZ23115 小时前
Vue3 还原一个企业级后台-14-项目总结
开发语言·人工智能·后端·opencv·计算机视觉·数据挖掘·rust
W_3260016 小时前
Python-OpenCV:库、环境搭建、图片与摄像头解析
开发语言·图像处理·python·opencv·机器学习
W_3260016 小时前
Python-OpenCV:画布、图形、文字、调色滑动条
图像处理·python·opencv·机器学习·计算机视觉
sali-tec17 小时前
C# 基于OpenCv的视觉工作流-章103-空车位识别
人工智能·opencv·计算机视觉
杀生丸学AI1 天前
【稀疏重建】StructSplat:基于非校准稀疏视图的可泛化3DGS
深度学习·3d·音视频·transformer·三维重建·空间智能
蓝速科技2 天前
蓝速科技 3D 全息舱 AI 数字人一体机全尺寸选型实测指南
人工智能·科技·3d
浪里镖客2 天前
zed 2i相机坐标系与内参、外参
数码相机·opencv·计算机视觉
leoZ2312 天前
Vue3 还原一个企业级后台-11-Mock数据策略
opencv·计算机视觉·数据挖掘·语音识别·caffe