生活随笔
收集整理的這篇文章主要介紹了
透视投影中3DMM系数的求解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天總結代碼, 想推導下透視投影下如何迭代求解3DMM的系數, 不經意間竟然發現如果給定Pose, 3DMM的系數竟然能夠線性求解, 我很吃驚(透視投影不應該是非線性的嗎?), 于是記錄下來,經驗證似乎沒問題,驗證代碼如下:
帶’的是乘上了R.
import numpy
as np
import cv2
as cvR
= cv
.Rodrigues
(np
.array
([2, 1, 3.0]))[0].astype
(np
.float32
)
t3d
=np
.array
([3, 5, 100], dtype
=np
.float32
)nV
= 30
dims
= 20
E
=np
.random
.rand
(nV
, 3, dims
).astype
(np
.float32
)
V
=np
.random
.rand
(nV
, 3).astype
(np
.float32
)def comp_x(x
):S
=V
+ E
.dot
(x
)TS
=S
.dot
(R
.T
) + t3d dst
= TS
[:, :2] / TS
[:, 2:] return dst
def solve_x(dst
):V_
= V
.dot
(R
.T
) + t3d E_
= (R
.dot
(E
.transpose
(1, 0, 2).reshape
(3, -1)).reshape
(3, nV
, dims
)).transpose
(1, 0, 2).reshape
(-1, dims
)A
=np
.zeros
((2*nV
, dims
), dtype
=np
.float32
)b
=np
.zeros
(2*nV
, dtype
=np
.float32
)for i
in range(nV
):A
[i
*2:i
*2+2] = E_
[i
*3:i
*3+2] - dst
[i
].reshape
(2, 1).dot
(E_
[i
*3+2].reshape
(1, -1))b
[i
*2:i
*2+2] = dst
[i
].reshape
(-1)*V_
[i
, 2] - V_
[i
, :2] AtA
=A
.T
.dot
(A
)Atb
=A
.T
.dot
(b
)x
= np
.linalg
.inv
(AtA
).dot
(Atb
)return x
def pt_x(x
): p
(x
.astype
(np
.int32
))x
=(np
.random
.rand
(dims
)*10).astype
(np
.int32
).astype
(np
.float32
)
dst
= comp_x
(x
)x_
= solve_x
(dst
)dst_
= comp_x
(x_
)pt_x
(x
)
pt_x
(x_
)p
( np
.sum((dst_
- dst
)**2))
總結
以上是生活随笔為你收集整理的透视投影中3DMM系数的求解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。