最近在優化vibe輸出的3d關節點抖動問題。需要將3d點投影到2d螢幕上。3d點通過相機投影到2d螢幕上,通過一系列矩陣相乘可以求得。但是具體操作實現說明太少,本文用來記錄投影流程的實現。附python實現**
3d 轉 2d 的流水線如下:
世界座標系->相機座標系->投影矩陣->畫素對映->生成
世界座標系和相機座標系轉換可以通過dcm矩陣計算求出
def
dcm(origin: np.ndarray, target: np.ndarray)
:"""
3 * 3 矩陣 ,t 將origin座標系轉換到target座標系的dcm旋轉矩陣
args:
origin:
target:
returns:
"""matrix = np.zeros((3
,3))
for i in
range(3
):for j in
range(3
):matrix[i, j]
= np.dot(target[i]
, origin[j]
)return matrix.t
投影矩陣,可以參考pyrender.camera.py中的透視投影和正交投影矩陣。也可以根據自己的需求定製
通過1,2
兩步計算出的2d投影點,會落在(-1,1)範圍內。通過畫素對映完成3d點到2d點的投影
class
camera
:def
__init__
(self, scale, translation, resolution, znear=
0.05
, zfar=
1000):
self.scale = np.array(scale)
# 相機縮放
self.translation = np.array(translation)
# 相機位移
self.resolution = np.array(resolution)
# 2d 解析度
self.znear = znear # 近平面
self.h_s = self.resolution /
2# h/2 w/2
self.center = self.h_s # 2d投影面中心點
defcamera_matrix
(self)
:"""
相機外參矩陣,世界座標系轉相機座標系
returns:
"""world = np.eye(3)
camera = np.eye(3)
camera[-1
,-1]
=-1 matrix = np.eye(4)
matrix[:3
,:3]
= dcm(world, camera)
return matrix
defget_projection_matrix
(self)
-> np.ndarray:
""" 投影矩陣 業務定製
returns:
"""p = np.eye(4)
p[0,
0]= self.scale[0]
p[1,
1]= self.scale[1]
p[0,
3]= self.translation[0]
* self.scale[0]
p[1,
3]=-self.translation[1]
* self.scale[1]
p[2,
2]=-
1return p
class
render
:def
__init__
(self, camera: camera)
: self.camera = camera
defp_point
(self, point: np.ndarray)
:"""
投影點座標
args:
point: 點 4d 例如[0.5,0.5,0.5,1] 3d點需要填充1
returns:
"""p = self.camera.get_projection_matrix(
).dot(self.camera.camera_matrix(
).dot(point)
) p = p[:2
]/ p[-1
]* self.camera.h_s * np.array([1
,-1]
)+ self.camera.center
return p
圖例說明 2D到3D 外參矩陣估計
1.背景 最近正在做姿態估計,簡單搜姿態估計的關鍵字得到的資訊不夠完整,所以把搜到的資訊加上自己的理解整合在這篇文章。2.正向3d到2d的過程 首先3d物體在世界座標系,也就是我們現實世界,物體是現實中的絕對尺寸,以m為單位。現實世界的物體認為成剛體,那麼這個剛體和相機之間會有乙個相對位置。對於物體...
2D轉換 3D轉換
轉換是使元素改變形狀 尺寸和位置的一種效果。能夠對元素進行移動 縮放 轉動 拉長或拉伸。2d轉換 瀏覽器相容 1 internet explorer 10 firefox 以及 opera 支援 transform 屬性。2 chrome 和 safari 需要字首 webkit 3 interne...
3D 投影矩陣學習1
先看一下名詞 在矩陣數學中,也有乙個名詞叫投影矩陣,其定義為 若矩陣a既是對稱矩陣,又是冪等矩陣,則稱a為投影矩陣。這裡說的是3d世界中的投影矩陣 其作用是幫助把3d物體顯示在2維計算機平面。什麼是投影 計算機顯示器是乙個二維表面,所以如果你想顯示三維影象,你需要一種方法把3d幾何體轉換成一種可作為...