当前位置: 首页 > article >正文

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.

http://www.kler.cn/a/451529.html

相关文章:

  • 记一次Maven拉不了包的问题
  • STM32-笔记11-手写带操作系统的延时函数
  • Mybatis 小结
  • Mysql InnoDB存储引擎中聚簇索引和非聚簇索引的区别
  • Unity3d 基于UGUI和VideoPlayer 实现一个多功能视频播放器功能(含源码)
  • EasyExcel停更,FastExcel接力
  • 【C++】18___list容器
  • 无人机搭载rtk技术详解!
  • leetcode hot100 二叉树的最大深度
  • 数据结构之线性表之顺序表
  • 《智驱新材合成:AI 点亮创新路径之光》
  • upload-labs通关记录1
  • 图片和媒体资源的优化:提升Web应用性能与用户体验的关键
  • 生活家居的选择:打造温馨舒适的小窝
  • 科技快讯 | 刘强东提前发年终奖;理想超充站超时占用费试运营;美团听障骑手助手全量上线;微信视频号评论区可以斗图了
  • 关于日期的方法们
  • 频谱分析仪的关键性能指标有哪些?
  • 生成签名文件 .keystore
  • wfb-ng 开源代码之libsodium应用
  • 自动控制系统综合与LabVIEW实现
  • WebAPI编程(第一天,第二天)
  • 科普时刻 | 借助鲁棒性设计解决制造中的不确定性问题
  • 【论文笔记】Cross-lingual few-shot sign language recognition
  • 【深度学习基础之多尺度特征提取】不同尺寸卷积核、不同步长卷积是如何在深度学习网络中提取多尺度特征的?附代码
  • docker 容器的基本使用
  • 鸿蒙Next API 12开发,使用@ohos/axios进行HTTP请求