2017-05-30 70 views
0

我有一臺可以進行PTZ的IP攝像機。我目前正在將實時數據流傳輸到瀏覽器中,並希望允許用戶單擊屏幕上的某個點,並且相機將平移並傾斜,以便用戶單擊位置現在成爲中心觀點。翻譯屏幕座標[x,y]到相機平移和傾斜角度

我的相機水平360度和垂直-55°〜90°

,將引導我實現我的目標的任何算法?

+0

獲得/測量FOV你的相機,然後通過線性插值轉換像素位置的角度,這是它的實際位置是中心像素所以從中心的距離x和y會直接得到你的運動角度 – Spektre

+0

我有相機的65度視角..它不是一個線性插值..當相機看起來直線沒有傾斜它可以線性內插,但是當有傾斜該值不是線性的。更像是相機是球形的圓頂 – Balakrishnan

+0

除非你有一些奇怪的反魚眼鏡頭或過濾器,那麼它是線性的。您所描述的問題看起來更像是錯誤的轉換順序。相機FOV有2個角度btw水平和垂直。如果旋轉中心不同並且在焦點上,那麼相機的運動學是什麼,那麼您需要應用幾何校正,但爲此您需要共享幾何... – Spektre

回答

0

我們首先聲明相機周圍的三維座標系(原點)。我將使用以下內容:z軸向上指向。 x軸是與pan=tilt=0相關的方向,並且正的平移角度會將攝像機移向正y軸。

然後,變換爲給定的搖攝/傾斜的配置是:

T = Ry(-tilt) * Rz(pan) 

這是變換定位我們的虛像平面在三維空間中。讓我們記住這一點,並轉到圖像平面。

如果我們知道垂直和水平視場並假定鏡頭失真已經被校正,我們可以按如下方式設置我們的成像平面:成像平面距離相機1個單位(通過聲明)查看方向。讓中心成爲飛機的本地原點。然後,其水平範圍是+- tan(fovx/2),其垂直範圍是+- tan(fovy/2)

現在,在此圖像中的像素位置(x, y)(原點位於左上角)中,我們首先需要將此位置轉換爲3D方向。我們首先計算圖像平面中的局部座標。這是用於將圖像的像素寬度w和像素高度h

lx = (2 * x/w - 1) * tan(fovx/2) 
ly = (-2 * y/h + 1) * tan(fovy/2) (local y-axis points upwards) 
lz = 1         (image plane is 1 unit away) 

這是包含的假設下,沒有平移或傾斜尚根據像素的射線。但現在是擺脫這種假設的時候了。這就是我們最初的轉變發揮作用的地方。我們只需要改變這個射線:

tx = cos(pan) * cos(tilt) * lx - cos(tilt) * sin(pan) * ly - sin(tilt) * lz 
ty = sin(pan)    * lx + cos(pan)    * ly 
tz = cos(pan) * sin(tilt) * lx - sin(pan) * sin(tilt) * ly + cos(tilt) * lz 

產生的方向現在描述包含指定像素在全球座標系中,我們在一開始建立的射線。所有剩下的就是計算新的平移/傾斜參數:

tilt = atan2(tz, tx) 
pan = asin(ty/sqrt(tx^2 + ty^2 + tz^2))