1

画像内の平面に投影された座標系を定義したいと考えています。これを実装する方法についてのヒントとアイデアが必要なだけで、必ずしもコードではありませんが、すべてが高く評価されています! コードが提供されている場合は、OpenCV で Python を言語として使用することをお勧めします。

例: テーブルをある角度から見た画像があります。テーブルトップに配置されたチェッカーボード パターンを使用して、N 個のキャリブレーション画像を撮影しました。フラットなスヌーカー テーブルをイメージできます。内因性/外因性キャリブレーション行列、ホモグラフィ行列を計算しました。卓上の表面に画像を投影できます-すべて問題ありません。ただし、テーブルの上に座標系を作成したいと考えています。テーブルトップの寸法が 1 メートル x 2 メートルであることがわかっている場合、次のように言える関数が必要です: ポイントに対応する画像の 2 次元ピクセル座標を教えてください (x=0.75 メートル、y=1.65 メートル) ) 卓上表面。原点はテーブルトップの左上から始めたいのですが、それは単なる翻訳の問題です。この座標系と対応する関数を「使用」するにはどうすればよいですか?

私は 2 つの潜在的なアプローチを考え出しましたが、どちらも非常に効果がないように思われ、より効果的で堅牢な方法が存在するに違いないと確信しています。

1:キャリブレーション プロセスから、卓上に配置されたキャリブレーション パターンの N 個の異なる画像があります。これにより、キャリブレーション パターンごとに 1 つずつ、N 個のローカル座標系が得られます。各キャリブレーション パターンはテーブルの上に置かれているため、x 軸と y 軸は常に同じ平面にあります。これを使っOpenCVガイド テーブルトップの平面に沿った軸を描くことができます.各ポイントはチェッカーボードの正方形のサイズに一致するため、メートルからピクセルへのメトリック変換が機能します. 大きな問題は、チェッカーボードのエッジがテーブルのエッジと平行でない場合、座標系がずれてしまうことです。もう 1 つの問題は、N 個の小さな座標系を使用することで、任意の座標系を選択し、対応する変換をテーブルの左上の位置に手動で見つけて、origo を中心に回転させて軸を再調整する必要があることです。これにより、ソリューションが非常に手動になり、動的にすることが難しくなります。最終的には、手動で識別された 4 つのテーブル エッジをピクセル値で定義し、ホモグラフィ マトリックス、回転マトリックス、平行移動マトリックスなど、必要な派生値を定義するだけでよいでしょう。

2:座標グリッドの画像を生成し、この画像グリッドをテーブル上の画像に投影できます。テクニックはこれに似たものになります。次に、元の卓上画像を拡張して、正しく変換されたグリッドを含めます (つまり、カメラに近いグリッド座標の正方形は、遠くにあるグリッド座標の正方形よりも大きくなります)。ただし、これにより、描画されたグリッドから座標を抽出することはできません。画像の代わりにグリッドを投影できれば、それは非常に簡単な解決策になります。OpenCVのドキュメントを見る限り、これは不可能です。

4

1 に答える 1

1

レシピ形式:

  • 画像内で、必要な手段 (クリックしてマウス クリック座標を収集するなど) を使用して、目的の原点の画像位置を特定します。

  • 同じ方法で、目的の X 軸上の点と目的の Y 軸上の点を特定します。

  • そのようなピクセルをワールド座標のレイに逆投影し、キャリブレーション中に取得された座標変換 (外部パラメーターとも呼ばれます) のいずれかを「ワールド」として使用します。カメラに対する回転行列と平行移動をRc0, Tc0それぞれ呼びましょう

  • 光線を XY ワールド平面 (== テーブルに配置されたキャリブレーション ターゲットの平面) と交差させ、3D ポイント Ot、Xt、および Yt を取得します。

  • ベクトルxt = (Xt - Ot) / np.linalg.norm(Xt - Ot)と を計算しyt = (Yt - Ot) / np.linalg.norm(Yt - Ot)ます。

  • Gram メソッドを使用してそれらを直交化しますyt = yt - yt.dot(xt) * xt; yt = yt / np.linalg.norm(yt)

  • 3 番目の軸を計算しますzt = np.cross(xy, yt)

  • トリプル(xt, yt, zt)は、Ot を中心とする、希望する座標フレームです。行列R0t = np.hstack((xt, yt, zt))は、そのフレームからワールド フレームへの回転です。

  • 新しいフレームからカメラへの座標変換は次のとおりです。Rct = Rc0.dot(R0t), Tt = Ot

于 2020-07-16T03:02:22.113 に答える