ProCamCalibで使用したマーカーは、チェッカーボード パターンよりも確実に検出されるはずです。ProCamCalib と同じようにARToolkitPlusを使用できますが、他の代替手段があるか、独自の小さな検出器を作成することもできます。:) 次に、検出されたマーカーのコーナー座標を使用して、OpenCV の残りのキャリブレーション関数を使用して、同じ方法でキャリブレーションできます。
ProCamTrackerのページに示されているように、私はそれを使ってクールなこともできます。
編集: 質問をよりよく理解したので、OpenCV はあまり役に立ちませんが、静的シーンに対してこれを非常に簡単に達成できます。まず、視聴者に修正された投影を見てもらいたい位置にカメラを配置します。次に、バイナリ パターン (局所的に点滅するドットのように見える) を投影し、それらのドット パターンの画像をキャプチャします。(構造化された光として知られている手法で、バーになるまで密度を高くすることができます。) カメラ画像からドットを検出し、それらのドットをバイナリ コードにデコードした後、カメラ <-> プロジェクター ピクセルの対応、ある程度の頂点を取得します。とにかく、そこからは 100% グラフィックです。これらの手順をさらに詳しく説明している論文を次に示します。
Zollmann, S.、Langlotz, T. および Bimber, O.
任意のサーフェスへのビュー依存投影のためのパッシブ/アクティブ幾何学的キャリブレーション
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
デモ ビデオ: http:/ /140.78.90.140/median/ar/Pub/PAGC.avi
EDIT2: ある種のパターンを投影することにより、カメラ画像の特定のピクセルに対応するプロジェクター画像のピクセル座標を把握できます。検出とデコードが簡単なため、一時的なドットパターンをよく使用します...そして実際、これにはOpenCVが役立つ場合があります。私がやろうと思う方法は、このようなものになるでしょう。簡単にするために 2 ビットだけ取りましょう。したがって、00、01、10、および 11 の 4 つの画像があります。プロジェクターの画像を制御するため、それらはわかっていますが、カメラ画像でもそれらを見つける必要があります。最初に、最後の (カメラ) 画像 11 を取得し、cvAbsDiff() を使用して最初の (カメラ) 画像 00 からそれを減算し、次に cvThreshold() で結果を 2 値化し、バイナリで輪郭 (またはブロブ) を見つけます。 cvFindContours() を使用した画像。cvMoments() で重心を見つけることができますが、cvContourArea() で各輪郭に適切な領域があることを確認する必要があります。次に、他の画像で作業を開始できます。輪郭ごとに、cvSetImageROI() を介して設定できるこれらの境界四角形内で、cvBoundingRect() を他の (これも cvThreshold() カメラで 2 値化された) 画像の cvCountNonZero() ピクセルに取り込もうとします。ゼロ以外のカウントが大きい場合は 1 として登録し、そうでない場合は 0 として登録する必要があります。
すべてのビットを取得したら、コードを取得し、完了です。