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

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.

相关文章:

OpenCV相机标定与3D重建(28)估计两个三维点集之间的最优平移变换函数estimateTranslation3D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个3D点集之间的最优平移。 它计算 [ x y z ] [ X Y Z ] [ b 1 b 2 b 3 ] \begin{bmatrix} x\\ y\\ z\\ \end{bmatrix} \begin{bmatri…...

UE5仿漫威争锋灵蝶冲刺技能

这两天玩了一下漫威争锋Marvel Rivals&#xff0c;发现是UE5做的&#xff0c;对里面一些角色技能挺感兴趣的&#xff0c;想简单复刻一下技能功能&#xff0c;顺便复习一下学过的知识 首先把摄像机设置调整一下 CameraBoom里搜索lag 把摄像机延迟关掉 &#xff0c;这样摄像机就…...

CSS盒子模型(溢出隐藏,块级元素和行级元素的居中对齐,元素样式重置)

overflow&#xff1a;值 规定了内容溢出元素框时所发生的事情 visible&#xff1a;内容不会被修剪&#xff0c;会显示在元素框之外&#xff0c;默认值 overflow: visible; hidden&#xff1a;内容会被修剪&#xff0c;溢出内容不可见 overflow: hidden; scroll&#xff1a;内…...

语音增强的损失函数选择

一、最优尺度不变信噪比&#xff08;OSISNR&#xff09;损失函数 参考&#xff1a;论文解读 --Optimal scale-invariant signal-to-noise ratio and curriculum learning for monaural multi-spea   最优尺度不变信噪比&#xff08;OSI-SNR&#xff09;是一种用于评估信号质量…...

【python自动化六】UI自动化基础-selenium的使用

selenium是目前用得比较多的UI自动化测试框架&#xff0c;支持java&#xff0c;python等多种语言&#xff0c;目前我们就选用selenium来做UI自动化。 1.selenium安装 安装命令 pip install selenium2.selenium的简单使用 本文以chrome浏览器为例&#xff0c;配套selenium中c…...

【习题答案】让您的应用拥有领先的位置服务能力

判断题 1.在使用&#xff08;逆&#xff09;地理编码前&#xff0c;需要使用isGeocoderAvailable检查服务状态。 正确(True) 错误(False) 2.当同时配置定位场景和优先级策略时&#xff0c;会优先使用优先级策略。 正确(True) 错误(False) 单选题 1.获取精准定位需要申请哪个权…...

java中list和map区别

在Java中&#xff0c;List和Map是两种不同类型的集合接口&#xff0c;它们用于不同的场景并且具有不同的特性和用途。以下是List和Map的主要区别&#xff1a; 1. 数据结构 List&#xff1a;是一个有序的集合&#xff0c;允许重复元素。它实现了Collection接口&#xff0c;并且…...

java后端传时间戳给前端的三种方式

一. 后端传时间戳给前端的几种方式 使用System.currentTimeMillis() 这是最简单的方式&#xff0c;返回自1970年1月1日&#xff08;UTC&#xff09;以来的毫秒数&#xff0c;可以直接传递给前端。 long timestamp1 System.currentTimeMillis();使用java.time.Instant Java…...

【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…...

oracle: create new database

用database configuration Assistant 引导创建数据库。记得给system,sys 设置自己的口令&#xff0c;便于添加新操作用户。 创建操作用户&#xff1a; -- 别加双引号&#xff0c;否则&#xff0c;无法用 create user geovindu identified by 888888; create user geovin identi…...

混合开发环境---使用编程AI辅助开发Qt

文章目录 [toc]1、说明2、演示视频 1、说明 新时代的浪潮早就已经来临&#xff0c;上不了船的人终将被抛弃&#xff0c;合理使用AI辅助开发、提升效率是大趋势 注意&#xff1a;不要被AI奴隶 合理使用AI辅助编程&#xff0c;十倍提升效率。 大部分的编程AI都有vs code插件&…...

Sigrity SystemSI仿真分析教程文件路径

为了方便读者能够快速上手和学会Sigrity SystemSI 的功能&#xff0c;将Sigrity SystemSI仿真分析教程专栏所有文章对应的实例文件上传至以下路径 https://download.csdn.net/download/weixin_54787054/90171488?spm1001.2014.3001.5503...

【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802940.html?templateId1718516 【问题分类】功能使用 【关键字】pipelined 【问题描述】 Oracle PL/SQL中包含pipelined函数的对象迁移到YashanDB会出现不兼容现象。 【问题原因分…...

【开发实战】QT5+ 工业相机 + OpenCV工作流集成演示

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; 概述 基于OpenCV工作流引擎SDK Qt5 海康工业相机实现了从图像采集到OpenCV工作流运行的完整流程。其中工业相机采图是一个单…...

各种电机原理介绍

1&#xff0c;直流电机 &#xff08;1&#xff09;基本原理 直流电动机由直流电驱动电池或外部电源为其供电。在最简单的直流电动机中&#xff0c;定子为永磁体(即红蓝磁体外壳)&#xff0c;转子是一个电磁体(即线圈)&#xff0c;电流通过碳刷和一个换向器作用于转动的线圈。…...

深入了解 React:从入门到高级应用

深入了解 React&#xff1a;从入门到高级应用 React 是由 Facebook 开发并维护的一个开源 JavaScript 库&#xff0c;用于构建用户界面。自2013年发布以来&#xff0c;React 在前端开发领域迅速崛起&#xff0c;成为最受欢迎的 UI 构建工具之一。无论是小型的单页应用&#xf…...

Cglib代理简单案例

Cglib代理简单案例 前言&#xff1a; 1&#xff0c;实现对目标类的增强 2&#xff0c;源码后期补齐 步骤 1&#xff0c;添加cglib依赖 2&#xff0c;编写目标类&#xff0c;书写里面的方法 3&#xff0c;实现MethodInterceptor 接口&#xff0c;重写intercept方法 4&#xff…...

FreeMarker语法

1. 查找转移 <#function getSubSlot x > <#return (x) ? switch( "1", "L", "2", "R", "" )> </#function> 2. 转换数字 ?number ${mergedMap[placement.sequence].material.subs…...

DP动态规划(装箱问题)

# [NOIP2001 普及组] 装箱问题 ## 题目描述 有一个箱子容量为 $V$&#xff0c;同时有 $n$ 个物品&#xff0c;每个物品有一个体积。 现在从 $n$ 个物品中&#xff0c;任取若干个装入箱内&#xff08;也可以不取&#xff09;&#xff0c;使箱子的剩余空间最小。输出这个最小值。…...

内网IP段介绍与汇总

IPV4内网段 IP地址段地址范围地址数量用途描述0.0.0.0/80.0.0.0–0.255.255.25516777216SoftwareCurrent network (only valid as source address).10.0.0.0/810.0.0.0–10.255.255.25516777216Private networkUsed for local communications within a private network.100.64…...

三、ubuntu18.04安装docker

1.使用默认ubuntu存储库安装docker 更新软件存储库 更新本地软件数据库确保可以访问最新版本。打开终端输入&#xff1a;sudo apt-get update 卸载旧版本的docker 建议继续之前卸载任何旧的docker软件。打开终端输入&#xff1a;sudo apt-get remove docker docker-engine …...

数据库与表空间

背景知识概述 数据库&模式 “实例/集簇”金仓是一个单实例管多库&#xff0c;把多库的集合叫做集簇&#xff0c;他们共用一个集簇目录&#xff0c;比如data目录下面里的子目录的数据文件。数据库里面有模式&#xff0c;在金仓里面模式是&#xff1a;据逻辑相关性对象的集…...

【CSS in Depth 2 精译_091】15.4:让 CSS 高度值过渡到自动高度 + 15.5:自定义属性的过渡设置(全新)+ 15.6:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 15.2.1 定制贝塞尔曲线15.2.2 阶跃 15.3 非动画属性 15.3.1 不可添加动画效果的属性15.3.2 淡入与淡出 15.4 过…...

Oracle中间件 SOA之 OSB 12C服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用1台服务器&#xff0c;具体信息如下&#xff1a; App1服务器 归类 APP服务器 Ip Address 172.xx.30.xx HostName appdev01. xxxxx.com Alias appdev01 OSB1服务器 归类 OSB服务器 Ip Address 172.xx3…...

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…...

线性表实验

实验目的与要求 实验目的&#xff1a; 线性表的逻辑结构特点和线性表抽象数据类型的描述方法线性表的两类存储结构设计方法以及各自的优缺点掌握线性表的基本知识深入理解、掌握并灵活运用线性表。熟练掌握线性表的存储结构及主要运算的实现掌握栈的定义、栈的逻辑结构特性和…...

003无重复字符的最长子串

(https://i-blog.csdnimg.cn/direct/352cc4217764458f9a1510c62f89a91e.png)(https://i-blog.csdnimg.cn/direct/14239305bb5a4d068f323de7afc14086.png)...

记录--uniapp 安卓端实现录音功能,保存为amr/mp3文件

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 功能实现需要用到MediaRecorder、navigator.mediaDevices.getUserMedia、Blob等API&#xff0c;uniapp App端不支持&#xff0c;需要借助renderjs来实现 实现逻辑 通过naviga…...

前端生成docx文档、excel表格、图片、pdf文件

一、前端将页面某区域内容下载为word文档&#xff1a;html-to-docx、file-saver插件组合使用 import HTMLtoDOCX from html-to-docx; import { saveAs } from file-saver;const exportTest async () > {const fileBuffer await HTMLtoDOCX(<h2>文件标题</h2>&…...

c++---------流类

格式化输入&#xff08;cin的格式化&#xff09; 基本用法与控制符 在C中&#xff0c;std::cin用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。它默认以空白字符&#xff08;空格、制表符、换行符&#xff09;为分隔符来读取不同的数据。例如&#xff0c;读取两个…...