根据已知点坐标和变换后的坐标,求坐标变换矩阵

cheifer 2009-12-02 08:24:33
二维坐标系下,已知点P0的坐标(x0,y0)、P1的坐标(x1, y1).... PN的坐标(xn, yn)
和其变换后的坐标P0'(x0', y0'), P1'(x1', y1') .... PN'(xn', yn')

|sx, cy, 0 |
坐标变换矩阵P = |cx, sy, 0 |
|dx, dy, 0 |

对于人一点存在下面变换:
(x, y) * P = (sx * x + cx * y + dx, cy * x + sy * y + dy)

那么现在如何根据已有的点坐标求最接近的坐标变换矩阵。

数学学的太糟糕了,全忘记了。我分不多了,只能给50分了,谁能帮忙解决感激不尽!!
...全文
3990 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawkyw0_0 2010-08-12
  • 打赏
  • 举报
回复
要使函数(x0'-(sx * x0 + cx * y0 + dx))^2 + (y0' - (cy * x0 + sy * y0 + dy))^2 ...
的值最小 就要求函数对每个变量的偏导为0 得到6个方程 解此方程组可得结果
superchenyan 2010-06-17
  • 打赏
  • 举报
回复 1
利用最小二乘法,由于二维变换是六个参数,因而至少需要大于三组坐标才能求解;为简单,取四组,当然可以取任意个数组。将转换后坐标写为[x0 y0 x1 y1 x2 y2 x3 y3]的转置8*1列向量记为A,将原始坐标
[X0 Y0 1 0 0 0;0 0 0 X0 Y0 1;X1 Y1 1 0 0 0;0 0 0 X1 Y1 1;X2 Y2 1 0 0 0;0 0 0 X2 Y2 1;X3 Y3 1 0 0 0;0 0 0 X3 Y3 1]令其为矩阵B大小为8*6;设参数矩阵b=[a1 b1 c1 a2 b2 c2]为6*1;则
A=B*b,(AT)*A=(AT)*B*b,即b=((AT)*B)(-1)(AT)*A;注意求逆矩阵时是广义逆矩阵。
yaoyansi 2010-03-02
  • 打赏
  • 举报
回复
帖子为什么顶不上去呢
yaoyansi 2010-03-02
  • 打赏
  • 举报
回复
我现在也想知道这个问题的答案。
虽然知道1楼的方法,但是如何用数学库(比如GSL)来解决呢?
关于最小二乘都是拟合一个猜想的曲线(比如y=a*x+b),通过输入不同的x,y值最终获得拟合后的a和b,

但我和楼主的问题是求变换矩阵P,而且事先也无法猜想P的各个元素。
该怎么办呢?
zhdmxj 2009-12-04
  • 打赏
  • 举报
回复
1.
|x1 y1 1| |x1' y1' 1|
. P = .
|xn yn 1| |xn' yn' 1|

2.带入公式AtAx = Atb
|x1...xn| |x1 y1 1| |x1...xn| |x1' y1' 1|
|y1...yn| . P = |y1...yn| .
|1 ... 1| |xn yn 1| |1 ... 1| |xn' yn' 1|

3.通过上式解出p
cheifer 2009-12-04
  • 打赏
  • 举报
回复
说实话,到现在我也没能把问题解出来,数学记不得了,谁帮帮忙解一下?
zhdmxj 2009-12-03
  • 打赏
  • 举报
回复
刚没清题意,应该用最小二乘,Ax =b的最小二乘解和AtAx = Atb同解
zhdmxj 2009-12-03
  • 打赏
  • 举报
回复
变换后的点都是由矩阵p生成的,不存在期待值与测量值误差的问题,用不着最小二乘法吧,已知[u1...ur]P = [v1...vp],要解p,凑成增广矩阵就可以解出,因为是二维空间,
任选两个向量就可以
|x1 y1 1| |x1' y2 1|
|x2 y2 1|P = |x2' y2' 1|
|0 0 1| |0 0 1|
还有那个p矩阵第三行第三列是否是1
张赐 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taocf 的回复:]
我怎么记得最小二乘方是Y=F(X),也就是一个变量x,对应一个变量y。

不过应该用“无限逼近”原理,这个是正确的。
最小二乘法忘记了,谁能给出详细解释,不胜感激。
[/Quote]

一个方程组 Ax=b,当未知数个数多余方程个数是,有无数多解,现在求一个使 |Ax-b|^2最小的解,就是最小二乘法,现在解
http://latex.codecogs.com/gif.latex?A^{T}Ax=A^{T}b

就可以了

lhslktg 2009-12-03
  • 打赏
  • 举报
回复
d
cheifer 2009-12-03
  • 打赏
  • 举报
回复
我怎么记得最小二乘方是Y=F(X),也就是一个变量x,对应一个变量y。

不过应该用“无限逼近”原理,这个是正确的。
最小二乘法忘记了,谁能给出详细解释,不胜感激。
shangjie95 2009-12-03
  • 打赏
  • 举报
回复
|x1A-b1|+..+|xnA-bn|>=|x1A-b1+..xnA-bn| = |(x1+..xn)A-(b1+..bn)|>=0,(x1+..xn)A-(b1+..bn)等于0是最好情况
arong1234 2009-12-02
  • 打赏
  • 举报
回复
这种计算不是纯“数学”的计算,很多东西都是从实际系统中采样来的,因此无论x,y还是x',y'都可能是有误差的,因此即使理论的系数只有一个,但是实际上这些点是无法真正得到那个理论值的,实际上,这种x,y,x',y'往往无法直接计算,每组带入算得到的系数可能都不同,从而使得方程组无解。这就是为什么需要最接近解,而1楼说的就是著名的“最小二乘解”
[Quote=引用 2 楼 forsiny 的回复:]
如果已知是三个点以及三个点变换之后的点的话,只要点“合适”,则有唯一确定解:


联立方程:
sx*x0+cx*y0+dx=x0'
cy*x0+sy*y0+dy=y0'

sx*x1+cx*y1+dx=x1'
cy*x1+sy*y1+dy=y1'

sx*x2+cx*y2+dx=x2'
cy*x2+sy*y2+dy=y2'

这六个方程可以用矩阵表示出来,然后用线性代数里面的解方程组的方法,
sx=det(D1)/det(D) ...
就可以得到变换阵P的参数了


如果不是三个点的话,不知“最接近的”此意何解…
[/Quote]
张赐 2009-12-02
  • 打赏
  • 举报
回复
怎么看不到图啊

楼主自己复制图片地址
张赐 2009-12-02
  • 打赏
  • 举报
回复
就是解线性方程组的问题,以2×2为例


只要解除 p的四个元素就可以了。根据矩阵的乘法,上面又可以写成下面2个线性方程组





2个方程组都是未知数和方程个数相等,说明只有唯一解。现在解除P的4个分量就可以了。

关于线性方程组的计算机解法,楼主在网上搜索矩阵LU分解代码

baihacker 2009-12-02
  • 打赏
  • 举报
回复
对那六个待定的求偏导吧...
cheifer 2009-12-02
  • 打赏
  • 举报
回复
一楼正解,能否麻烦详细点
forsiny 2009-12-02
  • 打赏
  • 举报
回复

如果已知是三个点以及三个点变换之后的点的话,只要点“合适”,则有唯一确定解:


联立方程:
sx*x0+cx*y0+dx=x0'
cy*x0+sy*y0+dy=y0'

sx*x1+cx*y1+dx=x1'
cy*x1+sy*y1+dy=y1'

sx*x2+cx*y2+dx=x2'
cy*x2+sy*y2+dy=y2'

这六个方程可以用矩阵表示出来,然后用线性代数里面的解方程组的方法,
sx=det(D1)/det(D) ...
就可以得到变换阵P的参数了


如果不是三个点的话,不知“最接近的”此意何解…
baihacker 2009-12-02
  • 打赏
  • 举报
回复
对函数(x0'-(sx * x0 + cx * y0 + dx))^2 + (y0' - (cy * x0 + sy * y0 + dy))^2 ...
求最小值...

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧