opencv的相机标定与姿态解算

首先我们要知道四个重要的坐标系

  • 世界坐标系
  • 相机坐标系
  • 图像成像坐标系
  • 图像像素坐标系
    在这里插入图片描述

坐标系之间的转换

世界坐标系——相机坐标系
从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示:
假设世界坐标系中点坐标为[x1,y1,z1],对应的相机坐标系中的点坐标为[x,y,z],世界坐标系转换至相机坐标系遵循如下推导:
在这里插入图片描述
相机坐标系——图像坐标系
从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。 整个变换推导为两个相似三角形的变换,
在这里插入图片描述
像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。

在这里插入图片描述
那么通过上面四个坐标系的转换就可以得到一个点从世界坐标系如何转换到像素坐标系的。

在这里插入图片描述
其中相机的内参和外参可以通过张正友标定获取。

下面使用 OpenCV 的 cv.calibrateCamera 和 MATLAB 的 estimateCameraParameters 函数来完成相机标定,然后使用这些参数推算图像中的坐标点在真实世界中的位置,并通过相机位姿(位置和方向)的估计绘制相机的空间位置。

1. 添加 mexopencv 路径并编译 OpenCV

addpath('D:\\围棋\\坐标解算\\坐标解算相关内容\\mexopencv');
mexopencv.make('opencv_path', 'D:\Tools\opencv341\opencv\build');
  • addpath 将 mexopencv 工具包的路径添加到 MATLAB 的搜索路径中。mexopencv 是一个连接 MATLAB 和 OpenCV 的接口工具包。
  • mexopencv.make 编译 mexopencv 以使用 OpenCV 库,指定了 OpenCV 的安装路径。

2. 读取 YAML 文件中的数据

fs1 = cv.FileStorage('D:\\围棋\\坐标解算\\坐标解算相关内容\\mexopencv\\samples\\01_1.yml');
fs2 = cv.FileStorage('D:\\围棋\\坐标解算\\坐标解算相关内容\\mexopencv\\samples\\01_2.yml');
  • cv.FileStorage 读取 YAML 格式的文件,这些文件包含图像的相关点(角点或其他特征点)的坐标数据,用于标定相机参数。

3. 读取图像并显示

img = imread("D:\围棋\坐标解算\坐标解算相关内容\1.jpg");
imshow(img);
  • 使用 imread 读取图像文件,并通过 imshow 显示图像。

4. 使用 OpenCV 进行相机标定

标定的结果包括相机的内参矩阵(calib.M)和畸变系数(calib.D),还有相机的旋转矩阵(calib.R)和平移向量(calib.T),这四个值共同描述了相机的内外参数。

opts = struct();
% 初始化标定选项,比如图像尺寸、纵横比、内参矩阵是否猜测等
params = st2kv(opts.flags);
  • 初始化标定时所需的参数(如图像尺寸、纵横比等),并创建了相机矩阵 calib.M 和畸变系数 calib.D,作为标定的输入。
[calib.M, calib.D, calib.rms, calib.R, calib.T] = cv.calibrateCamera(...);
  • 使用 OpenCV 的 cv.calibrateCamera 函数进行相机的内外参数标定。输出包括相机矩阵 M、畸变系数 D、旋转矩阵 R 和平移向量 T

5. 旋转矩阵转换与位姿计算

R = cv.Rodrigues(calib.R{1});
[cR,cT]=cv.solvePnP(cvobjp{1},cvimgp{1},calib.M);
  • 使用 cv.Rodrigues 将旋转向量转换为旋转矩阵,并使用 cv.solvePnP 计算相机的位姿(旋转和位移)。

6. 使用 MATLAB 函数进行相机标定

cameraParams = estimateCameraParameters(imagePoints,objectPoints, ...'ImageSize',imageSize);
  • 使用 MATLAB 的 estimateCameraParameters 函数基于图像点和物体点估算相机的内参数。
[rotationMatrix, translationVector] = extrinsics(...);
  • extrinsics 函数通过图像点和物体点计算相机的外参(旋转矩阵和位移向量)。

7. 计算图像中的点在世界坐标中的位置

worldPoints1 = pointsToWorld(cameraParams, rotationMatrix, translationVector, box);
  • 使用 pointsToWorld 函数将图像中的特定点转换为实际世界中的坐标。

8. 相机位置和方向的绘制

[orientation, location] = extrinsicsToCameraPose(rotationMatrix, translationVector);
plotCamera('Location', location, 'Orientation', orientation, 'Size', 20);
  • 使用 extrinsicsToCameraPose 函数获取相机的姿态信息(位置和方向),并使用 plotCamera 绘制相机位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)

使用指南 直接复制在AI工具助手中使用(提问前) 可以前往已经添加好Prompt预设的AI系统测试使用(可自定义添加使用) SparkAi系统现已支持自定义添加官方GPTs(对专业领域更加专业,支持多模态文档&#xff0…

同三维T80001EHK 4K超高清HDMI编码器

【系列介绍】 同三维T80001EHK 4K超高清HDMI编码器 4K超高清编码器(采集盒)是专业的高清音视频编码产品,只需要占用较小的带宽,即可获得高清晰度的视频信号。该产品采用H.265编码格式,可同时对视频音频进行编码。输出…

【万字长文】Word2Vec计算详解(二)Skip-gram模型

【万字长文】Word2Vec计算详解(二)Skip-gram模型 写在前面 本篇介绍Word2Vec中的第二个模型Skip-gram模型 【万字长文】Word2Vec计算详解(一)CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解(二)S…

<Project-8.1 pdf2tx-MM> Python Flask 用浏览器翻译PDF内容 2个翻译引擎 繁简中文结果 从P8更改

更新 Project Name:pdf2tx (P6) Date: 5oct.24 Function: 在浏览器中翻译PDF文件 Code:https://blog.csdn.net/davenian/article/details/142723144 升级 Project Name: pdf2tx-mm (P8) 7oct.24 加入多线程,分页OCR识别,提高性能与速度 使…

5G NR UE初始接入信令流程

文章目录 5G NR UE初始接入信令流程 5G NR UE初始接入信令流程 用户设备向gNB-DU发送RRCSetupRequest消息。gNB-DU 包含 RRC 消息,如果 UE 被接纳,则在 INITIAL UL RRC MESSAGE TRANSFER 消息中包括为 UE 分配的低层配置,并将其传输到 gNB-CU…

【OpenCV】基础操作学习--实现原理理解

读取和显示图像 基本操作 cv2.imread(filename , flags):文件中读取图像,从指定路径中读取图像,返回一个图像数组(NumPy数组) filename:图像文件的路径flags:指定读取图像的方式 cv2.IMREAD_COL…

linux线程 | 线程的概念

前言:本篇讲述linux里面线程的相关概念。 线程在我们的教材中的定义通常是这样的——线程是进程的一个执行分支。 线程的执行粒度, 要比进程要细。 我们在读完这句话后其实并不能很好的理解什么是线程。 所以, 本节内容博主将会带友友们理解什么是线程&a…

代码随想录算法训练营第四十六天 | 647. 回文子串,516.最长回文子序列

四十六天打卡,今天用动态规划解决回文问题,回文问题需要用二维dp解决 647.回文子串 题目链接 解题思路 没做出来,布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串&#xff0…

2024.10月7~10日 进一步完善《电信资费管理系统》

一、新增的模块: 在原项目基础上,新增加了以下功能: 1、增加AspectJ 框架的AOP 异常记录和事务管理模块。 2、增加SpringMVC的拦截器,实现登录 控制页面访问权限。 3、增加 Logback日志框架,记录日志。 4、增加动态验…

Hunuan-DiT代码阅读

一 整体架构 该模型是以SD为基础的文生图模型,具体扩散模型原理参考https://zhouyifan.net/2023/07/07/20230330-diffusion-model/,代码地址https://github.com/Tencent/HunyuanDiT,这里介绍 Full-parameter Training 二 输入数据处理 这里…

netdata保姆级面板介绍

netdata保姆级面板介绍 基本介绍部署流程下载安装指令选择设置KSM为什么要启用 KSM?如何启用 KSM?验证 KSM 是否启用注意事项 检查端口启动状态 netdata和grafana的区别NetdataGrafananetdata各指标介绍总览system overview栏仪表盘1. CPU2. Load3. Disk…

3.使用条件语句编写存储过程(3/10)

引言 在现代数据库管理系统中,存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句,这些语句被保存在数据库中,可以被重复调用。存储过程不仅可以提高数据库操作的效率,还可以增强数据的安全性和一致性。此…

RPA技术的定义与原理

RPA(Robotic Process Automation)即机器人流程自动化,是一种利用软件机器人或机器人工具来自动执行重复性、规则性和可预测性的业务流程的技术。以下是对RPA技术的详细介绍: 一、RPA技术的定义与原理 RPA技术通过模拟人工操作&a…

【redis-06】redis的stream流实现消息中间件

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

关于Linux查看系统及版本信息的命令lsb_release命令以及Centos7中将redis服务写入systemctl服务

一、关于Linux查看系统及版本信息的命令lsb_release命令 linux查看系统是centos还是ubuntu,之前一直使用uname -a以及cat /etc/issue。但在某个服务器上发些这些都不行。有一个更好用的命令:lsb_release -a。如执行时提示-bash: lsb_release: 未找到命令…

Vscode+Pycharm+Vue.js+WEUI+django火锅(三)理解Vue

新创建的Vue项目里面很多文件,对于新手,老老实实做一下了解。 1.框架逻辑 框架的逻辑都是相通的,花点时间理一下就清晰了。 2.文件目录及文件 创建好的vue项目下,主要的文件和文件夹要先认识一下,并与框架逻辑对应起…

计算机毕业设计 校内跑腿业务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

dayu_widgets-简介

前言: 越来越多的人开始使用python来做GUI程序,市面上却很少有好的UI控件。即使有也是走的商业收费协议,不敢使用,一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…

YOLO11改进|SPPF篇|引入YOLOv9提出的SPPELAN模块

目录 一、【SPPELAN】模块1.1【SPPELAN】模块介绍1.2【SPPELAN】核心代码 二、添加【SPPELAN】模块2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPELAN】模块 1.1【SPPELAN】模块介绍 下图是【SPPELAN】的结构图,让我们…

OOOPS:零样本实现360度开放全景分割,已开源 | ECCV‘24

全景图像捕捉360的视场(FoV),包含了对场景理解至关重要的全向空间信息。然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制。为了解决这个问题,论文定义了一…