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)
相关推荐
Hi Z x y1 小时前
3dtiles 加载问题
3d
二川bro9 小时前
第27节:3D数据可视化与大规模地形渲染
3d·信息可视化
小王爱学人工智能14 小时前
OpenCV的阈值处理
人工智能·opencv·计算机视觉
湫兮之风15 小时前
OpenCV: Mat存储方式全解析-单通道、多通道内存布局详解
人工智能·opencv·计算机视觉
周小码1 天前
CesiumJS详解:打造专业级Web 3D地球仪与地图的JavaScript库
前端·javascript·3d
大嘴带你水论文1 天前
震惊!仅用10张照片就能随意编辑3D人脸?韩国KAIST最新黑科技FFaceNeRF解析!
论文阅读·人工智能·python·科技·计算机视觉·3d·transformer
JoinApper1 天前
小白学OpenCV系列3-图像算数运算
人工智能·opencv·计算机视觉
却道天凉_好个秋1 天前
计算机视觉(九):图像轮廓
人工智能·opencv·计算机视觉·图像轮廓
R-G-B1 天前
OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?
人工智能·opencv·工业相机·传感器尺寸·像元·测算图片中的物体尺寸·像元与物体尺寸
liugenwei2 天前
OpenCV - 图像的IO操作
opencv·计算机视觉