opencv的相机标定与姿态解算

news2024/12/23 5:49:37

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

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

坐标系之间的转换

世界坐标系——相机坐标系
从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示:
假设世界坐标系中点坐标为[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.coloradmin.cn/o/2204251.html

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

相关文章

Android开发视频预览效果

Android开发视频预览效果 视频播放不是一个简单的事情,得有暂停,继续播放等功能,屏幕的适配也是头疼的事情 一、思路: 引用的是腾讯播放器TXVodPlayer 二、效果图: 图片不是很直观,也可以看下视频 And…

【unity进阶知识12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档

文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…

【STM32单片机_(HAL库)】4-5-2【定时器TIM】【感应开关盖垃圾桶项目】HC-SR04超声波模块实验

1.硬件 STM32单片机最小系统HC-SR04超声波模块 2.软件 hcsr04驱动文件添加main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "hcsr04.h"int main(void) {HAL_Init(); …

OceanBase管理着工具-oat安装

https://www.oceanbase.com/softwarecenter-enterprise https://www.oceanbase.com/docs/enterprise-oat-doc-cn-1000000000762607 (base) [rootlnpg soft]# pwd /db/ob/soft (base) [rootlnpg soft]# ll 总用量 4274536 -rw-r--r-- 1 root root 1730447360 6月 26 14:06 oa…

『网络游戏』客户端发送消息到服务器【17】

将上一章服务器的协议PEProtocol的.dll文件重新生成导入unity客户端中 命名为Net 点击生成 另一种导入.dll文件方式 在客户端粘贴即可 此时Net文件夹的.dll文件就导入进来了 创建脚本:NetSvc.cs 编写脚本:NetSvc.cs 修改脚本:GameRoot.cs 在…

Spring源码:SpringBoot启动流程分析

目录 一、演示代码二、功能介绍三、代码分析1、从主启动类中调用run()方法出发2、看一下SpringApplication的构造方法在干什么?3、看下run()方法的主要流程代码4、run():启动计时器计算springboot启动时间5、run():创建DefaultBootstrapConte…

基于单片机的山林远程环境监测仪设计

本设计基于单片机的智能化的远程山林环境检测仪,该检测仪由硬件系统和软件系统构成。电源管理模块给整个硬件系统提供工作所需电源,系统可完成山林环境有关的温度、湿度、火焰和海拔高度的采集,并且可通过与按键设置阈值作对比判断危险情况&a…

C++ | Leetcode C++题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; class Solution { public:int rand10() {int a, b, idx;while (true) {a rand7();b rand7();idx b (a - 1) * 7;if (idx < 40) {return 1 (idx - 1) % 10;}a idx - 40;b rand7();// get uniform dist from 1 - 63idx b (a - 1)…

Halcon OCR字符识别

create_text_model_reader创建一个文本模型描述要用于分割的文本find_text. 的parameter value文本分段方法的值为自动和手动. 通常&#xff0c;参数模式应设置为自动因为这种模式更稳定&#xff0c;需要更少 配置工作量。请注意&#xff0c;在这种情况下&#xff0c;还有一个…

Redis Windows最新安装教程(2024.10.10)

文章目录 redis介绍下载地址 安装流程基础操作测试Redis常用的服务指令 redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;常用作数据库、缓存和消息中间件。Redis具有快速、灵活、可扩展和高可用性等特…

2024最新会声会影序列号及会声会影2023怎样添加画中画滤镜

深入简单直观的视频编辑&#xff01;使用 Corel VideoStudio会声会影2023&#xff0c;将您最美好的时刻和生活体验变成令人惊叹的电影&#xff0c;这是一款有趣且直观的视频编辑器&#xff0c;包含高级工具和高级效果会声会影2024免费下载。从自定义标题和过渡&#xff0c;到 M…

微服务(二)

目录 一、服务注册和发现 1、注册中心原理 2、nacos注册中心 3、服务注册 3.1 添加依赖 3.2 配置nacos 3.3 服务的发现 二、openfeign 1、快速入门 1.1 引入依赖 1.2 启用openfeign 1.3 编写openfeign客户端 2、连接池 2.1 引入依赖 2.2 开启连接池 3、 最佳实…

用godot4.3 C#开发一个APP登陆界面

一、下载godot godot 是一个游戏开发平台&#xff0c;可以用gd语言&#xff0c;这一个类似python,python程序员转gd很容易&#xff0c;也可以用C#开发。 https://godotengine.org/ 进行下载&#xff0c;下载 下载,net版本。当然mac也可以下载&#xff0c;linux上也有可以&#…

[含文档+PPT+源码等]精品基于Python实现的Django高校职业通的设计与实现

基于Python实现的Django高校招聘系统的设计与实现背景&#xff0c;主要源于以下几个方面的需求和趋势&#xff1a; 1. 就业压力的增加 随着高校毕业生数量的不断增加&#xff0c;就业压力日益加大。传统的招聘方式&#xff0c;如招聘会、报纸广告等&#xff0c;由于其信息传播…

C语言 | Leetcode C语言题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; // The rand7() API is already defined for you. // int rand7(); // return a random integer in the range 1 to 7int rand10() {while(true) {int index (rand7() - 1) * 7 rand7(); if(index < 40) return index % 10 1; } }

ThingsBoard规则链:Copy Keys节点详解

引言 复制键节点简介 用法 含义 应用场景 实际项目运用示例 智能农业监控系统 城市交通管理系统 结论 引言 ThingsBoard是一个功能丰富的物联网平台&#xff0c;它支持设备管理、数据收集与处理以及实时监控。其强大的规则引擎允许用户通过创建复杂的业务逻辑来自动处理…

探索高效的 PDF 拆分工具及其独特功能

当一份大型的PDF文档包含了多个不同主题或章节的内容时&#xff0c;将其拆分成独立的部分可以更方便我们的阅读、编辑和管理。接下来&#xff0c;让我们一起走进PDF拆分工具的世界&#xff0c;了解它们的功能和价值。 1.福昕PDF编辑器 链接一下>>https://editor.foxits…

6-基于TMS320C6678、FPGA XC5VSX95T的6U CPCI 8路光纤信号处理卡

1、板卡概述   本板卡由我公司自主研发&#xff0c;基于CPCI架构&#xff0c;符合CPCI2.0标准&#xff0c;采用两片TI DSP TMS320C6678芯片和Xilinx公司V5系列FPGA XC5VSX95T-1FF1136芯片。包含PCI接口、GMII的以太网接口、Nor Flash接口、8路SFP光 纤&#xff0c;4路RS232。…

Reqable小黄鸟抓包

搜索Reqable到官网进行下载 Windows端配置证书 可以直接自动安装&#xff0c;或者跟着内置的教程手动安装 下载安装安卓端并配置证书 配置证书有内置的教程跟着操作即可 手机协同配置 点击这个位置然后手机扫码就可以抓包了

网络安全知识|网安问答题|OSPF报文协议|抓包工具|路由器环路|序列化与反序列化|磁盘利用率|网络攻防

网络安全知识|网安问答题|OSPF报文协议|抓包工具|路由器环路|序列化与反序列化|磁盘利用率|网络攻防 作为网络工程师&#xff0c;怎么处理防火墙没网的问题&#xff1f; 检查防火墙规则&#xff1a;确保防火墙规则没有错误地阻止了网络访问。需要检查防火墙设置&#xff0c;特…