相機坐標繫到圖像坐標系是計算機視覺中的重要概念。相機坐標系指的是描述相機位置和姿態的坐標系,而圖像坐標系指的是相機拍攝到的圖像上的坐標系。在許多計算機視覺應用中,需要將3D點投影到2D圖像上,因此需要了解相機坐標繫到圖像坐標系的轉換。
一、坐標系的介紹
在計算機視覺中,我們通常使用右手坐標系。右手坐標系的三個坐標軸用手指表示,x軸用大拇指,y軸用食指,z軸用中指。當大拇指、食指和中指方向分別為x、y、z軸正方向時,拇指和食指的方向的螺旋轉向就是z軸正方向。
相機坐標系是一個右手坐標系。與相機平行且過原點的為z軸,垂直於相機平面的為y軸,與z軸和y軸方向成直角的為x軸。
圖像坐標系是一個左手坐標系,其中x軸從左到右,y軸從上至下,原點在左上角。
二、相機內參和外參
相機內參是相機固有的屬性,包括相機的焦距、主點等參數。用矩陣K描述相機內參:
K = [ f_x 0 c_x ] [ 0 f_y c_y ] [ 0 0 1 ]
其中f_x、f_y是相機的焦距,c_x、c_y是相機的主點。
相機外參指的是相機在3D空間中的位置和朝向。用矩陣R、t描述相機外參:
[R t] = [ r_1 r_2 r_3 t ] [ 0 0 0 1 ]
其中r_1、r_2、r_3分別是相機的朝向向量,t是相機的位置向量。
三、相機坐標繫到圖像坐標系的轉換
將3D點P通過K、R、t矩陣投影到2D圖像上的過程可以表示為:
p = K * [R t] * P
其中,p表示圖像上的點,P表示3D空間中的點,*表示矩陣乘法。
將p的齊次坐標歸一化後可得到圖像坐標系下的坐標:
[x, y, w] = p u = x / w v = y / w
其中,u、v分別是圖像坐標系下的坐標,w是一個常量,通常為1。
四、代碼示例
1. 相機內參、外參定義
import numpy as np # 相機內參 fx = 500 # 焦距 fy = 500 cx = 320 # 主點 cy = 240 K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]]) # 相機外參 R = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) # 旋轉矩陣 t = np.array([0, 0, 0]) # 平移向量
2. 將3D點P投影到2D圖像中
# 3D點P P = np.array([1, 2, 3]) # 投影到2D圖像 P_homogeneous = np.hstack((P, 1)) p_homogeneous = K @ np.hstack((R, t.reshape(3,1))) @ P_homogeneous.reshape(4,1) p = p_homogeneous[:2] / p_homogeneous[2] print("P: ", P) print("p: ", p)
3. 將多個3D點P投影到2D圖像中
# 多個3D點P P_list = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 投影到2D圖像 P_homogeneous = np.hstack((P_list, np.ones((P_list.shape[0], 1)))) p_homogeneous = K @ np.hstack((R, t.reshape(3,1))) @ P_homogeneous.T p = p_homogeneous[:2] / p_homogeneous[2] print("P_list: ", P_list) print("p: ", p.T)
原創文章,作者:EFANF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331861.html