Mat*_*291 11 matrix homography emgucv
我是图像处理的新手,但我正在使用EMGU进行C#图像分析.但是,我知道单应矩阵并不是EMGU独有的,所以也许有了解另一种语言的人可以更好地解释.
请(尽可能简化)有人可以解释每个元素的作用.我在网上看了这个,但找不到我能理解的答案(正如我所说,我对这一切都是新手!)
我分析了两个二维图像.因此,需要3×3矩阵来解释图像的旋转/平移.如果未检测到移动,则单应矩阵为:100,010,001
我从研究中得知(例如OpenCV Homography,转换点,这段代码在做什么?):10Tx,01Ty,XXX
10,01位是x和y坐标的旋转.Tx和Ty位是平移运动,但XXX位是什么?这是我不明白的?它与仿射变换有关吗?请有人解释一下:1.如果我现在对我上面所说的是对的.2. XXX位的含义
phi*_*ler 17
如果你掌握了矩阵乘法,那就不难理解了.假设你指的x
是
/a\
\b/,
Run Code Online (Sandbox Code Playgroud)
并且您希望通过以下方式旋转坐标系A
:
/3 4\
\5 6/
Run Code Online (Sandbox Code Playgroud)
和"移动它" t
/2\
\2/.
Run Code Online (Sandbox Code Playgroud)
后面的矩阵是仿射变换的组成部分,以获得新的观点y
:
y = A*x + t = <a'; b'>T //(T means transposed).
Run Code Online (Sandbox Code Playgroud)
如您所知,为此,可以构建一个3d矩阵B
和一个x'
看起来像的矢量
/3 4 2\ /a\
B = |5 6 2| , x' = |b|
\0 0 1/ \1/
Run Code Online (Sandbox Code Playgroud)
这样的
/a'\
y' = |b'| = B*x'
\ 1/
Run Code Online (Sandbox Code Playgroud)
从中可以提取y
.让我们看看它是如何工作的.在原始变换中(使用加法),第一步是进行乘法,即.旋转部分y_r
:
y_r = A*x = <3a+4b; 5a+6b>T
Run Code Online (Sandbox Code Playgroud)
然后你添加"绝对"部分:
y = y_r + t = <3a+4b+2; 5a+6b+2>T
Run Code Online (Sandbox Code Playgroud)
现在看看它是如何B
工作的.我会y'
逐行计算:
1) a' = 3*a + 4*b + 2*1
2) b' = 5*a + 6*b + 2*1
3) the rest: 0*a + 0*b + 1*1 = 1
Run Code Online (Sandbox Code Playgroud)
正是我们的期望.首先,计算旋转部分 - 加法和乘法.然后,平移部分的x部分被添加,乘以1
- 保持不变.第二行也是一样.
在第三行,a
和b
被丢弃(乘0
).最后一部分保持不变,恰好是1
.所以,关于最后一行的所有内容都是"删除"点的值并保持1
.
那么可以说,2x3矩阵就足够了.这部分是正确的,但有一个明显的缺点:你松散的可组合性.假设您基本满意B
,但想镜像一个坐标.然后您可以选择另一个转换矩阵
/-1 0 0\
C = | 0 1 0|
\ 0 0 1/
Run Code Online (Sandbox Code Playgroud)
并有结果
y'' = C*B*x' = <-3a+4b+2; 5a+6b+2; 1>T
Run Code Online (Sandbox Code Playgroud)
由于矩阵乘法的特性,使用2x3矩阵不能轻易完成这种简单的乘法.
原则上,在上面,最后一行(the XXX
)也可以是表格中的任何其他内容<0;0;x>
.只是为了降低点值.然而,通过乘法工作来制作合成是必要的.
最后,在这种情况下,维基百科对我来说似乎很有用.
(@ Anybody:因为可能会注意到,我不是数学家.我想我理解这个概念,但是如果有错误或缺少某些东西,请告诉我.)