- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算给定图像点对应的极线(epipolar lines)。
对于立体图像对中一个图像的点,计算这些点在另一个图像中对应的极线。
cv::computeCorrespondEpilines 是 OpenCV 库中的一个函数,用于计算给定图像点对应的极线(epipolar lines)。这个函数在立体视觉和多视图几何中非常重要,因为它帮助确定一个点在一个图像中的对应点在另一个图像中的可能位置。这有助于减少匹配问题的搜索空间。
函数原型
void cv::computeCorrespondEpilines
(
InputArray points,
int whichImage,
InputArray F,
OutputArray lines
)
参数
- 参数points:输入点。类型为 CV_32FC2 的 N×1 或 1×N 矩阵,或 vector 类型的向量。
- 参数whichImage:包含这些点的图像索引(1 或 2)。
- 参数F:基础矩阵,可以通过 findFundamentalMat 或 stereoRectify 函数估计得到。
- 参数lines:输出的极线向量,对应于另一图像中的点。每条极线 ax+by+c=0 由三个数 (a, b, c) 编码。
对于立体图像对中的一个图像中的每一个点,该函数计算其在另一个图像中对应的极线方程。
根据基础矩阵的定义(参见 findFundamentalMat),对于第一个图像中的点 l i ( 2 ) l^{(2)}_i li(2)(当 whichImage=1 时),第二个图像中的极 p i ( 1 ) p^{(1)}_i pi(1)计算为:
l i ( 2 ) = F p i ( 1 ) l^{(2)}_i = F p^{(1)}_i li(2)=Fpi(1)
反之,当 whichImage=2 时,从第二个图像中的点
l
i
(
1
)
l^{(1)}_i
li(1)计算第一个图像中的极线
p
i
(
2
)
p^{(2)}_i
pi(2)为:
l
i
(
1
)
=
F
T
p
i
(
2
)
l^{(1)}_i = F^T p^{(2)}_i
li(1)=FTpi(2)
极线系数定义到一个比例因子。它们被归一化以满足
a
i
2
+
b
i
2
=
1
a_i^2+b_i^2=1
ai2+bi2=1
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 假设有一些特征点从第一张图像中提取出来
vector< Point2f > points1 = { Point2f( 100, 150 ), Point2f( 200, 250 ) };
// 假设我们已经计算得到了基础矩阵 F
Mat F = ( Mat_< double >( 3, 3 ) << 1, 0, 0, 0, 1, 0, 0, 0, 1 ); // 这里只是示例,实际的基础矩阵需要通过其他方法计算得到
// 计算这些点在第二张图像中的对应极线
vector< Vec3f > lines2;
computeCorrespondEpilines( points1, 1, F, lines2 );
// 打印结果
for ( size_t i = 0; i < lines2.size(); ++i )
{
cout << "Line corresponding to point (" << points1[ i ].x << ", " << points1[ i ].y << ") is: " << lines2[ i ] << endl;
}
return 0;
}
运行结果
Line corresponding to point (100, 150) is: [0.5547, 0.83205, 0.005547]
Line corresponding to point (200, 250) is: [0.624695, 0.780869, 0.00312348]