相机模型与成像过程:深入解析相机内参、外参及标定方法

news2024/11/30 12:51:15

Camera

相机模型与成像过程:深入解析相机内参、外参及标定方法

引言

相机作为图像采集的重要设备,在图像处理、计算机视觉及机器视觉等领域扮演着核心角色。了解相机的成像原理、模型参数及标定方法,对于提升图像质量和后续处理效果至关重要。本文将详细解析相机模型与成像过程。

相机模型与成像过程

针孔相机模型

针孔相机模型是计算机视觉和摄影中广泛使用的一个基础模型,它模拟了光线通过一个理想化的针孔(即相机的光心)投射到成像平面上的过程。这个模型简化了相机的成像机制,将三维世界中的点映射到二维图像平面上。

在针孔相机模型中,我们定义三个主要的坐标系:

  • 世界坐标系:用于描述物体在三维空间中的位置。
  • 相机坐标系:以相机的光心为原点,光轴为Z轴建立的坐标系,用于描述物体相对于相机的位置。
  • 图像坐标系(或称为像平面坐标系):位于相机的成像平面上,用于记录物体投影后的二维坐标。

针孔相机模型的核心公式是:

x = f ⋅ X Z 和 y = f ⋅ Y Z x = f \cdot \frac{X}{Z} \quad \text{和} \quad y = f \cdot \frac{Y}{Z} x=fZXy=fZY

注意,这里我去掉了负号,因为在实际应用中,我们通常将成像平面设置在相机坐标系的Z轴正方向(即相机前方)的某个位置,并通过调整焦距f和坐标系的定义来确保公式的一致性。其中,f是相机的焦距,X、Y、Z是相机坐标系中物体的坐标,x、y是物体在成像平面上的投影坐标。

透视相机模型与畸变校正

尽管针孔相机模型提供了一个简洁的成像框架,但实际相机镜头由于制造和设计的限制,往往会产生各种畸变,尤其是径向畸变和切向畸变。这些畸变会导致图像中的形状失真,影响后续的图像处理和计算机视觉任务。

为了校正这些畸变,透视相机模型引入了畸变参数,并通过以下公式对图像坐标进行校正:

x c o r r e c t e d = x ⋅ ( 1 + k 1 ⋅ r 2 + k 2 ⋅ r 4 + k 3 ⋅ r 6 ) + 2 ⋅ p 1 ⋅ x ⋅ y + p 2 ⋅ ( r 2 + 2 ⋅ x 2 ) x_{corrected} = x \cdot (1 + k_1 \cdot r^2 + k_2 \cdot r^4 + k_3 \cdot r^6) + 2 \cdot p_1 \cdot x \cdot y + p_2 \cdot (r^2 + 2 \cdot x^2) xcorrected=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)

y c o r r e c t e d = y ⋅ ( 1 + k 1 ⋅ r 2 + k 2 ⋅ r 4 + k 3 ⋅ r 6 ) + p 1 ⋅ ( r 2 + 2 ⋅ y 2 ) + 2 ⋅ p 2 ⋅ ( x 2 − y 2 ) y_{corrected} = y \cdot (1 + k_1 \cdot r^2 + k_2 \cdot r^4 + k_3 \cdot r^6) + p_1 \cdot (r^2 + 2 \cdot y^2) + 2 \cdot p_2 \cdot (x^2 - y^2) ycorrected=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2(x2y2)

其中, x x x y y y 是畸变图像中的原始坐标, x c o r r e c t e d x_{corrected} xcorrected y c o r r e c t e d y_{corrected} ycorrected 是校正后的坐标。 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2 是畸变图像中点到图像中心(通常是光心在成像平面上的投影)的距离的平方。 k 1 k_1 k1 k 2 k_2 k2 k 3 k_3 k3 是径向畸变系数,用于校正由于镜头形状引起的径向方向的变形; p 1 p_1 p1 p 2 p_2 p2 是切向畸变系数,用于校正由于镜头与成像平面不平行引起的切向方向的变形。

通过相机标定过程,我们可以估计出这些畸变系数,并应用上述公式对图像进行畸变校正,以获得更准确的成像结果。

成像过程

相机的成像过程可以概括为四个坐标系的转换:世界坐标系(UVW)-> 相机坐标系(XYZ)-> 图像坐标系(x, y)-> 像素坐标系(u, v)。

  1. 世界坐标到相机坐标:通过旋转和平移变换(即相机的外部参数),将世界坐标系中的点转换为相机坐标系中的点。

    [ X Y Z 1 ] = [ R t 0 1 ] [ U V W 1 ] \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} U \\ V \\ W \\ 1 \end{bmatrix} XYZ1 =[R0t1] UVW1

    其中, R \mathbf{R} R是3x3的旋转矩阵, t \mathbf{t} t是3x1的平移向量。

  2. 相机坐标到图像坐标:通过透视投影,将相机坐标系中的点投影到图像坐标系上。这一步仅与焦距f有关。

    x = f ⋅ X Z , y = f ⋅ Y Z x = f \cdot \frac{X}{Z}, \quad y = f \cdot \frac{Y}{Z} x=fZX,y=fZY

  3. 图像坐标到像素坐标:通过仿射变换,将图像坐标系中的点转换为像素坐标系中的点。这一步涉及光心位置、像素分辨率和偏斜角等相机内部参数。

    u = α x + u 0 , v = β y + v 0 u = \alpha x + u_0, \quad v = \beta y + v_0 u=αx+u0,v=βy+v0

    其中, α \alpha α β \beta β是x和y方向上的缩放因子, u 0 u_0 u0 v 0 v_0 v0是图像中心像素坐标。

相机内参和外参

内参

相机内参是描述相机内部特性的参数,它们对相机如何将三维世界中的点映射到二维图像平面上起着关键作用。除了基本的焦距、光心位置和像素分辨率外,内参还包括畸变参数,这些参数用于校正由于相机镜头制造和组装过程中的不完美导致的图像畸变。

内参矩阵K通常表示为:

K = [ f x 0 u 0 0 f y v 0 0 0 1 ] K = \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0u0v01

其中, f x f_x fx f y f_y fy 是焦距在图像平面上的等效值,通常与像素的纵横比和物理焦距有关( f x = α ⋅ f f_x = \alpha \cdot f fx=αf f y = β ⋅ f f_y = \beta \cdot f fy=βf),而 u 0 u_0 u0 v 0 v_0 v0 是图像平面的光心坐标(通常是图像的中心,但可能由于制造误差而略有偏移)。

畸变参数通常包括径向畸变和切向畸变系数。径向畸变使图像看起来像是通过一个球形透镜观看,导致图像向中心“收缩”或向外“膨胀”。切向畸变则是由于相机镜头与图像平面不完全平行引起的。畸变参数通常表示为 k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3(径向畸变)和 p 1 , p 2 p_1, p_2 p1,p2(切向畸变)。

外参

相机外参描述了相机在世界坐标系中的位置和朝向。外参由旋转矩阵 R \mathbf{R} R 和平移向量 t \mathbf{t} t 组成,它们将世界坐标系中的点转换为相机坐标系中的点。

( X c Y c Z c ) = R ( X w Y w Z w ) + t \begin{pmatrix} X_c \\ Y_c \\ Z_c \end{pmatrix} = \mathbf{R} \begin{pmatrix} X_w \\ Y_w \\ Z_w \end{pmatrix} + \mathbf{t} XcYcZc =R XwYwZw +t

这个公式描述了如何将世界坐标系中的三维点 ( X w , Y w , Z w ) (X_w, Y_w, Z_w) (Xw,Yw,Zw) 转换为相机坐标系中的三维点 ( X c , Y c , Z c ) (X_c, Y_c, Z_c) (Xc,Yc,Zc)。其中:

  • R \mathbf{R} R 是3x3的旋转矩阵,表示相机的旋转姿态,它由三个旋转角(如俯仰角、偏航角和滚转角)决定。
  • t \mathbf{t} t 是3x1的平移向量,表示相机在世界坐标系中的位置。

结合内参和外参,可以计算出世界坐标系中的点到图像坐标系(即像素坐标系)的映射关系,这是计算机视觉和机器人学中许多任务(如三维重建、增强现实、运动跟踪等)的基础。

相机标定

相机标定是通过已知的世界坐标和对应的像素坐标,计算相机的内参和外参的过程。标定过程通常涉及以下步骤:

  1. 采集标定图像:使用相机从不同角度拍摄标定板(如棋盘格),确保每张图像中标定板完整且清晰可见。

  2. 检测角点:利用图像处理算法(如OpenCV的cv2.findChessboardCorners)检测每张图像中标定板的角点,并获取这些角点在图像坐标系中的坐标。

  3. 计算内参、畸变参数及外参:利用检测到的角点坐标和已知的标定板角点在世界坐标系中的坐标,通过cv2.calibrateCamera等函数计算相机的内参、畸变参数及外参。

  4. 优化和验证:通过优化算法(如最小二乘法)对计算得到的内参和外参进行进一步优化,以提高标定精度。同时,使用未参与标定的图像对标定结果进行验证,确保标定参数的准确性和可靠性。

  5. 应用标定结果:标定完成后,可以将得到的内参、外参及畸变参数应用于后续的图像处理、三维重建等任务中,以提高处理效果和精度。

畸变校正的示例代码

在相机标定完成后,可以使用计算出的畸变参数对图像进行畸变校正。以下是一个使用OpenCV进行畸变校正的示例代码:

import cv2
import numpy as np

# 假设已经计算得到了相机的内参矩阵 mtx 和畸变系数 dist
# 读取一张需要校正的图像
img = cv2.imread('calibration_images/distorted_image.jpg')
h, w = img.shape[:2]

# 获取校正映射
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))

# 校正图像
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# 裁剪图像
x, y, w, h = roi
dst = dst[y:y+h, x:x+w]

# 显示校正后的图像
cv2.imshow('Undistorted Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

标定误差评估

在标定完成后,通过计算重投影误差来评估标定结果的准确性。重投影误差是指将三维世界坐标点通过标定得到的内参和外参投影到图像平面上的点与实际检测到的图像坐标点之间的距离。较小的重投影误差表明标定精度较高。

mean_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)
    mean_error += error
total_error = mean_error/len(objpoints)
print(f"Total re-projection error: {total_error}")

在实际应用中,重投影误差一般要求在亚像素级别(如小于0.5像素),以保证标定结果的可靠性。

相机标定的实际应用场景

相机标定在许多计算机视觉和图像处理任务中具有广泛应用。以下是几个典型的应用场景:

  1. 三维重建:通过标定相机获取精确的内参和外参,可以将二维图像中的点映射到三维空间,从而进行三维模型的重建。

  2. 增强现实(AR):在增强现实应用中,相机标定用于将虚拟物体准确地叠加在真实世界中,实现虚实融合的效果。

  3. 无人驾驶:在无人驾驶技术中,摄像头标定是实现环境感知和障碍物检测的重要步骤,标定的精度直接影响自动驾驶的安全性和可靠性。

结论

本文详细介绍了相机模型、成像过程、内参与外参的概念,以及相机标定的具体步骤和误差评估方法。通过深入理解这些基础知识,可以为计算机视觉和图像处理领域的实际应用奠定坚实的基础。在未来的应用中,这些知识将帮助我们更好地处理复杂的视觉任务,提高系统的整体性能和稳定性。

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

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

相关文章

嵌入式学习Day36---Linux软件编程---网络编程

目录 一、TCP并发模型 1.1.阻塞IO 1.2.非阻塞IO 1.步骤 2.函数接口 3.实例 1.3.异步IO 1.步骤 2.函数接口 3.实例 1.4.多路复用IO 1.select 函数接口: 实例 2.poll 3.epoll 二、总结 一、TCP并发模型 1.1.阻塞IO CPU占用率低,等待资源时将任务挂…

初识指针5の学习笔记

目录 1>>前言 2>>qsort函数的实现 2.1>>什么时qsort函数? 2.2>>qsort函数的格式是什么? 2.3>>qsort函数的解析 2.4>>qsort函数的实现! 3>>结语 1>>前言 今天我会继续分享一些我做的笔…

大模型基础学习知识,看这一篇就够了

​ 学习路线:感性认识现象->理解本质和原理->将所学知识用于解释新现象并指导实践。 ​ LLM训练模型的的三个阶段: 1、Pre-train 2、Supervised Fine-Tuning:Instruction Fine-tuning 3、RLHF - > RLAIF:增强式学习…

Internet Download Manager(下载工具)中文授权版

IDM是一款windows平台下的下载工具。 软件截图: 使用说明: 解压后,双击start_IDM.bat来运行软件 下载地址: IDM-v6.42.20-Repack 解压密码:helloh 下载时可能会有广告,忽略,等下载结束即可…

IM 旗舰版、IM 尊享版计费说明(海外 - 北美数据中心)

本文档详细描述了适用于使用海外北美数据中心 App 的 IM 旗舰版、IM 尊享版计费套餐及相应增值服务项目的计费细则。 本文档中采用人民币定价,价格仅适用于以人民币结算的服务订单。如果您使用非人民币结算,请咨询相关商务人员。 The English version o…

React 使用ref属性调用子组件方法(也可以适用于父子传参)

注意:①需使用hooks函数组件 ②使用了antDesign组件库(可不用) 如何使用 父组件代码 import React, { useState, useRef, useEffect } from react; import { Button } from antd; import Child from ./components/child;export defau…

华为面试题就这?24岁的我直接拿下28K的offer...

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 先说一下我的情况,某普通本科计算机,之前在深圳那边做了大约半年多少儿编程老师,之后内部平调回长沙这边,回来之后发…

LLaVA 简介:一种多模式 AI 模型

LLaVA 是一个端到端训练的大型多模态模型,旨在根据视觉输入(图像)和文本指令理解和生成内容。它结合了视觉编码器和语言模型的功能来处理和响应多模态输入。 图 1:LLaVA 工作原理的示例。 LLaVA 的输入和输出:连接视觉…

大型语言模型(LLM)历史简介

在 DALL-E 2 中生成的图像。 介绍 当我们谈论大型语言模型 (LLM) 时,我们实际上指的是一种能够以类似人类的方式进行交流的高级软件。这些模型具有理解复杂上下文并生成连贯且具有人情味的内容的惊人能力。 如果您曾经与 AI 聊天机器人或虚拟助手聊天&#xff0c…

搜维尔科技:【研究】Haption Virtuose外科手术触觉视觉学习系统的开发和评估

Haption面临挑战 除此之外,外科医生有时会对骨组织进行非常复杂的手术,其中一个例子是人工耳蜗的手术植入。重要的是要避免神经或血管等危险结构受伤,并尽可能轻柔地进行手术。在外科医生能够安全、无差错地进行此类手术之前,需要…

WKWebView加载项目中网页的资源图片路径异常

问题原因,将含有html的文件通过如下方式引入到工程中: 这种处理方式,当应用程序变以后,引入的文件会被全部放在Resources目录下,而忽略你原本的文件路径信息。因此导致出问题。 解决方案: 采用如下方式引…

输入一个列表,返回手动反转后的新列表

import math def deverseHanshu(*nums):listAlist(nums)for i in range(0,math.ceil(len(listA)/2)): #math.ceil(3.14) #4clistA[-(i1)]listA[-(i1)]listA[i]listA[i]creturn listA print(deverseHanshu(45,3,89,45,56,2,22,10))#方法2 def getReverse(listAttr):resultList[…

第133天:内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝

案例一:横向移动-系统漏洞-CVE-2017-0146 这个漏洞就是大家熟悉的ms17-010,这里主要学习cs发送到msf,并且msf正向连接后续 原因是cs只能支持漏洞检测,而msf上有很多exp可以利用 注意msf不能使用4.5版本的有bug 这里还是反弹权…

国自然放榜在即!用这种方法或可抢先查询...

【SciencePub学术】本期热点 国自然 昨日国自然网站提示:系统将于8月20日12:00-12:30进行维护,请您避开该时间段使用,由此给您造成的不便,敬请谅解。 根据往年的经验,这预示着基金评审结果即将公布,应该就…

Apache Dolphinscheduler Standalone 部署教程

Standalone 仅适用于 DolphinScheduler 的快速体验. 如果你是新手,想要体验 DolphinScheduler 的功能,推荐使用Standalone方式体检。 如果你想体验更完整的功能,或者更大的任务量,推荐使用伪集群部署。如果你是在生产中使用&…

安卓开发:基础返回按钮代码

我们在大部分页面都会配一个返回按钮。虽然实现起来非常简单&#xff0c;但是很多开发者不想动这个脑筋。这边给出通用的基础代码&#xff0c;可以直接复制粘贴使用。 <androidx.appcompat.widget.Toolbarandroid:id"id/<>"android:layout_height"wra…

Java中“final、finally、finalize”三者的区别

Java中的"final"、"finally"和"finalize"是三个不同的关键字&#xff0c;它们各自有不同的用途和含义&#xff1a; 1. final - 用于声明一个变量、方法或类是不可变的。 - 被声明为final的变量一旦被初始化后&#xff0c;其值不能被改变。 …

5、并发锁机制之synchronized

并发锁机制之synchronized i/i--引起的线程安全问题分析原因分析i的JVM字节码指令i--的JVM 字节码指令结论 解决方案 synchronized的使用加锁方式使用synchronized解决之前的共享问题方式一方式二 synchronized底层实现原理分析查看synchronized的字节码指令序列重量级锁实现之…

国富基金入股的关联性与奇瑞依赖症,大昌科技业务独立性引关注

《港湾商业观察》廖紫雯 日前&#xff0c;安徽大昌科技有限公司&#xff08;以下简称&#xff1a;大昌科技&#xff09;更新招股书并完成三轮问询&#xff0c;公司冲刺深交所创业板得到进一步进展。此前&#xff0c;2023年6月&#xff0c;大昌科技IPO获深交所受理&#xff0c;…

Qt使用开发板上的按键-思维导图-学习笔记-基于正点原子阿尔法开发板

Qt使用开发板上的按键 出厂内核设备树中注册的按键 I.MX6U设备树路径为arch/arm/boot/dts/imx6ull-14x14-evk.dts 如何看这个按键的键值对应键盘中的按键 键值宏定义是在<linux/input.h>头文件中 资源简介 ALPHA 开发板的 KEY0 按键原理图 应用实例 按键注册 正点…