0

私は画像操作の問題に取り組んでいます。スクリーンに投影するオーバーヘッド プロジェクターと、それを撮影するカメラがあります。画面にドットを投影し、カメラ上で結果として得られる領域の重心を見つけることで、プロジェクター座標のサブセットとカメラ ピクセルのサブセットの間に 1:1 の対応を確立できます。私はこうして地図を持っている

proj_x, proj_y <--> 散布ポイント ペアの cam_x, cam_y

私の当初の計画は、Mathscript 関数 griddata を使用してこのマップを正則化することでした。これは、次のように MATLAB で正常に機能します。

[pgridx, pgridy] = meshgrid(allprojxpts, allprojypts)
fitcx = griddata (proj_x, proj_y, cam_x, pgridx, pgridy);
fitcy = griddata (proj_x, proj_y, cam_y, pgridx, pgridy);

カメラからプロジェクターへのマッピングの逆

残念ながら、このコードにより、Labview は meshgrid ステップでメモリ不足になります (カメラは 5 メガピクセルであり、labview が処理するには多すぎるようです)。

その後、openCV を調べ始めたところ、cvRemap 関数が見つかりました。残念ながら、この関数は、上で生成しようとしていたような正則化されたピクセル ピクセル マップを出発点としています。しかし、そのようなマップを作成するための関数が openCV で利用できるようになるのではないかと期待しました。私はopenCV 1.0 APIでそれを見つけることができませんでした(私はレガシーの理由で1.0で立ち往生しています)が、そこにあるか、誰かが簡単なトリックを持っていることを望んでいました.

だから私の質問は次のいずれかです

1)openCVで散乱点からグリッドに補間するにはどうすればよいですか; (つまり、x と y の散乱値に対して z = f(x,y) が与えられた場合、画像を f(im_x, im_y) で塗りつぶす方法は?

2) 座標系 1 から座標系 2 への点の分散マッピングがわかっている場合、画像 1 を画像 2 にマッピングする画像変換を実行するにはどうすればよいですか。これは、Labview または OpenCV のいずれかで実装できます。

注: この投稿 delaunay にタグを付けています。これは、分散補間を行う 1 つの方法ですが、より適切なタグは「分散補間」です。

4

1 に答える 1

2

したがって、これは Labview 8.5 のバグに対する特定の修正になります。それにもかかわらず、それらは十分に文書化されておらず、私はそれらに苦労して一日を過ごしたので、この問題をグーグルで調べている他の誰かがそれに出くわすように投稿するつもりです.

1) メッシュグリッド爆弾。これがいつ修正されたのかはわかりません。間違いなく 8.5 のバグです。解決策: 代わりに、内挿&外挿パレットでメッシュグリッドのような関数を使用してください。または、明らかに動作する LV2009 にアップグレードします (Underflow に感謝します)。

2) Griddata は 8.5 で欠陥があります。これは文書化されていません。8.6 のアップグレード ノートには、griddata と「cubic」設定に問題があると記載されていますが、実際には DEFAULT LINEAR 設定にも問題があります。解決策は、軽快さの降順で: 1) ある種のスプライン補間を行う「v4」フラグを渡しますが、バグはありません。2) 少なくともバージョン 8.6 にアップグレードします。3) ni のエンジニアがバグを適切に文書化するまで葦で叩きのめします。

3) openCV リマップ関数を使用して、ある画像から別の画像への実際の変換を行うことができました。interp2 vi に組み込まれている matlab を使用してみましたが、大きな配列で詰まり、メモリ不足エラーが発生しました。一方、IMAQ イメージを IPL イメージにマッピングするのはかなり簡単なので、外部ライブラリの追加を除けば、それほど悪くはありません。

于 2010-05-25T22:03:10.543 に答える