2016-08-03 98 views
-1

我正在使用OpenGL ES(IOS)和OpenCV。我想知道是否有辦法從GLKMatrix4攝像頭位置獲取二維像素座標?OpenGL ES - 從相機位置獲得二維像素座標

確實,我有一個OpenGL顯示的特定3D對象,它只有它的大小和相機姿態,我想將它轉換成OpenCV參考座標,即2D像素。

更確切地說,我有一個iOS應用程序,我流式攝像機的顏色。這個流在我的Ipad上用OpenGL顯示。在這個顯示屏上,我有一個特定的覆蓋圖,它是一個3D對象。同時,我用OpenCV做了一些檢測。現在,我想將我的檢測結果鏈接到我的框架(這是一個矩形繪圖),感謝OpenCV與3D對象,但對於這一個,我只有它的相機位置和尺寸。

我知道一個4x4相機姿勢的內容,但我沒有找到任何有關如何將它轉換爲2D座標的信息(如果可能的話)。

那麼簡單: 輸入:2D矩形(僅獲得2D座標)和三維物體(只得到它的攝像頭位置)

有沒有辦法?你可以幫我嗎 ?

感謝

+0

您是否希望獲得由矩陣表示的像素或由矢量乘以矩陣表示的像素?解釋你的輸入究竟是什麼。 –

+0

我剛剛編輯過我的帖子。其實是的,我想從我的相機姿態(矩陣4x4)我的3D對象的二維座標(像素)。感謝馬蒂奇。 – lilouch

+0

這是最初發布在[Robotics](http://stackoverflow.com/q/38763529/42473)上的,但在此處雙張貼後遷移。 –

回答

1

爲了讓你只需要通過您正在使用的openGL的矩陣乘以它的向量的屏幕上投影。第三個座標簡單地被丟棄,僅用於深度緩衝區(也可以是插值,但在這裏確實無關緊要)。

在openGL中,您將通過將其與矩陣相乘獲得的繪製像素的座標將歸一化到所有座標軸範圍內的座標系[-1,1]。這意味着,在屏幕的最左上角像素/視圖將有一個座標(-1,1),右上(1,1),中心(0,0) ...現在對應緩衝區像素此值必須規格化:

您需要要有緩衝區widthheight,那麼像素位置是bufferX = ((x+1)/2.0) * widthbufferY = ((y+1)/2.0) * height。結果是浮動值,因此您需要將它們四捨五入爲整數或對它們進行類型轉換。我不知道哪些是由openGL完成的。

+0

不要忘記檢查座標是否實際在緩衝區內... –

+0

感謝您的回覆,但我只有對象的相機位置,就是這樣。那麼我需要分解這個相機位置嗎? – lilouch

+0

如果我理解正確,那麼只需要將零向量與矩陣相乘。或者你可能只需要矩陣(第四行)的變換向量並將其用作結果。 –

1

由於您已經在使用GLKit類型和數學,因此如果還需要另一種方法,請嘗試使用函數GLKMathProject將3D模型空間轉換爲視口(窗口/像素2D)空間,然後使用GLKMathUnproject。你需要(相同的)模型視圖和投影矩陣,你可以(假設)傳遞給着色器來繪製場景。