相机参数与图像处理技术解析

01. 相机内参和外参的含义?如果将图像放大两倍,内外参如何变化?

  • 相机有两个最基础的数据:内参(Instrinsics)和外参(Extrinsics),内参主要描述的是相机的CCD/CMOS感光片尺寸/分辨率以及光学镜头的系数,外参主要描述的是相机在世界坐标系下的摆放位置和朝向角度。

  • 参考:https://zhuanlan.zhihu.com/p/646310465

  • 相机的内参和外参是用于描述相机如何捕捉三维世界并将其投影到二维图像平面上的参数。

    1. 内参(Intrinsic Parameters):

      • 内参是相机自身的属性,与场景无关。它包括焦距(focal length)、主点(principal point,图像中心的坐标)、畸变系数(distortion coefficients,描述镜头畸变如径向和切向畸变)等。

      • 焦距和图像传感器的尺寸共同决定了视场角(Field of View, FOV)。

      • 主点通常接近图像中心。

      • 内参矩阵一般形式为:
        [
        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
        ]
        其中 KaTeX parse error: Can't use function '\(' in math mode at position 1: \̲(̲f_x, f_y) 是焦距在图像平面上的x轴和y轴的比例,( c x , c y c_x, c_y cx,cy) 是主点的坐标。

    2. 外参(Extrinsic Parameters):

      • 外参描述的是相机相对于世界坐标系的位置和方向。它由旋转矩阵(Rotation matrix)和平移向量(Translation vector)组成,这些参数定义了从世界坐标系到相机坐标系的转换。

      • 外参矩阵通常表示为:
        KaTeX parse error: Undefined control sequence: \[ at position 2: \̲[̲ \begin{bmatrix…
        其中 ( R R R) 是一个3x3的旋转矩阵,( t t t) 是一个3x1的平移向量。

    如果将图像放大两倍,内外参的变化如下:

    • 内参变化:

      • 焦距 ( f x , f y f_x, f_y fx,fy) 通常不会改变,因为它是基于相机的物理属性。但是,图像坐标系的比例变化了,因此主点 KaTeX parse error: Can't use function '\(' in math mode at position 1: \̲(̲c_x, c_y) 需要调整以反映新的图像中心。如果原图中 KaTeX parse error: Can't use function '\(' in math mode at position 1: \̲(̲c_x, c_y) 是原点,放大后它们将变为原来的两倍。

      • 新的内参矩阵将是:
        [
        K ′ = [ f x 0 2 c x 0 f y 2 c y 0 0 1 ] K' = \begin{bmatrix} f_x & 0 & 2c_x \\ 0 & f_y & 2c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy02cx2cy1
        ]

    • 外参变化:

      • 外参(旋转矩阵和平移向量)不会因为图像尺寸的改变而改变,因为它们描述的是相机与世界坐标系之间的物理关系,与图像的尺寸无关。

    LSS(Lift, Splat, Shoot)

    https://github.com/nv-tlabs/lift-splat-shoot

    是一个用于三维环境感知和环境表示的视觉感知系统,主要应用于自动驾驶领域。这个方法是一种用于从二维图像直接构建三维环境表示的深度学习算法。它主要通过以下三个步骤来实现:

    1. Lift(提升):

      • 这一步涉及到将二维像素“提升”到三维空间中。算法使用从图像中提取的深度信息将每个像素点映射到一个三维点上。这种映射通常依赖于相机的内参和外参,通过这些参数,可以将二维图像坐标转换为三维世界坐标。
    2. Splat(喷洒):

      • 在“喷洒”步骤中,所提升的三维点被映射到一个离散的三维空间(通常是体素网格)中。这一步是一种数据结构转换,它把连续的三维点云转换为离散的体素表示,这种表示更适合用于随后的处理步骤如卷积神经网络。
    3. Shoot(射击):

      • 最后一步是“射击”,这里利用三维卷积神经网络处理提升和喷洒后的数据,从而提取用于任务的特征。例如,自动驾驶车辆可能需要识别和分类不同的道路用户(如行人、车辆)、道路标记和其他关键的环境特征。

    LSS方法的一个主要优势是它能够直接从图像数据中构建出三维场景的表示,这有助于自动驾驶系统更好地理解和导航其周围的环境。此外,它通过利用卷积神经网络,可以在保持高度准确性的同时实现高效的处理速度。这种方法在自动驾驶技术中具有重要的应用前景,尤其是在需要精确和实时的三维环境感知和决策支持的情况下。

02. 坐标系的变换

  • BEV训练数据集的世界坐标系, 比如nuScenes地图,它的世界坐标系是图片坐标系,原点在图片左下角,单位是米。数据集中会根据时间序列给出车辆的瞬时位置,也就是在这个图片上的XY。

  • BEV里,这个Ego是特指车辆本身,它是用来描述摄像机/激光雷达(Lidar,light detection and ranging)/毫米波雷达(一般代码里就简称为Radar)/IMU在车身上的安装位置(单位默认都是米)和朝向角度,坐标原点一般是车身中间,外参(Extrinsics Matrix)主要就是描述这个坐标系的。

  • 相机坐标系,坐标原点在CCD/CMOS感光片的中央,单位是像素,内参(Intrinsics Matrix)主要就是描述这个坐标系的。

  • 照片坐标系,坐标原点在图片的左上角,单位是像素,横纵坐标轴一般不写成XY,而是uv。

  • 照片中的像素位置转换到世界坐标系时,要经历:Image_to_Camera, Camera_to_Ego, Ego_to_World;Camera_to_Image通常就是Intrinsics参数矩阵,Ego_to_Camera就是Extrinsics参数矩阵。

03. 放射变换与逆投影变换分别是什么

  • 仿射变换: 仿射变换是一种线性变换,保持了直线的平行性和比例关系。它可以用于将一个二维平面上的点映射到另一个二维平面上。仿射变换可以通过一个矩阵乘法和一个平移向量来表示。它包括平移、旋转、缩放和剪切等操作。在计算机视觉领域,仿射变换常用于图像的平移、旋转、缩放和仿射校正等操作。

  • 逆投影变换: 逆投影变换是指通过相机内参和外参,将图像上的点投影到三维空间中的过程。它是相机成像过程的逆过程。逆投影变换可以用于将图像上的点转换为三维空间中的点坐标。逆投影变换的计算需要相机的内参矩阵、外参矩阵和图像上的点坐标。在计算机视觉和计算机图形学中,逆投影变换常用于三维重建、相机姿态估计和虚拟现实等应用。

import numpy as np
import cv2

# 定义相机内参矩阵 K
K = np.array([[1000, 0, 500], [0, 1000, 300], [0, 0, 1]], dtype=np.float32)

# 定义相机外参的旋转矩阵 R(在此为单位矩阵)
R = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.float32)

# 定义相机外参的平移向量 T
T = np.array([1, 2, 3], dtype=np.float32)

# 定义图像上的点坐标 uv(二维点)
uv = np.array([[200, 300], [400, 500]], dtype=np.float32)

# 计算 Rc2w * K 的逆矩阵
Rc2w_invK = np.linalg.inv(np.dot(R, K))

# 将 uv 点扩展成齐次坐标,并进行逆投影变换
H = np.dot(Rc2w_invK, np.append(uv, np.ones((uv.shape[0], 1)), axis=1).T)

# 计算世界坐标 Pxyz(假设深度为 T[2])
Pxyz = H * (T[2] / H[2]) - T[:2]

# 定义仿射变换矩阵 M
M = np.array([[1, 0, 100], [0, 1, 50]], dtype=np.float32)

# 加载图像(假设 image 是事先加载的图像)
# image = cv2.imread('path_to_your_image.jpg')  # 替换为实际图像路径

# 进行仿射变换
# output = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))  # 假设 image 是加载的图像

# 将每一步结果打印出来以进行验证(可选)
print("相机内参矩阵 K:\n", K)
print("旋转矩阵 R:\n", R)
print("平移向量 T:\n", T)
print("图像点坐标 uv:\n", uv)
print("逆 Rc2w * K:\n", Rc2w_invK)
print("齐次坐标 H:\n", H)
print("世界坐标 Pxyz:\n", Pxyz)
print("仿射变换矩阵 M:\n", M)

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

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

相关文章

WordPress主题大前端DUX v8.7源码下载

全新:用户注册流程,验证邮箱,设置密码 新增:列表显示小视频和横幅视频 新增:文章内容中的外链全部增加 nofollow 新增:客服功能中的链接添加 nofollow 优化:产品分类的价格显示

《C++20设计模式》桥接模式经验分享

文章目录 一、前言二、探讨一个类有多个抽象父类的情况(为什么会有桥接)三、桥接模式3.1 UML类图3.2 实现 四、最后 一、前言 怎么判断你是否理解桥接模式了呢?🧐 试着回答下面这个问题吧!😋 桥接模式到底…

Mybatis Plus 自动填充注解 @TableField(fill = FieldFill.INSERT_UPDATE)

第一步:在需要自动填充的位置加上注解 通过在创建时间和修改时间上添加 fill 填充字段 进行自动填充 第二步:要想实现自动填充还需要实现MetaObjectHandler接口,在这里实现自动填充的逻辑 Component public class MyMetaObjectHandler …

pydub、ffmpeg 音频文件声道选择转换、采样率更改

快速查看音频通道数和每个通道能力判断具体哪个通道说话;一般能量大的那个算是说话 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

通过卷防水上限,解锁手机的新玩法?IP68之间亦有不同

当手机的日常防水已经成了基本功,防水能力的上限便成了新的赛道。 毕竟再谨慎的人,也可能会有手滑的时候。这个时候,一台有着IP68级防水的手机,就能给你提供一份安心。 【IP68是标准上限,不是手机防水上限】 IP68是…

前端三件套开发模版——产品介绍页面

今天有空,使用前端三件套html、css、js制作了一个非常简单的产品制作页面,与大家分享,希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍,同时可以安排一张产品的高清大图,我也加入了页面的背…

【数据结构】建堆的时间复杂度

一.向下调整建堆 1.二叉树层数与总节点个数关系 层数一定时,在二叉树节点个数最大的情况下,二叉树为满二叉树,如下图所示,可以清晰地看到在满二叉树中第h层有2^(h-1)个节点,总节点N就等于一个等比数列的求和&#xf…

Ollama + Docker + AnythingLLM 搭建本地多用户AI知识库

整个过程需要准备三个工具: Ollama: 用于运行本地大模型的管理:llama3, qwen2等 Docker:用于运行AnythingLLM。 AnythingLLM:知识库运行平台,提供知识库构建及运行的功能。 Ollama, Docker 这二个安装不…

帕金森病患者的运动秘诀:你值得更健康!

大家好,今天我想和大家聊聊一个我们可能不太熟悉,但却值得每一个人去关注的话题——帕金森病患者的运动。帕金森病,这个听起来有些陌生的名词,其实离我们并不遥远。随着年纪的增长,我们身边可能就有亲友正在遭受这个疾…

MIPI竖屏解决方案,普立晶POL8901升级POL8903 两PORT LVDS转MIPIDSI,加90度旋转

POL8903描述: 系统: •采用高性能MIPS 32位CPU内核; •高性能DSP内核图像处理单元; •16 KB指令Cache;16 KB数据Cache; •96 KB SRAM;内置DDR 3控制器; LVDS输入: …

【JD-GUI】MacOS 中使用Java反编译工具JD-GUI

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明概念理解一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载与安装2.1 选择对应版本2.2 解压运行排除异常:2.3 关于…

ubuntu篇---添加环境变量并且在pycharm中使用

ubuntu篇—添加环境变量并且在pycharm中使用 一. 添加环境变量 vim ~/.bashrc 在文件末尾加上 保存退出 source ~/.bashrc二. 在pycharm中添加环境变量 1.打开pycharm,并打开你的项目 2.点击菜单栏中的“Run”, 选择“Edit Configurations” 3.在弹…

深入剖析 Android 网络开源库 Retrofit 的源码详解

文章目录 概述一、Retrofit 简介Android主流网络请求库 二、Retrofit 源码剖析1. Retrofit 网络请求过程2. Retrofit 实例构建2.1 Retrofit.java2.2 Retrofit.Builder()2.2.1 Platform.get()2.2.2 Android 平台 2.3 Retrofit.Builder().baseUrl()2.4 Retrofit.Builder.client()…

YOLOv8改进 添加CVPR2024 PKINet中注意力机制CAAttention

一、PKINet论文 论文地址:2403.06258 (arxiv.org) 二、CAAttention结构 CAA(Context Anchor Attention)注意力模块是一种用于捕捉长距离上下文信息的并行模块。 在计算机视觉领域中,上下文信息是指与目标物体或任务相关的周围环境和语境信息。上下文信息可以帮助我们更好…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端,但是有时候前端的样式太丑了,也有点看不下去。弹出框是项目中用的比较多的,比如删除,修改或者添加什么的,都需要一个弹出框。 所以这里简单记录一下,应该如何实现。实现效果如…

rtpengine 项目

目录 !1. 如果容器内部修改 rtpengine 并且让他生效 守护进程模块(daemon) 内核模块(kernel-module) 录音守护进程模块(recording-daemon) iptables扩展模块(iptables-extension) 2. 在Docker容器中编译好四个模块后,您需要采取以下步骤 1. 加载内…

安装维修制氮设备的注意指南

制氮设备在许多工业领域都发挥着重要作用,无论是确保生产过程中的氮气供应,还是维持设备的稳定运行,正确的安装和维修都是关键。以下是一些重要的注意事项,帮助您顺利完成制氮设备的安装与维修工作。 一、安装注意事项 (一)选址与…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 (一)前言(二)AI边缘流媒体设备展示(三)赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 (四)一些注意事项1、开发板…

爬虫-网页基础

HTML 基本语法 HTML&#xff1a;Hyper Text Markup Language, 超文本标记语言&#xff0c;是计算机语言的一种&#xff0c;由元素构成。 p元素 <p>Web 真好玩&#xff01;</p> 由三大部分组成 开始标签&#xff1a;一对尖括号中间包裹这元素名称元素内容&#x…

bmpn2中常用网关的介绍和使用

Parallel gateway 在Flowable&#xff08;前身为Activiti&#xff09;中&#xff0c;Parallel Gateway是一种特殊的流程控制结构&#xff0c;用于在流程实例中并行执行多个任务或活动。它分为两种类型&#xff1a;并行拆分网关&#xff08;Parallel Split Gateway&#xff09;…
最新文章