對于一個包含已知三維物體模型的特定影像,我有相應的模型矩陣和相機引數fx,fy,cx,cy。在將模型矩陣應用于三維模型頂點之后,我想找到一個投影矩陣,將頂點準確地投射到影像中的相應物體。我使用這個投影矩陣:
2 * fx / w, 0, 1-2*cx/w, 0,
0, -2 * fy / h, -(1-2*cy/h), 0,
0, 0, (f n) / (n - f), (2 * f * n) / (n - f)。
0, 0, -1, 0
w是影像的寬度,h是高度,f是遠剪裁面,n是近剪裁面。
2 * fx / w, 0, 1-2*cx/w, 0,
0, -2 * fy / h, -(1-2*cy/h), 0,
0, 0, -1, 0,
0, 0, -1, 0
在三維點上應用投影矩陣后,我想將x和y轉換為像素坐標。要做到這一點,我做了以下作業。讓p是3D模型的一個點,在應用了模型和投影變換后,在同質坐標中:
float x=p.x/p.w;
float y=p.y/p.w;
// x和y現在在[-1,1]的范圍內。
x=(x 1)*(w/2)。
y=(y 1)*(h/2);
// x和y現在是像素坐標。
即使我非常接近,你也可以看到結果是不正確的:
錯誤在哪里?
uj5u.com熱心網友回復:
你正在使用一種相當奇怪的投影方法。標準的方法是:
# python, numpy
K = np.array([[fx 0 cx], [0, fy, cy], [0, 0, 1]] )
# P是相機坐標中的一個3D點
P = getMyXYZ()
# 投射到同質坐標中
p_h = K.dot(P)
# 像素坐標
p = p_h[:2] / p[2] 。
上面的假設是:
- 不存在鏡頭失真。
- 攝像機坐標框的Z從(cx,cy)影像像素出來,朝向場景,X朝向右邊(與影像行平行),Y向下,原點在影像后面fx像素處。
- 影像坐標幀的原點在左上角像素的中心,X軸向右增加,Y向下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331315.html
標籤:
上一篇:直方圖均衡化給了我全黑的影像
