我有一臺可以進行PTZ的IP攝像機。我目前正在將實時數據流傳輸到瀏覽器中,並希望允許用戶單擊屏幕上的某個點,並且相機將平移並傾斜,以便用戶單擊位置現在成爲中心觀點。翻譯屏幕座標[x,y]到相機平移和傾斜角度
我的相機水平360度和垂直-55°〜90°
,將引導我實現我的目標的任何算法?
我有一臺可以進行PTZ的IP攝像機。我目前正在將實時數據流傳輸到瀏覽器中,並希望允許用戶單擊屏幕上的某個點,並且相機將平移並傾斜,以便用戶單擊位置現在成爲中心觀點。翻譯屏幕座標[x,y]到相機平移和傾斜角度
我的相機水平360度和垂直-55°〜90°
,將引導我實現我的目標的任何算法?
我們首先聲明相機周圍的三維座標系(原點)。我將使用以下內容: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))
獲得/測量FOV你的相機,然後通過線性插值轉換像素位置的角度,這是它的實際位置是中心像素所以從中心的距離x和y會直接得到你的運動角度 – Spektre
我有相機的65度視角..它不是一個線性插值..當相機看起來直線沒有傾斜它可以線性內插,但是當有傾斜該值不是線性的。更像是相機是球形的圓頂 – Balakrishnan
除非你有一些奇怪的反魚眼鏡頭或過濾器,那麼它是線性的。您所描述的問題看起來更像是錯誤的轉換順序。相機FOV有2個角度btw水平和垂直。如果旋轉中心不同並且在焦點上,那麼相機的運動學是什麼,那麼您需要應用幾何校正,但爲此您需要共享幾何... – Spektre