OpenCV相机标定与3D重建(35)计算两幅图像之间本质矩阵(Essential Matrix)的函数findEssentialMat()的使用

server/2024/12/27 7:51:03/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

从两幅图像中的对应点计算本质矩阵。
cv::findEssentialMat 是 OpenCV 库中用于计算两幅图像之间本质矩阵(Essential Matrix)的函数。本质矩阵描述了两个校准过的摄像机之间的相对旋转和平移,它对于立体视觉、运动结构恢复(Structure from Motion, SfM)和视觉里程计(Visual Odometry)等计算机视觉任务非常重要。

函数原型1


Mat cv::findEssentialMat	
(InputArray 	points1,InputArray 	points2,InputArray 	cameraMatrix,int 	method = RANSAC,double 	prob = 0.999,double 	threshold = 1.0,int 	maxIters = 1000,OutputArray 	mask = noArray() 
)		

参数1

  • 参数points1:来自第一幅图像的 N (N >= 5) 个2D点数组。点的坐标应该是浮点数(单精度或双精度)。
  • 参数points2:第二幅图像的点数组,与 points1 具有相同的大小和格式。
  • 参数cameraMatrix:相机内参矩阵 A = [ f x 0 c x 0 f y c y 0 0 1 ] A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} A= fx000fy0cxcy1 。注意,此函数假设 points1 和 points2 是来自具有相同内参矩阵的相机的特征点。如果这个假设在你的应用场景中不成立,可以使用 undistortPoints 函数,并为两个相机设置 P=cv::NoArray(),以将图像点转换为适用于单位内参矩阵的归一化图像坐标。当传递这些坐标时,对于此参数应传递单位矩阵。
  • 参数method:计算本质矩阵的方法。
    • RANSAC:用于RANSAC算法。
    • LMEDS:用于最小中值法(LMedS)算法。
  • 参数 prob:仅用于RANSAC或LMedS方法的参数。它指定了估计矩阵正确的期望置信水平(概率)。
  • 参数threshold:仅用于RANSAC方法的参数。它是点到极线的最大距离(以像素为单位),超过该距离的点被认为是离群点,并不用于计算最终的本质矩阵。根据点定位的准确性、图像分辨率和图像噪声,它可以设置为1-3等。
  • 参数mask:输出数组,包含N个元素,每个元素对于离群点设置为0,对于其他点设置为1。该数组仅在RANSAC和LMedS方法中计算。
  • 参数maxIters:稳健方法的最大迭代次数。
    该函数基于五点算法求解器估算本质矩阵。[204] 中描述了该算法,[247] 也与此相关。极几何由以下方程描述:

[ p 2 ; 1 ] T K − T E K − 1 [ p 1 ; 1 ] = 0 [p_2; 1]^T K^{-T} E K^{-1} [p_1; 1] = 0 [p2;1]TKTEK1[p1;1]=0

其中E是本质矩阵,p1 和p2分别是第一幅和第二幅图像中的对应点。此函数的结果可以进一步传递给 decomposeEssentialMat 或 recoverPose 来恢复摄像机之间的相对位姿。

函数原型2


Mat cv::findEssentialMat	
(InputArray 	points1,InputArray 	points2,double 	focal = 1.0,Point2d 	pp = Point2d(0, 0),int 	method = RANSAC,double 	prob = 0.999,double 	threshold = 1.0,int 	maxIters = 1000,OutputArray 	mask = noArray() 
)		

参数2

  • 参数points1:来自第一幅图像的 N (N >= 5) 个2D点数组。点的坐标应该是浮点数(单精度或双精度)。
  • 参数points2:第二幅图像的点数组,与 points1 具有相同的大小和格式。
  • 参数focal:相机的焦距。注意,此函数假设 points1 和 points2 是来自具有相同焦距和主点的相机的特征点。
  • 参数pp:相机的主点。
  • 参数method:计算基本矩阵的方法。
    • RANSAC:用于RANSAC算法。
    • LMEDS:用于最小中值法(LMedS)算法。
  • 参数threshold:仅用于RANSAC方法的参数。它是点到极线的最大距离(以像素为单位),超过该距离的点被认为是离群点,并不用于计算最终的基本矩阵。根据点定位的准确性、图像分辨率和图像噪声,它可以设置为1-3等。
  • 参数prob:仅用于RANSAC或LMedS方法的参数。它指定了估计矩阵正确的期望置信水平(概率)。
  • 参数mask:输出数组,包含N个元素,每个元素对于离群点设置为0,对于其他点设置为1。该数组仅在RANSAC和LMedS方法中计算。
  • 参数maxIters:稳健方法的最大迭代次数。
    说明

这个函数与上述函数的不同之处在于它通过焦距和主点来计算相机内参矩阵

A = [ f 0 x p p 0 f y p p 0 0 1 ] A = \begin{bmatrix} f & 0 & x_{pp} \\ 0 & f & y_{pp} \\ 0 & 0 & 1 \end{bmatrix} A= f000f0xppypp1

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main( int argc, char** argv )
{// 创建虚拟的匹配点数据(假设我们有10对匹配点)vector< Point2f > points1 = { Point2f( 154.0f, 38.0f ),  Point2f( 285.0f, 176.0f ), Point2f( 279.0f, 238.0f ), Point2f( 276.0f, 284.0f ), Point2f( 273.0f, 342.0f ),Point2f( 267.0f, 397.0f ), Point2f( 262.0f, 446.0f ), Point2f( 254.0f, 495.0f ), Point2f( 246.0f, 545.0f ), Point2f( 234.0f, 592.0f ) };vector< Point2f > points2 = { Point2f( 149.0f, 49.0f ),  Point2f( 280.0f, 187.0f ), Point2f( 274.0f, 249.0f ), Point2f( 271.0f, 295.0f ), Point2f( 268.0f, 353.0f ),Point2f( 262.0f, 408.0f ), Point2f( 257.0f, 457.0f ), Point2f( 249.0f, 506.0f ), Point2f( 241.0f, 556.0f ), Point2f( 229.0f, 603.0f ) };// 相机内参矩阵 (示例值)Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 718.856, 0, 607.193, 0, 718.856, 185.216, 0, 0, 1 );// 定义输出的本质矩阵和掩码Mat essentialMatrix, mask;// 使用 RANSAC 方法计算本质矩阵essentialMatrix = findEssentialMat( points1, points2, cameraMatrix, RANSAC, 0.999, 1.0, 1000, mask );// 打印结果cout << "Essential Matrix:\n" << essentialMatrix << endl;// 打印哪些点被认为是内点cout << "Inliers mask:\n";for ( size_t i = 0; i < mask.total(); ++i ){if ( mask.at< uchar >( i ) ){cout << "Point " << i + 1 << " is an inlier." << endl;}else{cout << "Point " << i + 1 << " is an outlier." << endl;}}// 如果需要,可以进一步分解本质矩阵或恢复姿态// decomposeEssentialMat(essentialMatrix, R1, R2, t);// recoverPose(essentialMatrix, points1, points2, cameraMatrix, R, t, mask);return 0;
}

运行结果

Essential Matrix:
[3.552514976490105e-09, -2.34328248364459e-07, -0.6437262524331034;2.332007722595955e-07, -1.168059907413519e-10, -0.2926029947621791;0.6437262524341074, 0.2926029926567176, 3.212847006212214e-09]
Inliers mask:
Point 1 is an inlier.
Point 2 is an inlier.
Point 3 is an inlier.
Point 4 is an inlier.
Point 5 is an inlier.
Point 6 is an inlier.
Point 7 is an inlier.
Point 8 is an inlier.
Point 9 is an inlier.
Point 10 is an inlier.

http://www.ppmy.cn/server/153560.html

相关文章

基于 Paimon x Spark 采集分析半结构化 JSON 的优化实践

摘要&#xff1a;本文整理自 阿里巴巴 A 数据湖架构师康凯老师和 Paimon PMC Member 毕岩老师在11月15日 Apache Spark & Paimon Meetup&#xff0c;助力 Lakehouse 架构生产落地上的分享。 文章介绍了阿里巴巴 A 业务基于 Variant 类型的 JSON 链路优化&#xff0c;并从技…

质数分解,用sqrt缩小范围

题目&#xff1a;scanf一个整数&#xff0c;int32范围内&#xff0c;分解为质数序列输出 例如&#xff1a; 12分解为2 2 3 技巧就一个&#xff1a;用sqrt缩小范围 因为uint32(4,294,967,295)(接近43亿个数)范围内有2亿个左右质数&#xff0c;所以&#xff0c;一般不会用缓存去…

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(二)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

DP动态规划+贪心题目汇总

文章目录 背包01背包416. 分割等和子集 完全背包279. 完全平方数322. 零钱兑换 两个字符串DPLCR 095. 最长公共子序列139. 单词拆分 单个数组字符串DP5. 最长回文子串300. 最长递增子序列53.最大子数组和152. 乘积最大子数组198. 打家劫舍 三角形120. 三角形最小路径和 贪心121…

【EtherCATBasics】- KRTS C++示例精讲(2)

EtherCATBasics示例讲解 目录 EtherCATBasics示例讲解结构说明代码讲解 项目打开请查看【BaseFunction精讲】。 结构说明 EtherCATBasics&#xff1a;应用层程序&#xff0c;主要用于人机交互、数据显示、内核层数据交互等&#xff1b; EtherCATBasics.h &#xff1a; 数据定义…

Linux系统升级OpenSSH 9.8流程

参考链接&#xff1a; openssh最新版本下载地址&#xff1a;Index of /pub/OpenBSD/OpenSSH/portable/ 注意&#xff1a;openssh9.8需要依赖openssl&#xff0c;版本至少为1.1.1。 一、简介 Openssh存在远程代码执行漏洞(CVE-2024-6387)&#xff0c;攻击者可以成功利用该漏…

深入理解Nginx工作原理及优化技巧

NGINX以高性能的负载均衡器&#xff0c;缓存&#xff0c;和web服务器闻名&#xff0c;驱动了全球超过 40% 最繁忙的网站。在大多数场景下&#xff0c;默认的 NGINX 和 Linux 设置可以很好的工作&#xff0c;但要达到最佳性能&#xff0c;有些时候必须做些调整。 NGINX被广泛应…

视频的音乐怎么提取为MP3格式?

MP3是一种广泛使用的音频压缩格式&#xff0c;以其高效的压缩率和良好的音质表现&#xff0c;成为了数字音频领域中的佼佼者&#xff0c;广泛应用于音乐存储、传输和播放。在日常生活中&#xff0c;我们经常遇到需要从视频中提取音频并将其转换为MP3格式的情况。视频的音乐怎么…