视觉图像坐标转换

1. 透镜成像

相机的镜头系统将三维场景中的光线聚焦到一个平面(即传感器)。这个过程可以用小孔成像模型来近似描述,尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。

小孔成像模型: 假设有一个理想的小孔,光线通过小孔后在对面形成倒立的实像
小孔成像
在小孔成像模型中,物体到小孔的距离 Z Z Z、焦距 f f f(小孔到成像平面的距离)、物体的实际尺寸 Y Y Y X X X 以及物体在成像平面上的投影尺寸 y y y x x x 之间的关系如下:

Z f = Y y = X x \frac{Z}{f} = \frac{Y}{y} = \frac{X}{x} fZ=yY=xX
其中,

  • Z Z Z 是物体到小孔的距离。
  • f f f 是焦距(小孔到成像平面的距离)。
  • Y Y Y X X X 是物体的实际尺寸。
  • y y y x x x 是物体在成像平面上的投影尺寸

这个模型假设有一个理想的小孔,光线通过小孔后在对面形成倒立的实像。虽然现实中没有完全理想的小孔,但这个模型有助于理解基本原理。

2. 相机内参数

内参数描述了相机的内部几何特性,包括焦距、主点位置、像素比例等。这些参数通常通过相机标定过程获得,并用于将三维空间中的点投影到二维图像平面上。
图一

三种坐标系的变换
在这里插入图片描述

2.1 主要内参数
  1. 焦距(Focal Length)

    • 通常用 f x f_x fx f y f_y fy 表示,分别对应X轴和Y轴方向上的焦距。
    • 焦距决定了相机的视角和放大倍数。
  2. 主点(Principal Point)

    • 通常用 c x c_x cx c y c_y cy 表示,表示光轴与成像平面的交点,即图像中心的像素坐标。
  3. 畸变系数(Distortion Coefficients)

    • 包括径向畸变(Radial Distortion)和切向畸变(Tangential Distortion)系数。
    • 这些系数用于校正镜头引起的图像失真。
2.2 内参数矩阵

内参数通常以一个3x3的矩阵 K K K 表示:

K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1

其中:

  • f x f_x fx f y f_y fy 是焦距(以像素为单位)。
  • c x c_x cx c y c_y cy 是主点坐标(通常是图像中心)。
2.3 作用
  1. 投影变换:将三维空间中的点投影到二维图像平面上。
  2. 校正畸变:利用畸变系数校正图像中的失真现象,提高图像质量。

3. 外参数

外参数(Extrinsic Parameters)描述了相机相对于某个固定的世界坐标系的位置和姿态,包括旋转矩阵 R R R 和平移向量 t t t 获取这些参数通常需要通过特定的方法或技术进行标定或估计。以下是几种常见的获取外参数的方法:

3.1 相机标定(Camera Calibration)

相机标定不仅用于获取内参数,还可以同时获得外参数。常用的方法之一是使用已知几何结构的标定板(如棋盘格),通过多个视角拍摄标定板图像,然后利用这些图像来计算相机的内外参数

使用OpenCV进行相机标定

OpenCV 提供了一套完整的工具来进行相机标定,可以同时获取内参数和外参数。以下是一个简化的步骤说明:

  1. 准备标定板:使用一个已知尺寸的棋盘格作为标定板。
  2. 采集图像:从不同角度拍摄多张包含标定板的图像。
  3. 角点检测:在每张图像中找到棋盘格的角点位置。
  4. 标定过程:使用这些角点信息来计算相机的内外参数。
import cv2
import numpy as npdef calibrate_camera(images, pattern_size=(9, 6)):"""Calibrate the camera using a set of images with a known chessboard pattern.Parameters:- images: List of image paths containing the chessboard pattern.- pattern_size: Tuple (rows, cols) representing the number of inner corners per a chessboard row and column.Returns:- Intrinsic matrix K, distortion coefficients, rotation vectors, and translation vectors."""# Prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)objp[:,:2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1,2)# Arrays to store object points and image points from all the images.objpoints = []  # 3d point in real world spaceimgpoints = []  # 2d points in image plane.for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Find the chess board cornersret, corners = cv2.findChessboardCorners(gray, pattern_size, None)# If found, add object points, image points (after refining them)if ret == True:objpoints.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)imgpoints.append(corners2)# Perform camera calibrationret, K, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)return K, dist, rvecs, tvecs# Example usage
if __name__ == "__main__":# Camera calibration using chessboard imagesimages = ["image1.jpg", "image2.jpg", "image3.jpg"]  # Replace with actual image pathscriteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)K, dist, rvecs, tvecs = calibrate_camera(images)print("Intrinsic matrix K:\n", K)print("Distortion coefficients:", dist)print("Rotation vectors:", rvecs)print("Translation vectors:", tvecs)
3.2 主要外参数
3.2.1旋转矩阵(Rotation Matrix)
  • 旋转矩阵:通常用 $ R $ 表示,是一个3x3的正交矩阵,描述了相机相对于世界坐标系的旋转角度。
3.2.2平移向量(Translation Vector)
  • 平移向量:通常用 $ t $ 表示,是一个3x1的向量,描述了相机相对于世界坐标系的平移距离。
3.3 外参数矩阵

外参数通常以一个4x4的齐次变换矩阵 T T T 表示:

T = [ R t 0 T 1 ] T = \begin{bmatrix} R & t \\ 0^T & 1 \end{bmatrix} T=[R0Tt1]

其中:

  • R R R 是旋转矩阵。
  • $t $ 是平移向量。
  • 0 T 0^T 0T 是一个1x3的零向量。
3.3 作用
  1. 坐标变换:将三维世界坐标系中的点转换到相机坐标系中。
  2. 姿态估计:确定相机在世界坐标系中的位置和方向,常用于SLAM(同步定位与地图构建)、AR(增强现实)等应用。

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

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

相关文章

Hadoop之01:HDFS分布式文件系统

HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…

C语言(18)------------>函数(1)

本文介绍C语言函数的定义、标准库和库函数、自定义函数、函数中形式参数和实际参数。通过举例子和画图的方式分解每一个知识点,并结合生活案例和已知知识来解释函数知识。从而使得读者对C语言的函数理解更加深入,学习到C语言开发软件的一些实用技巧。 一…

apload-lab打靶场

1.提示显示所以关闭js 上传<?php phpinfo(); ?>的png形式 抓包&#xff0c;将png改为php 然后放包上传成功 2.提示说检查数据类型 抓包 将数据类型改成 image/jpeg 上传成功 3.提示 可以用phtml&#xff0c;php5&#xff0c;php3 4.先上传.htaccess文件&#xff0…

【Linux】TCP协议

文章目录 &#x1f449;TCP协议&#x1f448;TCP协议段格式确认应答机制窗口大小六个标记位连接管理机制三次握手四次挥手超时重传流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议TCP与UDP的对比用UDP实现可靠传输 &#x1f4…

《HelloGitHub》第 107 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

商城系统单商户开源版源码

环境配置 1.软件安装 宝塔安装系统软件:Nginx、MySQL5.6、PHP( PHP用7.1-7.4版本)、phpMyAdmin(Web端MySQL管理工具)。 2.配置mysql 设置mysql&#xff0c;在已安装的软件里面找到 mysql点击进行设置 3.修改sql-mode 选择左侧配置修改&#xff0c;找到里面的sql-mode&…

DeepSeek 与云原生后端:AI 赋能现代应用架构

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在当今快速发展的互联网时代&#xff0c;云原生&#xff08;Cloud Native&#xff09;架构已成为后端开发的主流趋势。云…

Kafka面试题及原理

1. 消息可靠性&#xff08;不丢失&#xff09; 使用Kafka在消息的收发过程都会出现消息丢失&#xff0c;Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案&#xff1a;【分布式锁、数据库锁&#xff08;悲观锁、乐观锁…

Python学习第十八天之深度学习之Tensorboard

Tensorboard 1.TensorBoard详解2.安装3.使用4.图像数据格式的一些理解 后续会陆续在词博客上更新Tensorboard相关知识 1.TensorBoard详解 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;…

idea生成自定义Maven原型(archetype)项目工程模板

一、什么是Maven原型&#xff08;Maven archetype&#xff09; 引自官网的介绍如下&#xff1a; Maven原型插件官网地址 这里采用DeepSeek助手翻译如下&#xff1a; Maven 原型 什么是原型&#xff1f; 简而言之&#xff0c;原型是一个 Maven 项目模板工具包。原型被定义为一…

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统&#xff0c;用于存储和处理大规模数据集。Hadoop 主要由HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce、Yarn&#xff08;Jobtracker&#xff0c;TaskTracker&#xff09;三大核心组件组成。其中HDFS是分布式文件…

计算机毕设JAVA——某高校宿舍管理系统(基于SpringBoot+Vue前后端分离的项目)

文章目录 概要项目演示图片系统架构技术运行环境系统功能简介 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观&#xff0c;而且功能结构十分单一&#xff0c;存在很多雷同的项目&#xff1a;不同的项目基本上就是套用固定模板&#xff0c;换个颜色、改个文字&…

利用 LangChain 和一个大语言模型(LLM)构建一个链条,自动从用户输入的问题中提取相关的 SQL 表信息,再生成对应的 SQL 查询

示例代码&#xff1a; from langchain_core.runnables import RunnablePassthrough from langchain.chains import create_sql_query_chain from operator import itemgetter from langchain.chains.openai_tools import create_extraction_chain_pydantic# 系统消息&#xff…

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

云服务培训五-数据库服务

如上图所圈&#xff0c;这次主要学习云数据库RDS for MySQL、GaussDB和GeminiDB相关内容。 一、结构化数据、非结构化数据 选择数据库时&#xff0c;首先从模型上分析&#xff0c;是否涉及事务处理、复杂的查询关联&#xff0c;还是数据量大、有并发访问需求。同理&#xff0c;…

【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

类和对象进一步了解c++

初始化列表 虽然构造函数能帮助我们完成初始化&#xff0c;但其实也就是构造函数赋值而已&#xff0c;根本不算真正的初始化。 所以&#xff0c;祖师爷就提出了一个初始化列表&#xff0c;用来初始化成员变量。 注意 每个成员变量在初始化列表中最多出现一次(初始化只能初始…

rust学习笔记9-结构体与206.反转链表

结构体 rust不是面向对象语言&#xff0c;没有类&#xff08;class&#xff09;&#xff0c;主要采用结构体&#xff08;struct&#xff09;来处理结构化数据&#xff0c;这点与go语言相似。 基本使用 struct Person {name: String,age: u32,height: f64, }fn main() {let p…

DDD该怎么去落地实现(4)多对多关系

多对多关系的设计实现 如题&#xff0c;DDD该如何落地呢&#xff1f;前面我通过三期的内容&#xff0c;讲解了DDD落地的关键在于“关系”&#xff0c;也就是通过前面我们对业务的理解先形成领域模型&#xff0c;然后将领域模型的原貌&#xff0c;形成程序代码中的服务、实体、…

论文阅读:CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION?

CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION? 生成式大语言模型能否进行自动语音识别&#xff08;ASR&#xff09;纠错&#xff1f; https://arxiv.org/pdf/2307.04172 文章目录 速览常规总结通俗版 摘要&#xff08;Abstract&#xff09;2. 引言&a…