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)
相关文章:
OpenCV相机标定与3D重建(46)将三维空间中的点投影到二维图像平面上函数projectPoints()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将3D点投影到图像平面上。 cv::projectPoints 是 OpenCV 库中的一个函数,用于将三维空间中的点投影到二维图像平面上。这个过程涉及到…...
基于Elasticsearch8的向量检索实现相似图形搜索
Elasticsearch8版本增加了KNN向量检索,可以基于此功能实现以图搜图功能。 1、首先创建索引,es提供了类型为dense_vector的字段,用于存储向量,其中dims是向量维度,可以不配置,es会根据第一条插入的向量维度…...
springboot+vue使用easyExcel实现导出功能
vue部分 // 导出计算数据exportDataHandle(id) {this.$http({url: this.$http.adornUrl(/xxx/xxx/exportCalDataExcel),method: post,data: this.$http.adornData({id: id}),responseType: blob, // 重要:告诉axios我们希望接收二进制数据}).then(({data}) > {c…...
ffmpeg-avio实战:打开本地文件或者网络直播流dome
使用ffmpeg打开打开本地文件或者网络直播流的一个小dome。流程产靠ffmpeg4.x系列的解码流程-CSDN博客 #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavformat/avio.h> #include <libavutil/file.h> #include &l…...
css预处理器sass
在前端开发的世界中,CSS 是构建网页样式的基础。然而,随着项目规模的增大,纯 CSS 的编写和维护往往会变得复杂而繁琐。为了解决这些痛点,Sass(Syntactically Awesome Style Sheets)应运而生。Sass 是一种 C…...
VulnHub-Acid(1/100)
参考链接: 【VulnHub】Acid靶场复盘-CSDN博客 靶场渗透(二)——Acid渗透_ambassador 靶场渗透-CSDN博客 网络安全从0到0.5之Acid靶机实战渗透测试 | CN-SEC 中文网 Vulnhub靶场渗透练习(四) Acid - 紅人 - 博客园 红日团队…...
MATLAB语言的正则表达式
MATLAB 中的正则表达式使用指南 引言 在数据处理和文本分析中,正则表达式是一种强大而灵活的工具。MATLAB 作为一种广泛应用于科学计算和数据分析的编程语言,提供了对正则表达式的支持,使得用户可以方便地进行字符串匹配与处理。本文将深入…...
通过 route 或 ip route 管理Linux主机路由
目录 一:route 使用说明1、查看路由信息2、删除指定路由3、增加指定路由 二:ip route 使用说明1、查看主机路由2、新增主机路由3、删除主机路由 通过route 或者ip route修改Linux主机路由后属于临时生效,系统重启后就恢复默认值了,…...
MYSQL--------SQL 注入简介MySQL SQL Mode 简介
SQL 注入简介 定义:SQL 注入是一种常见的安全漏洞,攻击者通过在输入中插入恶意的 SQL 语句,利用应用程序中未正确处理的输入数据,来改变 SQL 查询的逻辑,从而执行非预期的操作,如绕过身份验证、获取未授权…...
第6章——HTTP首部
第六章——HTTP首部 HTTP报文结构 都必有报文首部 HTTP请求报文 HTTP响应报文 HTTP首部字段 ###传递重要信息 首部字段结构 首部字段名:字段值(,字段值,字段值) 首部字段类型 通用首部字段 请求首部字…...
多行输入模式(dquote> 提示符)double quote(双引号)
文章目录 1、引号不匹配具体原因解决办法如何避免此问题 2、double quote(双引号)出现原因解决办法预防措施 ~/Downloads/productqualification-develop git:[main] git commit -m "漏添加到暂存区的代码“ dgqdgqdeMac-mini productqualification-…...
【什么是MVCC?】
MVCC(Multi - Version Concurrency Control)即多版本并发控制。 一、背景和概念 在数据库系统中,并发控制是非常重要的。当多个事务同时访问和修改数据时,需要一种机制来确保数据的一致性和正确性。MVCC 是一种并发控制的技术&a…...
HarmonyOS开发:粒子动画应用实战
目录 引言 粒子动画技术概述 关于粒子动画 粒子发射器的实现 设置粒子颜色 关于粒子的生命周期 粒子扰动场的设置 粒子动画的简单实现 最后 引言 做应用开发的小伙伴想必都清楚动画是必备技能,尤其是在移动应用开发中的动画使用频率是非常高的。而粒子动画…...
数据库课设——网上花店销售管理系统(上)
声明:此次课设为本人专业课课设报告内容,仅供参考,不要照搬 1 问题的提出 随着互联网发展与电子商务普及,网上花店兴起,其突破地域限制、提供便捷购物体验且市场呈快速增长趋势。该系统需具备多方面功能以满足花店运营…...
用于AI的 数据存储其获取介绍
用于 AI 的数据存储和获取方法依赖于系统架构、数据类型(结构化、非结构化、时序数据、嵌入向量等)以及使用场景(训练数据存储、实时推断、历史数据分析等)。以下是主要存储方式的分类和简介: 1. 文件存储 介绍&…...
flutter 专题二十四 Flutter性能优化在携程酒店的实践
Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年,这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合,大大提高了研发效率。在开发过程中,也遇到了一些性能相关问题和…...
L28.【LeetCode笔记】移动零(三种解法)
目录 1.题目 2.向前覆盖法 分析 代码 提交结果 3.优解:双指针 代码 提交结果 4.其他不符合题意的方法:使用队列 代码 提交结果 1.题目 https://leetcode.cn/problems/move-zeroes/description/ 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾…...
jenkins入门10--自动化构建
build periodically:设定类似cron周期性时间触发构建 * * * * * (五颗星,中间用空格隔开) 第一颗表示分钟,取值0~59 第二颗表示小时,取值0~23 第三颗表示一个月的第几天,取值1~31 第四颗表示第几月…...
el-table拖拽表格
1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js,我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强,实现组件化的思想,可以结合Vue,使用起来更方便。 2、引入拖拽函数…...
如何轻松反转C# List<T>中的元素顺序
在C#中,有多种方法可以反转 List<T> 的元素顺序。以下是几种常见的方法: 方法一:使用 List<T>.Reverse 方法 List<T> 类提供了一个内置的 Reverse 方法,可以就地反转列表中的元素顺序。 using System; using…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
