欢迎访问个人网络日志🌹🌹知行空间🌹🌹
单应矩阵(homography matrix)等同于透视变换中使用的矩阵。
透视变换描述了两个平面之间的映射关系。理解之所以称为单应矩阵,是因为两个平面之间的关系是确定的,只能通过唯一的矩阵来表示这个变换,故称之为单应矩阵。
单应矩阵通常描述处于共同平面上的一些点在两张图像间的变换关系。对于空间中固定平面上的点P(如墙面),对于运动的相机,可根据P在 t k , t k + 1 t_k,t_{k+1} tk,tk+1时刻图像中的位置 p 1 , p 2 p_1,p_2 p1,p2来估计相机的运动。
设点P所处的固定平面的方程为:
n
T
P
+
d
=
0
n^TP + d = 0
nTP+d=0
上式参考空间中平面的方程:
A
(
x
−
x
0
)
+
B
(
y
−
y
0
)
+
C
(
z
−
z
0
)
=
0
A(x-x_0) + B(y-y_0) + C(z-z_0) = 0
A(x−x0)+B(y−y0)+C(z−z0)=0
化简为:
−
n
T
P
d
=
1
-\frac{n^TP}{d} = 1
−dnTP=1
设
K
K
K是相机的内参矩阵,
R
R
R和相机外参旋转矩阵,
t
⃗
\vec{t}
t是相机外参平移向量,则根据相机模型的推导,空间点P到像素坐标系的映射可写为:
p
=
s
K
(
R
P
+
t
⃗
)
p = sK(RP + \vec{t})
p=sK(RP+t)
使用齐次坐标表示像素坐标,因齐次坐标最后一维为0或1,则带尺度因子的
s
p
sp
sp与
p
p
p是相等的,
[
u
v
1
]
≃
[
s
u
s
v
s
]
\begin{bmatrix} u\\ v\\ 1 \end{bmatrix} \simeq \begin{bmatrix} su\\ sv\\ s \end{bmatrix}
⎣⎡uv1⎦⎤≃⎣⎡susvs⎦⎤
≃
\simeq
≃表示齐次坐标这种尺度相等的关系。
则方程
p
=
s
K
(
R
P
+
t
⃗
)
p = sK(RP + \vec{t})
p=sK(RP+t)
可写成
p
2
≃
K
(
R
P
+
t
⃗
⋅
(
−
n
T
P
d
)
)
p_2 \simeq K(RP + \vec{t}\cdot(-\frac{n^TP}{d}))
p2≃K(RP+t⋅(−dnTP))
将
t
k
t_k
tk时刻的相机坐标系当做世界坐标系,则R表示
t
k
t_k
tk到
t
k
+
1
t_{k+1}
tk+1时刻相机的姿态变化,
t
⃗
\vec{t}
t表示
t
k
t_k
tk到
t
k
+
1
t_{k+1}
tk+1时刻相机的平移变化,上述方程可写成:
p
2
≃
K
(
R
−
t
⃗
n
T
d
)
K
−
1
p
1
p_2 \simeq K(R-\frac{\vec{t}n^T}{d})K^{-1}p_1
p2≃K(R−dtnT)K−1p1
记
H
=
K
(
R
−
t
⃗
n
T
d
)
K
−
1
H=K(R-\frac{\vec{t}n^T}{d})K^{-1}
H=K(R−dtnT)K−1,则上式写为:
p
2
=
s
H
p
1
p_2 = s H p_1
p2=sHp1
因
p
2
p_2
p2和
p
1
p_1
p1是齐次坐标,具有尺度不变性,s尺度缩放因子,而齐次坐标的最后一维要么为0要么为1,因此s最后都会被约掉,因此,
p
2
≃
H
p
1
p_2 \simeq H p_1
p2≃Hp1
H即为单应矩阵。
[
u
2
v
2
1
]
≃
[
h
1
h
2
h
3
h
4
h
5
h
6
h
7
h
8
h
9
]
[
u
1
v
1
1
]
\begin{bmatrix} u_2\\ v_2\\ 1 \end{bmatrix} \simeq \begin{bmatrix} h_1 & h_2 & h_3 \\ h_4 & h_5 & h_6 \\ h_7 & h_8 & h_9 \end{bmatrix}\begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix}
⎣⎡u2v21⎦⎤≃⎣⎡h1h4h7h2h5h8h3h6h9⎦⎤⎣⎡u1v11⎦⎤
这里还是
≃
\simeq
≃而非=,因此对矩阵
H
H
H乘以任意的缩放因子
s
s
s上式仍然成立。假设取
s
=
1
h
9
s = \frac{1}{h_9}
s=h91则矩阵H可以重新写成:
H
=
[
h
1
h
2
h
3
h
4
h
5
h
6
h
7
h
8
1
]
H = \begin{bmatrix} h_1 & h_2 & h_3 \\ h_4 & h_5 & h_6 \\ h_7 & h_8 & 1 \end{bmatrix}
H=⎣⎡h1h4h7h2h5h8h3h61⎦⎤
因此可令
h
9
=
1
h_9=1
h9=1,单应矩阵只包含8个自由度。
{
u
2
=
h
1
u
1
+
h
2
v
1
+
h
3
h
7
u
1
+
h
8
v
1
+
1
v
2
=
h
4
u
1
+
h
5
v
1
+
h
6
h
7
u
1
+
h
8
v
1
+
1
\left\{\begin{matrix} u_2=\frac{h_1u_1+h_2v_1+h_3}{h_7u_1+h_8v_1+1}\\ v_2=\frac{h_4u_1+h_5v_1+h_6}{h_7u_1+h_8v_1+1} \end{matrix}\right.
{u2=h7u1+h8v1+1h1u1+h2v1+h3v2=h7u1+h8v1+1h4u1+h5v1+h6
整理之后可以写为:
{ h 1 u 1 + h 2 v 1 + h 3 − h 7 u 1 u 2 − h 8 v 1 u 2 = u 2 h 4 u 1 + h 5 v 1 + h 6 − h 7 u 1 v 2 − h 8 v 1 v 2 = v 2 \left\{\begin{matrix} h_1u_1+h_2v_1+h_3 - h_7u_1u_2 - h_8v_1u_2 = u_2\\ h_4u_1+h_5v_1+h_6 - h_7u_1v_2 - h_8v_1v_2 = v_2 \end{matrix}\right. {h1u1+h2v1+h3−h7u1u2−h8v1u2=u2h4u1+h5v1+h6−h7u1v2−h8v1v2=v2
由以上推理过程,1组匹配点可以得到2个方程,因此自由度为8的单应矩阵H可以通过4组匹配点(不能有3点共线)得到8个方程来求得,方程组可写为:
[ u 1 1 v 1 1 1 0 0 0 − u 1 1 u 2 1 − v 1 1 u 2 1 0 0 0 u 1 1 v 1 1 1 − u 1 1 v 2 1 − v 1 1 v 2 1 u 1 2 v 1 2 1 0 0 0 − u 1 2 u 2 2 − v 1 2 u 2 2 0 0 0 u 1 2 v 1 2 1 − u 1 2 v 2 2 − v 1 2 v 2 2 u 1 3 v 1 3 1 0 0 0 − u 1 3 u 2 3 − v 1 3 u 2 3 0 0 0 u 1 3 v 1 3 1 − u 1 3 v 2 3 − v 1 3 v 2 3 u 1 4 v 1 4 1 0 0 0 − u 1 4 u 2 4 − v 1 4 u 2 4 0 0 0 u 1 4 v 1 4 1 − u 1 4 v 2 4 − v 1 4 v 2 4 ] [ h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 ] = [ u 2 1 v 2 1 u 2 2 v 2 2 u 2 3 v 2 3 u 2 4 v 2 4 ] \begin{bmatrix} u^1_1 & v^1_1 & 1 & 0 & 0 & 0 & -u^1_1u^1_2 & -v^1_1u^1_2\\ 0 & 0 & 0 & u^1_1 & v^1_1 & 1 & -u^1_1v^1_2 & -v^1_1v^1_2\\ u^2_1 & v^2_1 & 1 & 0 & 0 & 0 & -u^2_1u^2_2 & -v^2_1u^2_2\\ 0 & 0 & 0 & u^2_1 & v^2_1 & 1 & -u^2_1v^2_2 & -v^2_1v^2_2\\ u^3_1 & v^3_1 & 1 & 0 & 0 & 0 & -u^3_1u^3_2 & -v^3_1u^3_2\\ 0 & 0 & 0 & u^3_1 & v^3_1 & 1 & -u^3_1v^3_2 & -v^3_1v^3_2\\ u^4_1 & v^4_1 & 1 & 0 & 0 & 0 & -u^4_1u^4_2 & -v^4_1u^4_2\\ 0 & 0 & 0 & u^4_1 & v^4_1 & 1 & -u^4_1v^4_2 & -v^4_1v^4_2\\ \end{bmatrix}\begin{bmatrix} h_1\\ h_2\\ h_3\\ h_4\\ h_5\\ h_6\\ h_7\\ h_8 \end{bmatrix}=\begin{bmatrix} u_2^1\\ v_2^1\\ u_2^2\\ v_2^2\\ u_2^3\\ v_2^3\\ u_2^4\\ v_2^4 \end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡u110u120u130u140v110v120v130v140101010100u110u120u130u140v110v120v130v1401010101−u11u21−u11v21−u12u22−u12v22−u13u23−u13v23−u14u24−u14v24−v11u21−v11v21−v12u22−v12v22−v13u23−v13v23−v14u24−v14v24⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡h1h2h3h4h5h6h7h8⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡u21v21u22v22u23v23u24v24⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
通过求解上述方程组,可以恢复
H
H
H,这种方法称为直接线性变换法Direct Linear Transform(DLT)。求得H后再对其进行分解可以求得
R
R
R和
t
⃗
\vec{t}
t.
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。
一、习惯约定图片来自PSINS(高精度捷联惯导算法)PSINS工具箱入门与详解.pptx二、基本旋转矩阵绕x轴逆时钟旋转α\alphaα角度Rx(α)=[ 1000cosαsinα0−sinαcosα]R_x(\alpha)=\begin{bmatrix}\1&0&0\\0&\cos\alpha&\sin\alpha\\0&-\sin\alpha&\cos\alpha\end{bmatrix}Rx(α)= 1000cosα−sinα0sinαcosα绕y轴逆时钟旋转α\alphaα角度Ry(α)=[ cosα0−sinα010sinα0cosα]R_y(\alpha
欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋
我理解RubystdlibMatrix是不可修改的,也就是说,例如。m=Matrix.zero(3,4)不会写m[0,1]=7但我非常想做...我可以用笨拙的编程来做,比如defmodify_value_in_a_matrix(matrix,row,col,newval)ary=(0...m.row_size).map{|i|m.rowi}.map(&:to_a)ary[row][col]=newvalMatrix[*ary]end...或者作弊,比如Matrix.send:[]=,0,1,7但我想知道,这一定是人们一直遇到的问题。有没有一些标准的、习惯的方法可以做到这一点,而不必使用
快速求三阶矩阵的逆矩阵前言一般情况下,我们求解伴随矩阵是要注意符号问题和位置问题的(如下所示)A−1=1[ ][−[ ]−[ ]−[ ] −[ ]]=A−1=1[ ][ M11−[M12] M13−[M21] M22−[M23] M31−[M32] M33]⊤\begin{aligned}&A^{-1}=\frac{1}{[\\]}\left[\begin{array}{cccccc}&-[\\]&\\-[\\]&&-[\\]\\\\&-[\\]&\\\end{array}\right]=\\\\&A^{-1}=\frac{1}{[\\]}\left[\b
在本文中,我们将探讨摄影机的外参,并通过Python中的一个实践示例来加强我们的理解。相机外参摄像头可以位于世界任何地方,并且可以指向任何方向。我们想从摄像机的角度来观察世界上的物体,这种从世界坐标系到摄像机坐标系的转换被称为摄像机外参。那么,我们怎样才能找到相机外参呢?一旦我们弄清楚相机是如何变换的,我们就可以找到从世界坐标系到相机坐标系的基变换的变化。我们将详细探讨这个想法。具体来说,我们需要知道相机是如何定位的,以及它在世界空间中的位置,有两种转换可以帮助我们:有助于确定摄影机方向的旋转变换。有助于移动相机的平移变换。让我们详细看看每一个。旋转通过旋转改变坐标让我们看一下将点旋转一个角度
为什么Matrix类没有方法来编辑它的向量和组件?似乎矩阵中的所有内容都可以读取但不能写入。我错了吗?是否有一些类似于Matrix的第三方优雅类允许我删除行并有意地编辑它们?如果没有这样的类(class),请通知我——我将停止搜索。 最佳答案 Matrix类的设计者一定是不可变数据结构和函数式编程的爱好者。是的,你是对的。无论如何,总有一个简单的解决方案可以满足您的需求。使用Matrix它可以做的事情,然后,只需使用.to_a来获得一个真正的数组。>>Matrix.identity(2).to_a=>[[1,0],[0,1]]另见N
在Ruby中是否有内置的打印可读矩阵的方法?例如require'matrix'm1=Matrix[[1,2],[3,4]]printm1让它显示=>1234在REPL中代替:=>Matrix[[1,2][3,4]]matrix的Ruby文档让它看起来像应该显示的那样,但这不是我所看到的。我知道编写一个函数来执行此操作是微不足道的,但如果有“正确”的方法,我宁愿学习! 最佳答案 您可以将其转换为数组:m1.to_a.each{|r|putsr.inspect}=>[1,2][3,4]编辑:这是一个“无积分”版本:putsm1.to_a
matlab中矩阵点乘和乘的区别MATLAB中,一、矩阵相乘:表示两个矩阵相乘。二、矩阵点乘:表示矩阵中对应位置的元素分别相乘。三、举例3.1矩阵相乘3.2矩阵点乘MATLAB中,一、矩阵相乘:表示两个矩阵相乘。前提条件:满足矩阵相乘的规则,即前矩阵的列数等于后矩阵的行数。二、矩阵点乘:表示矩阵中对应位置的元素分别相乘。前提条件:满足矩阵点乘的规则,即前后矩阵维度相同。三、举例3.1矩阵相乘Example1:A=[123;456]A=123456>>B=[1;2;3]B=123>>C=A*BC=1432这时如果用点乘就会报错Example2:>>A=[123;456;789]A=1234567