3d點投影到2d螢幕,矩陣計算

2021-10-19 18:21:47 字數 2406 閱讀 7845

最近在優化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幾何體轉換成一種可作為...