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

OpenCV相机标定与3D重建(46)将三维空间中的点投影到二维图像平面上函数projectPoints()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

将3D点投影到图像平面上。
cv::projectPoints 是 OpenCV 库中的一个函数,用于将三维空间中的点投影到二维图像平面上。这个过程涉及到相机的内参矩阵、外参(旋转和平移向量)以及畸变系数。该函数可以用来模拟或校正从3D世界坐标到2D图像坐标的转换。

函数原型


void cv::projectPoints	
(InputArray 	objectPoints,InputArray 	rvec,InputArray 	tvec,InputArray 	cameraMatrix,InputArray 	distCoeffs,OutputArray 	imagePoints,OutputArray 	jacobian = noArray(),double 	aspectRatio = 0 
)		

参数

  • 参数objectPoints:相对于世界坐标系表达的对象点数组。可以是3xN/Nx3的单通道矩阵或1xN/Nx1的三通道矩阵(或 vector),其中N是视图中的点数。
  • 参数rvec:旋转向量(Rodrigues形式),与 tvec 一起,执行从世界坐标系到相机坐标系的基变换,详见 calibrateCamera 的说明。
  • 参数tvec:平移向量,参见上述参数描述。
  • 参数cameraMatrix:相机内参矩阵 A = [ f x 0 c x 0 f y c y 0 0 1 ] . A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}. A= fx000fy0cxcy1 .
  • 参数distCoeffs:输入的畸变系数向量 ( k 1 , k 2 , p 1 , p 2 [ , k 3 [ , k 4 , k 5 , k 6 [ , s 1 , s 2 , s 3 , s 4 [ , τ x , τ y ] ] ] ] ) (k_1, k_2, p_1, p_2[, k_3[, k_4, k_5, k_6[, s_1, s_2, s_3, s_4[, \tau_x, \tau_y]]]]) (k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]),包含4、5、8、12或14个元素。如果向量为空,则假设畸变为零。
  • 参数imagePoints:输出的图像点数组,可以是1xN/Nx1的双通道矩阵,或 vector。
  • 参数jacobian:可选输出的 2N×(10+) 雅可比矩阵,表示图像点坐标对旋转向量、平移向量、焦距、主点坐标和畸变系数各分量的偏导数。在旧接口中,雅可比矩阵的不同部分通过不同的输出参数返回。
  • 参数aspectRatio:可选的“固定纵横比”参数。如果该参数不为0,函数假定纵横比 ( f x / f y ) (f_x / f_y) (fx/fy)是固定的,并相应地调整雅可比矩阵。

函数描述:
该函数根据给定的相机内部和外部参数计算3D点到图像平面的2D投影。可选地,函数还可以计算雅可比矩阵——即图像点坐标(作为所有输入参数的函数)对特定参数(内部或外部)的偏导数矩阵。这些雅可比矩阵用于 calibrateCamera、solvePnP 和 stereoCalibrate 中的全局优化过程。该函数本身也可以用来计算重投影误差,给定当前的内部和外部参数。

注意:
通过设置 rvec = tvec = [0,0,0],或将 cameraMatrix 设置为3x3的单位矩阵,或传递零畸变系数,可以获得函数的各种有用的部分情况。这意味着,可以在理想零畸变设置下计算稀疏点集的畸变坐标或应用透视变换(并计算导数)。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{// 定义3D点vector< Point3f > objectPoints = { Point3f( 0, 0, 0 ), Point3f( 1, 0, 0 ), Point3f( 0, 1, 0 ) };// 相机姿态(旋转和平移)Mat rvec = ( Mat_< double >( 3, 1 ) << 0, 0, 0 );  // 无旋转Mat tvec = ( Mat_< double >( 3, 1 ) << 0, 0, 0 );  // 无平移// 相机内参矩阵Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1 );// 畸变系数(假设无畸变)Mat distCoeffs = Mat::zeros( 5, 1, CV_64F );// 定义输出变量vector< Point2f > imagePoints;// 执行投影projectPoints( objectPoints, rvec, tvec, cameraMatrix, distCoeffs, imagePoints );// 打印结果cout << "Projected Image Points:" << endl;for ( size_t i = 0; i < imagePoints.size(); ++i ){cout << "(" << imagePoints[ i ].x << ", " << imagePoints[ i ].y << ")" << endl;}return 0;
}

运行结果

Projected Image Points:
(320, 240)
(1320, 240)
(320, 1240)
http://www.lryc.cn/news/517441.html

相关文章:

  • 基于Elasticsearch8的向量检索实现相似图形搜索
  • springboot+vue使用easyExcel实现导出功能
  • ffmpeg-avio实战:打开本地文件或者网络直播流dome
  • css预处理器sass
  • VulnHub-Acid(1/100)
  • MATLAB语言的正则表达式
  • 通过 route 或 ip route 管理Linux主机路由
  • MYSQL--------SQL 注入简介MySQL SQL Mode 简介
  • 第6章——HTTP首部
  • 多行输入模式(dquote> 提示符)double quote(双引号)
  • 【什么是MVCC?】
  • HarmonyOS开发:粒子动画应用实战
  • 数据库课设——网上花店销售管理系统(上)
  • 用于AI的 数据存储其获取介绍
  • flutter 专题二十四 Flutter性能优化在携程酒店的实践
  • L28.【LeetCode笔记】移动零(三种解法)
  • jenkins入门10--自动化构建
  • el-table拖拽表格
  • 如何轻松反转C# List<T>中的元素顺序
  • Transformer中Self-Attention以及Multi-Head Attention模块详解(附pytorch实现)
  • 在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b
  • 六十一:HTTP/2的问题及HTTP/3的意义
  • IOS开发如何从入门进阶到高级
  • 非一般的小数:小数的概念新解、小数分类、浮点数的存储
  • 关于游戏销量的思考
  • JuiceFS 详解:一款为云原生设计的高性能分布式文件系统
  • 百度Android面试题及参考答案 (下)
  • RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案
  • Elasticsearch:Query rules 疑难解答
  • 四、VSCODE 使用GIT插件