私はPTZ可能なIPカメラを持っています。私は現在、ブラウザにライブフィードをストリーミングしており、ユーザーが画面上のポイントをクリックできるようにしたいと考えて、ユーザーがクリックした位置が中心視点になるように、カメラをパンおよびチルトします。[x、y]をカメラのパンとチルトの角度に合わせる
私のカメラパン360度と-55 90に
から私の目標を達成するために私にご案内いたします任意のアルゴリズムを傾け?
私はPTZ可能なIPカメラを持っています。私は現在、ブラウザにライブフィードをストリーミングしており、ユーザーが画面上のポイントをクリックできるようにしたいと考えて、ユーザーがクリックした位置が中心視点になるように、カメラをパンおよびチルトします。[x、y]をカメラのパンとチルトの角度に合わせる
私のカメラパン360度と-55 90に
から私の目標を達成するために私にご案内いたします任意のアルゴリズムを傾け?
カメラ(原点)の周りに3D座標系を宣言することから始めましょう。私は以下を使用します:z軸は上を指します。 x軸はカメラ方向で、pan=tilt=0
であり、正のパン角はカメラを正のy軸に向かって動かします。
次に、与えられたパン/チルトの設定のための変換である:
T = Ry(-tilt) * Rz(pan)
これは、3D空間で私たちの虚像面を配置している変換です。そのことを念頭に置いて、イメージ平面に行きましょう。
レンズの歪みが既に補正されていると仮定して、垂直および水平視野がわかっている場合は、次のように画像平面を設定できます:画像平面はカメラから1単位離れていますビュー方向。センターを飛行機のローカル起源とする。次に、その水平エクステントは+- tan(fovx/2)
であり、その垂直エクステントは+- tan(fovy/2)
です。
ここでは、この画像(左上隅の原点)のピクセル位置(x, y)
が与えられているので、この位置を3D方向に変換する必要があります。まず、イメージ・プレーン内のローカル座標を計算します。
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)
これはそこにはパンがないか、まだ傾けるという仮定の下に係る画素を含ん光線である:これは、画像のピクセルw
幅と画素高h
するためのものです。しかし今、この仮定を取り除く時が来ました。それが私たちの最初の変換が起こる場所です。
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度のカメラのFOVを持っています..それは線形補間ではありません..カメラが傾きなしでまっすぐに見ているときに直線的に補間しますが傾きがあるとき値は線形ではありません。カメラが球形のドーム – Balakrishnan
のようなものは、奇妙な魚眼レンズやフィルターがない限り線形です。あなたが記述している問題は、変換の順序が間違っているように見えます。カメラFOVは、水平および垂直の2つの角度を有する。また、回転中心が同じで焦点が合っていない場合は、ジオメトリの修正を適用する必要がありますが、ジオメトリを共有する必要があるため、カメラのキネマティクスは何ですか? – Spektre