《计算机视觉中的多视图几何》笔记(7)

news/2024/7/7 20:12:53 标签: 计算机视觉, 笔记, 人工智能

7 Computation of the Camera Matrix P P P

这章讲的是摄像机参数估计。摄像机标定,本质上就是求摄像机矩阵 P P P,当我们知道足够多的 X ↔ x X \leftrightarrow x Xx,我们该如何计算 P P P?如果知道3D和2D点的对应,那么内参和外参可以由基本的线性方程求解问题算出。遇到超定解时的解决办法也跟前面讲的第4章射影变换的情况非常类似。值得注意的是,第4章求的是 3 × 3 3 \times 3 3×3射影变换矩阵,而本章求的是 3 × 4 3 \times 4 3×4相机矩阵。

文章目录

  • 7 Computation of the Camera Matrix P P P
    • 7.1 Basic equations
    • 7.2 Geometric error
      • 7.2.1 Geometric interpretation of algebraic error
      • 7.2.2 Estimation of an affine camera
    • 7.3 Restricted camera estimation
    • 7.4 Radial distortion

7.1 Basic equations

问题描述:我们假设有一些3D空间上的点 X i X_{i} Xi和2D图像上的点 x i x_{i} xi的对应关系已经给出。我们的目标是找到一个 3 × 4 3 \times 4 3×4的摄像机矩阵 P P P,满足对于所有 i i i都满足 x i = P X i x_{i}=PX_{i} xi=PXi

我们可以发现,这个问题和在第4章里面说的求解2D射影变换矩阵 H H H非常像,唯一的区别是需要求解的矩阵维度变了而已。

最基本的方法就是方程 P X = x PX=x PX=x,然后变成 x × P X = 0 x \times PX = 0 x×PX=0 取该矩阵前两行,因为第三行是线性相关的。这样,我们可以写成 A p = 0 Ap=0 Ap=0,这 A A A就是一个 2 n × 12 2n \times 12 2n×12的矩阵。我们要求解摄像机矩阵,其实也就是要求解这个等式里面的 p p p

最小解 因为 P P P 3 × 4 = 12 3 \times 4 = 12 3×4=12个元素,那么就有11个自由度,理论上我们需要5.5对对应点就行,0.5对对应点就是知道x或者y坐标就可以了。

超定的情况 如果我们有多于6对点,那我们就求 m i n ∣ ∣ A p ∣ ∣ = 0 min||Ap||=0 min∣∣Ap∣∣=0,并且让他满足约束 ∣ ∣ p ∣ ∣ = 1 ||p||=1 ∣∣p∣∣=1 ∣ ∣ p ^ 3 ∣ ∣ ||\hat{p}^3|| ∣∣p^3∣∣=1, p ^ 3 \hat{p}^3 p^3就是p最后一行的前三个元素。

退化的情况 有两种情况可以使我们不能唯一确定 p p p

  1. 相机和点都在一个扭曲的立方体上
  2. 相机和点都在平面上,且该平面一直线通过相机的中心

对于这样的配置,不能从点的图像中唯一地获得相机。 相反,它可以分别沿着扭曲的立方体或直线任意移动。 如果数据接近退化的情况,则获得的 P P P估计值很差。 例如,如果相机距离场景较远,例如鸟瞰图,则这种情况接近平面退化。

点的归一化 我们需要把所有点到直线的平均距离归一化到 3 \sqrt{3} 3

从线对应来计算 P P P 如果我们能找到一对对应线,那么我们就有方程 l T P X j = 0 l^TPX_j=0 lTPXj=0其中 j = 0 , 1 j=0,1 j=0,1 X X X l l l上。

7.2 Geometric error

回忆我们在第4章提到的几何损失函数,我们可以把它用在这里:
min ⁡ P ∑ i d ( x , P X ) 2 \min_P \sum_{i} d(x,PX)^2 Pminid(x,PX)2

在这里插入图片描述
世界坐标系里的误差 我们考虑世界坐标系,也就是标定板上的误差。因为 P X PX PX不可能完全等于 x x x。反过来, x x x对应的世界坐标系里的点,也不会完全是 X X X,那么我们就假设 x x x对应的世界坐标系里的点是 X ^ \hat{X} X^,然后我们同时考虑世界坐标系的误差,和图像上的误差

∑ i = 1 n d M a h ( x i , P X i ^ ) 2 + d M a h ( X i , X i ^ ) 2 \sum_{i=1}^{n} d_{Mah}(x_{i}, P \hat{X_{i}})^2 + d_{Mah}(X_{i}, \hat{X_{i}})^2 i=1ndMah(xi,PXi^)2+dMah(Xi,Xi^)2

也就是说在图像上 x i x_{i} xi要靠近 P X i ^ P \hat{X_{i}} PXi^,在世界坐标系里 X i X_{i} Xi也要靠近 P X i ^ P \hat{X_{i}} PXi^

7.2.1 Geometric interpretation of algebraic error

代数误差的几何解释:代数误差找一个点 X ′ X' X尽可能的接近 X X X

7.2.2 Estimation of an affine camera

上述所有方法都可以直接用在仿射摄像机上。

7.3 Restricted camera estimation

通常我们会对 P P P矩阵做出一些限制:

  1. 偏斜系数 s s s是0
  2. 像素是正方形,即 a x = a y a_{x}=a_{y} ax=ay
  3. 主点 ( x 0 , y 0 ) (x_{0},y_{0}) (x0,y0)已知
  4. K K K已知

这几点假设不是同时成立的。比如我们可以只用1和2,那么 P P P矩阵就只剩下3+6=9个系数了。

迭代方法的初始化 如果我们求几何损失函数,要用迭代的方法。那么迭代的初值从哪里来? 可以用DLT先解出一个值作为初始值。

7.4 Radial distortion

相机畸变主要是径向畸变,所谓径向就是圆的直径的方向。该畸变会使正方形变得接近于一个圆,所以叫径向畸变。

校正的思想很简单。所谓畸变,就是给像素坐标 ( x , y ) (x,y) (x,y)乘上一个函数 L ( r ) L(r) L(r),我们只需要用泰勒展开去近似这个函数就好了,剩下的工作就是确定泰勒展开的系数。这个展开的系数作为内参,把它们一起标定出来就可以了。


http://www.niftyadmin.cn/n/5047828.html

相关文章

vue3-ts-vite:Google 多语言调试 / 翻译

一、实现目标 二、代码实现 2.1、项目vue3 - ts - vite 2.2、index.html 引入文件 <script>window.onload function () {const script document.createElement(SCRIPT)script.src https://translate.google.com/translate_a/element.js?cbgoogleTranslateElementI…

什么是堆栈和队列?如何实现它们?

堆栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两种常见的线性数据结构&#xff0c;用于组织和管理数据。它们分别具有不同的特点和用途。本文将详细解释堆栈和队列的概念、特点以及如何实现它们。 堆栈&#xff08;Stack&#xff09; 什么是堆栈&…

基于springboot+vue的大学生创新创业系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

一点思考|关于「引领性研究」的一点感悟

前言&#xff1a;调研过这么多方向之后&#xff0c;对研究方向的产生与发展具备了一些自己的感悟&#xff0c;尤其是在AI安全领域。私认为&#xff0c;所谓有价值、有意义的研究&#xff0c;就是指在现实社会中能够产生波澜、为国家和社会产生一定效益的研究。 举例来说&#x…

数据结构与算法之时间复杂度和空间复杂度(C语言版)

1. 时间复杂度 1.1 概念 简而言之&#xff0c;算法中的基本操作的执行次数&#xff0c;叫做算法的时间复杂度。也就是说&#xff0c;我这个程序执行了多少次&#xff0c;时间复杂度就是多少。 比如下面这段代码的执行次数&#xff1a; void Func1(int N) {int count 0;for…

c#:System.Text.Json 的使用三(从Newtonsoft迁移)

环境&#xff1a; .net 6.0vs2022 系列篇&#xff1a; 《c#&#xff1a;System.Text.Json 的使用一》 《c#&#xff1a;System.Text.Json 的使用二》 《c#&#xff1a;System.Text.Json 的使用三&#xff08;从Newtonsoft迁移&#xff09;》 参考&#xff1a; 《MSDN: 从 Newt…

QTC++ day12

注册登录界面 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> #include <QPushButton> #include <QLineEdit> #include <QLabel> #include <QDebug> #include <QMessageBox>//消息对话框类 #inc…

C 语言简单入门

C 语言发展历史|标准 1972年&#xff0c;丹尼斯里奇&#xff08;Dennis Ritch&#xff09;和肯汤普逊&#xff08;Ken Tompson&#xff09;在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年&#xff0c;布莱恩柯林汉&#xff08;Brian Kernighan&#xff…