视觉图像坐标转换

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 np

def 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 space
    imgpoints = []  # 2d points in image plane.

    for fname in images:
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # Find the chess board corners
        ret, 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 calibration
    ret, 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 images
    images = ["image1.jpg", "image2.jpg", "image3.jpg"]  # Replace with actual image paths
    criteria = (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(增强现实)等应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【LeetCode: SQL专题 : SQL132 每个题目和每份试卷被作答的人数和次数 + 合并查询】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

动态内容加载的解决方案:Selenium与Playwright对比故障排查实录

方案进程 2024-09-01 09:00 | 接到亚航航班数据采集需求 2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证 2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制 2024-09-01 16:30 | 引入爬虫代理IPUA轮换策略 2024-09-02 10:00 | 双方案完整实现并通过压力测试故…

不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比

本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性,并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度,详细分析了不同规模企业在选择 AI 工具时的考量因素…

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---(某电商网站爬取)4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代,数据作为核心资源蕴含重要价值,网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…

【数据挖掘】Matplotlib

Matplotlib 是 Python 最常用的 数据可视化 库之一,在数据挖掘过程中,主要用于 数据探索 (EDA)、趋势分析、模式识别 和 结果展示。 📌 1. Matplotlib 基础 1.1 安装 & 导入 # 如果未安装 Matplotlib,请先安装 # pip instal…

使用Java构建高效的Web服务架构

使用Java构建高效的Web服务架构 随着互联网技术的飞速发展,Web服务在现代应用中扮演着至关重要的角色。尤其是在企业级应用中,如何构建一个高效、可扩展且易维护的Web服务架构,成为了开发者和架构师面临的一项重要挑战。Java作为一种成熟、稳…

数据库MySQL,在终端输入后,提示不是内部命令等

【解决问题】mysql提示不是内部或外部命令,也不是可运行的程序 一般这种问题是因为没有在系统变量里面添加MySQL的可执行路径 以下是添加可执行路径的方法: 第一步:winR输入services.msc 然后找到MySQL,右击属性并复制MySQL的可执…

LabVIEW正弦信号处理:FFT与最小二乘拟合的参数提取

问题一:LabVIEW能否对采集的正弦力信号进行快速傅里叶变换(FFT),并得到幅值和相位结果? 答案: 可以。LabVIEW通过内置信号处理工具包提供完整的FFT分析功能,具体实现如下: FFT分析流…

Hive-05之查询 分组、排序、case when、 什么情况下Hive可以避免进行MapReduce

一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1. 基本查询 注意 SQL 语言大小写不敏感SQL 可以写在一行或者多行关键字不能被缩写也不能分行各子句一般要分行…

React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序

功能要求: 1、渲染评论列表 2、删除评论功能:只显示自己评论的删除按钮;点击删除按钮,删除当前评论,列表中不再显示。 3、渲染导航Tab(最新 | 最热)和其 高亮实现 4、评论排序功能实现&…

ST表解决RMQ问题

引入 给定你一个长度为n的数组a,再给你q次询问,每次询问给定你一个区间[L,R],让你求a数组中L~R中的最大值/最小值 我们利用常规算法求时很显然会超时,以此我们需要一个数据结构——ST表来解决 ST表 ST表是一个类似于线段树的东…

[数据结构] - - - 链表

一、定义 链表:是一种常见的线性数据结构,它通过一组节点(Node)来存储数据,每个节点包含两部分:数据域和指针域。 1.1 链表的基本概念 节点(Node):链表的最小单元&#…

Linux的动态库与静态库

目录 动静态库的基本原理 认识动静态库 动静态库各自的特征 静态库 动态库 动静态库与内存 静态库的加载方式 动态库的加载方式 加载到物理内存的细节 静态库的打包与使用 打包 使用 动态库的打包与使用 打包 使用 我以前写的一篇文章中就用网吧与在宿舍自己组装电…

图漾PercipioIPTool软件使用

文章目录 前期准备1.PercipioIPTool软件1.1 更改网络适配器1.2 更改自动获取IP1.3设置静态IP 前期准备 1.一根超五类及其以上规格网线(cat5e、cat6…) 2.相机,配套网线和IO线 3.配套软件PercipioViewer或者PercipioIPTool软件(Windows环境使…

EasyRTC嵌入式WebRTC技术与AI大模型结合:从ICE框架优化到AI推理

实时通信技术在现代社会中扮演着越来越重要的角色,从视频会议到在线教育,再到远程医疗,其应用场景不断拓展。WebRTC作为一项开源项目,为浏览器和移动应用提供了便捷的实时通信能力。而EasyRTC作为基于WebRTC的嵌入式解决方案&…

《白帽子讲 Web 安全:点击劫持》

目录 摘要: 一、点击劫持概述 二、点击劫持的实现示例:诱导用户收藏指定淘宝商品 案例 构建恶意页面: 设置绝对定位和z - index: 控制透明度: 三、其他相关攻击技术 3.1图片覆盖攻击与 XSIO 3.2拖拽劫持与数据…

计算机网络---SYN Blood(洪泛攻击)

文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议,平时我们使用的浏览器,APP等大多使用 TCP 协议通讯的,可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…

GitCode 助力 python-office:开启 Python 自动化办公新生态

项目仓库:https://gitcode.com/CoderWanFeng1/python-office 源于需求洞察,打造 Python 办公神器 项目作者程序员晚枫在运营拥有 14w 粉丝的 B 站账号 “Python 自动化办公社区” 时,敏锐察觉到非程序员群体对 Python 学习的强烈需求。在数字…

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae?

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae? 一、为什么选择Trae智能协作IDE? 在AI编程新时代,Trae通过以下突破性功能重新定义开发体验: 双向智能增强:AI不仅提供代码补全&a…