多网站绑定域名,网络组建实训总结,开发一个app大概需要多少钱?,梅林固件做网站操作系统#xff1a;ubuntu22.04 OpenCV版本#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言#xff1a;C11
算法描述
从两幅图像中的对应点计算基本矩阵。 cv::findFundamentalMat 是 OpenCV 中用于计算两幅图像之间基本矩阵#xff08;Fundamental Matrix#… 操作系统ubuntu22.04 OpenCV版本OpenCV4.9 IDE:Visual Studio Code 编程语言C11
算法描述
从两幅图像中的对应点计算基本矩阵。 cv::findFundamentalMat 是 OpenCV 中用于计算两幅图像之间基本矩阵Fundamental Matrix的函数。基本矩阵描述了两个未校准摄像机之间的几何关系它在计算机视觉中用于立体视觉、运动结构恢复Structure from Motion, SfM、视觉里程计等任务。
函数原型 Mat cv::findFundamentalMat
(InputArray points1,InputArray points2,int method,double ransacReprojThreshold,double confidence,int maxIters,OutputArray mask noArray()
)
参数
参数points1来自第一幅图像的 N 个点数组。点的坐标应该是浮点数单精度或双精度。参数points2第二幅图像的点数组与 points1 具有相同的大小和格式。参数method计算基本矩阵的方法。 FM_7POINT用于7点算法。N7FM_8POINT用于8点算法。N≥8FM_RANSAC用于RANSAC算法。N≥8FM_LMEDS用于最小中值法LMedS算法。N≥8 参数ransacReprojThreshold仅用于 RANSAC 的参数。它是点到极线的最大距离以像素为单位超过该距离的点被认为是离群点并不用于计算最终的基本矩阵。根据点定位的准确性、图像分辨率和图像噪声它可以设置为1-3等。参数confidence仅用于 RANSAC 和 LMedS 方法的参数。它指定了估计矩阵正确的期望置信水平概率。参数[out] mask可选输出掩码。参数maxIters稳健方法的最大迭代次数。
说明
极几何由以下方程描述 [ p 2 ; 1 ] T F [ p 1 ; 1 ] 0 [p_2; 1]^T F [p_1; 1] 0 [p2;1]TF[p1;1]0
其中 F 是基本矩阵p1和p2分别是第一幅和第二幅图像中的对应点。
该函数使用上述列出的四种方法之一来计算基本矩阵并返回找到的基本矩阵。通常只找到一个矩阵。但在7点算法的情况下该函数可能返回多达3个解一个 9×3 矩阵按顺序存储所有3个矩阵。
// Example. Estimation of fundamental matrix using the RANSAC algorithm
int point_count 100;
vectorPoint2f points1(point_count);
vectorPoint2f points2(point_count);
// initialize the points here ...
for( int i 0; i point_count; i )
{points1[i] ...;points2[i] ...;
}
Mat fundamental_matrix findFundamentalMat(points1, points2, FM_RANSAC, 3, 0.99);代码示例 #include iostream
#include opencv2/opencv.hppusing namespace cv;
using namespace std;int main( int argc, char** argv )
{// 创建虚拟的匹配点数据假设我们有8对匹配点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 ) };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 ) };// 定义输出的基本矩阵和掩码Mat fundamentalMatrix, mask;// 使用 RANSAC 方法计算基本矩阵fundamentalMatrix findFundamentalMat( points1, points2,FM_RANSAC, // 使用RANSAC方法1.0, // 点到极线的最大重投影误差0.99, // 置信水平2000, // 最大迭代次数mask ); // 输出掩码// 打印结果cout Fundamental Matrix:\n fundamentalMatrix 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;}}return 0;
}运行结果
Fundamental Matrix:
[-3.247212965698772e-20, -0.0008949509319799827, 0.704568065615863;0.0008949509319799836, 3.892534466973619e-19, 0.229349120734492;-0.7144125258676433, -0.2338238753943923, 1]
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.