OpenCV相机标定与3D重建(62)根据两个投影矩阵和对应的图像点来计算3D空间中点的坐标函数triangulatePoints()的使用

devtools/2025/1/22 14:09:50/

加粗样式- 操作系统:ubuntu22.04

  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

这个函数通过使用立体相机对3维点的观测,重建这些点的三维坐标(以齐次坐标表示)。
cv::triangulatePoints 是 OpenCV 库中的一个函数,用于根据两个投影矩阵和对应的图像点来计算3D空间中点的坐标。这个过程称为三角测量(Triangulation)。它利用了两个不同视角下观察到的同一空间点在图像平面上的位置以及这两个视角的投影矩阵来进行计算。

函数原型

void cv::triangulatePoints	
(InputArray 	projMatr1,InputArray 	projMatr2,InputArray 	projPoints1,InputArray 	projPoints2,OutputArray 	points4D 
)		

参数

  • 参数projMatr1:第一个相机的3x4投影矩阵,即这个矩阵将世界坐标系中的3D点投影到第一张图像中。
  • 参数projMatr2:第二个相机的3x4投影矩阵,即这个矩阵将世界坐标系中的3D点投影到第二张图像中。
  • 参数projPoints1:第一张图像中特征点的2xN数组。在C++版本中,这也可以是一个特征点的向量或大小为1xN或Nx1的两通道矩阵。
  • 参数projPoints2:第二张图像中对应点的2xN数组。在C++版本中,这也可以是一个特征点的向量或大小为1xN或Nx1的两通道矩阵。
  • 参数points4D:齐次坐标中重建点的4xN数组。这些点返回的是世界坐标系中的坐标。

注意

请记住,所有输入数据都应该是浮点类型(float),以便此函数能够正常工作。
如果使用了来自 stereoRectify 的投影矩阵,则返回的点表示在第一个相机的校正坐标系中。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace cv;
using namespace std;// 假设我们已经获得了两个相机的投影矩阵和对应图像中的特征点
void exampleTriangulatePoints()
{// 投影矩阵 (3x4) - 这里只是示例数据,实际应用中应根据相机标定获得Mat projMatr1 = ( Mat_< double >( 3, 4 ) << 500, 0, 320, 0, 0, 500, 240, 0, 0, 0, 1, 0 );Mat projMatr2 = ( Mat_< double >( 3, 4 ) << 500, 0, 320, -100, 0, 500, 240, 0, 0, 0, 1, 0 );// 对应的2D点 (N个点)vector< Point2f > projPoints1 = { Point2f( 320, 240 ), Point2f( 330, 250 ) };vector< Point2f > projPoints2 = { Point2f( 300, 240 ), Point2f( 310, 250 ) };// 将2D点转换为适合输入的形式(每个点作为一个列向量)Mat points1( 2, projPoints1.size(), CV_32F );Mat points2( 2, projPoints2.size(), CV_32F );for ( size_t i = 0; i < projPoints1.size(); ++i ){points1.at< float >( 0, i ) = projPoints1[ i ].x;points1.at< float >( 1, i ) = projPoints1[ i ].y;points2.at< float >( 0, i ) = projPoints2[ i ].x;points2.at< float >( 1, i ) = projPoints2[ i ].y;}// 输出4D点矩阵Mat points4D;// 执行三角测量triangulatePoints( projMatr1, projMatr2, points1, points2, points4D );// 转换为非齐次坐标并打印结果for ( int i = 0; i < points4D.cols; ++i ){float x = points4D.at< float >( 0, i ) / points4D.at< float >( 3, i );float y = points4D.at< float >( 1, i ) / points4D.at< float >( 3, i );float z = points4D.at< float >( 2, i ) / points4D.at< float >( 3, i );cout << "Point " << i + 1 << ": (" << x << ", " << y << ", " << z << ")" << endl;}
}int main()
{try{exampleTriangulatePoints();}catch ( const cv::Exception& e ){cerr << "Error: " << e.what() << endl;return -1;}return 0;
}

运行结果

Point 1: (2.23711e-17, -0, 5)
Point 2: (0.1, 0.1, 5)

http://www.ppmy.cn/devtools/152618.html

相关文章

JAVA-Exploit编写(8-10)--http-request库编写exp批量利用

目录 1.【CVE-2018-1002015】thinkphp命令执行漏洞 2.编写为标准类 2.1 标准类文件标准 2.2 测试类文件调用 3.批量检测 3.1 读取文本 3.2 标准类 3.2 测试类 1.【CVE-2018-1002015】thinkphp命令执行漏洞 以此漏洞为例,通过编写两个方法,分别是漏洞的POC和EXP,看过之前…

汇编与逆向(一)-汇编工具简介

RadASM是一款著名的WIN32汇编编辑器&#xff0c;支持MASM、TASM等多种汇编编译器&#xff0c;Windows界面&#xff0c;支持语法高亮&#xff0c;自带一个资源编辑器和一个调试器。 一、汇编IDE工具&#xff1a;RadASM RadASM有内置的语言包 下载地址&#xff1a;RadASM asse…

Erlang语言的并发编程

Erlang语言的并发编程 引言 并发编程是现代软件开发中的一个重要领域&#xff0c;尤其是在面对需要高效处理大量任务的应用时。Erlang是一种专门设计用于并发编程的编程语言&#xff0c;由于其在电信和即时通信系统中的广泛应用&#xff0c;逐渐引起了开发者的关注。Erlang的…

抽奖系统(4——活动模块)

1. 活动创建 需求回顾 创建的活动信息包含&#xff1a; 活动名称活动描述关联的一批奖品&#xff0c;关联时需要选择奖品等级&#xff08;一等奖、二等奖、三等奖&#xff09;&#xff0c;及奖品库存圈选一批人员参与抽奖 tip&#xff1a;什么时候设置奖品数量和奖品等级&am…

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统可以涵盖多个功能模块&#xff0c;例如用户管理、设备管理、预约管理、计费管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、 regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff0…

AIP-124 资源关联

编号124原文链接AIP-124: Resource association状态批准创建日期2020-03-20更新日期2020-03-20 有时无法用常规的树结构清晰表达API资源的层次结构。例如&#xff0c;一个资源可能与两个另外的资源类型之间存在多对一关系。或者一个资源可能与另一个资源类型存在多对多关系。 …

k8s namespace绑定节点

k8s namespace绑定节点 1. apiserver 启用准入控制 PodNodeSelector2. namespace 添加注解 scheduler.alpha.kubernetes.io/node-selector3. label node 1. apiserver 启用准入控制 PodNodeSelector vim /etc/kubernetes/manifests/kube-apiserver.yaml spec:containers:- co…