自由に移動するカメラ (ローカル空間) で撮影されたポイントの位置を、同じシーンの画像内の位置 (グローバル空間) に変換しようとしています。ポイントの位置はローカル空間で与えられ、グローバル空間で計算する必要があります。遠近変換を計算するために、グローバル空間とローカル空間の両方に対応するポイントを持つように、シーン全体にマーカーを分散させています。
JavaCV (cvGetPerspectiveTransform(localMarker, globalMarker, mmat)) を使用して、gloabl とローカル空間の対応するマーカーのポイントを比較することにより、遠近変換マトリックスを計算しようとしました。次に、遠近変換行列 (cvPerspectiveTransform(localFieldPoints, globalFieldPoints, mmat)) を使用して、ローカル空間でのポイントの位置を変換します。
私の問題を解決するにはそれで十分だと思いましたが、うまくいきません。また、ビデオの 1 つの特定の画像でさまざまなマーカーの透視変換行列を計算すると、さまざまな透視変換行列が得られることにも気付きました。すべてが正しいことを理解していれば、ここでは視点が常に同じであるため、これは発生しないはずです。したがって、常に同じ視点変換行列を取得する必要がありますね。
私はこれらすべてにまったく慣れておらず、これが最初の試みだったので、私が使用した方法が一般的に正しいかどうか、または別の方法で行う必要があるかどうかを知りたかっただけです。多分私は何かを逃したのですか?
編集:
繰り返しますが、私が見ている完全なシーンの 1 つの画像と、シーン内で自由に動くカメラからのビデオがあります。ここで、ビデオのすべての画像を取得し、それを完全なシーンの画像と比較します (画像とビデオの作成に異なるカメラを使用したため、カメラの組み込み関数は実際には同じではありません。それが問題でしょうか?
右側にシーンの画像、左側にビデオの画像があります。左のビデオ画像の赤い丸が指定されたポイントです。右の画像の赤い四角は、透視変換を使用して計算された点です。ご覧のとおり、計算されたポイントは正しい位置にありません。
「異なる透視変換行列を取得する」という意味は、マーカー「0E3E」を使用して透視変換行列を計算すると、マーカー「0272」を使用する場合とは異なる行列が得られるということです。