OpenCV相机标定与3D重建(28)估计两个三维点集之间的最优平移变换函数estimateTranslation3D()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算两个3D点集之间的最优平移。
它计算
[
x
y
z
]
=
[
X
Y
Z
]
+
[
b
1
b
2
b
3
]
\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} = \begin{bmatrix} X\\ Y\\ Z\\ \end{bmatrix} + \begin{bmatrix} b_1\\ b_2\\ b_3\\ \end{bmatrix}
xyz
=
XYZ
+
b1b2b3
cv::estimateTranslation3D 是 OpenCV 库中的一个函数,用于估计两个三维点集之间的最优平移变换。此函数通常用于3D图像配准、物体识别和追踪等领域。它通过最小化源点集与目标点集之间的几何误差来估计平移向量,并且可以选择使用鲁棒方法(如RANSAC)来处理异常值(outliers)。
函数原型
int cv::estimateTranslation3D
(
InputArray src,
InputArray dst,
OutputArray out,
OutputArray inliers,
double ransacThreshold = 3,
double confidence = 0.99
)
参数
-
参数src 第一个输入的3D点集,包含 (X, Y, Z)。
-
参数dst 第二个输入的3D点集,包含 (x, y, z)。
-
参数out 输出的3D平移向量 3×1,形式如下:
[ b 1 b 2 b 3 ] \begin{bmatrix} b_1 \\ b_2 \\ b_3 \\ \end{bmatrix} b1b2b3 -
参数inliers 输出向量,指示哪些点是内点(1-内点,0-外点)。
-
参数ransacThreshold 在RANSAC算法中,考虑一个点为内点的最大重投影误差。
-
参数confidence 对估计变换的置信水平,在0和1之间。通常0.95到0.99之间的值就足够了。过于接近1的值可能会显著减慢估计过程。低于0.8-0.9的值可能导致变换估计不准确。
该函数使用RANSAC算法估计两个3D点集之间的最优3D平移。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// 定义两组对应的3D点 (X, Y, Z) - 源点集和目标点集
vector< Point3f > src = { Point3f( 0, 0, 0 ), Point3f( 1, 0, 0 ), Point3f( 0, 1, 0 ), Point3f( 0, 0, 1 ) };
vector< Point3f > dst = { Point3f( 1, 1, 1 ), Point3f( 2, 1, 1 ), Point3f( 1, 2, 1 ), Point3f( 1, 1, 2 ) };
// 定义一个 Mat 来接收输出的平移向量矩阵
Mat translationVector;
// 定义一个 Mat 来接收内点信息
vector< uchar > inliers;
// 调用 estimateTranslation3D 函数
int inlierCount = estimateTranslation3D( src, dst, translationVector, inliers );
if ( !translationVector.empty() )
{
cout << "Estimated Translation Vector:\n" << translationVector << endl;
cout << "Number of inliers: " << inlierCount << endl;
// 打印哪些点被认为是内点
for ( size_t i = 0; i < inliers.size(); ++i )
{
if ( inliers[ i ] )
{
cout << "Point pair (" << src[ i ] << ", " << dst[ i ] << ") is an inlier.\n";
}
else
{
cout << "Point pair (" << src[ i ] << ", " << dst[ i ] << ") is an outlier.\n";
}
}
}
else
{
cout << "Failed to estimate translation." << endl;
}
return 0;
}
运行结果
Estimated Translation Vector:
[1, 1, 1]
Number of inliers: 1
Point pair ([0, 0, 0], [1, 1, 1]) is an inlier.
Point pair ([1, 0, 0], [2, 1, 1]) is an inlier.
Point pair ([0, 1, 0], [1, 2, 1]) is an inlier.
Point pair ([0, 0, 1], [1, 1, 2]) is an inlier.