質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

867閲覧

2台のプロジェクターで出した単色2つの重複部を無くしたい

hikaparo

総合スコア17

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

4クリップ

投稿2019/01/23 17:38

以前同じようなことを質問したのですが行き詰ってしまいました。

前提・実現したいこと

2台のプロジェクターで単色画像を投影し、その画像の重なり部分をなくしたいというのが最終目標です。
重なっている部分で線分を決め、その線分それぞれのピクセル座標を求めれば、左右の単色画像のはみ出た部分を黒にするという方法を考えています。
イメージ説明

具体的な方法としては次のような撮影状況でプロジェクターからグレイコードを左右片方ずつ投影し、真ん中のカメラで撮影します。
2台のプロジェクターの配置はカメラで撮影した画像の真ん中にちょうど重複部が来るように配置してあり、保存した画像は640*480サイズなので、横320のラインで分けようと考えています。
イメージ説明
イメージ説明

左右のグレイコードの投影、撮影はすでに終わっており次のようになっています。
左側一覧イメージ説明
右側一覧イメージ説明

わからないこと

この投影したグレイコードを利用し座標を求め色を分けたいなと考えているのです。
例として写真の線分上の座標点が(320,232)だったとします。左側のプロジェクターで投影したグレイコードであれば、
白を1黒を0とした場合、目視での確認としてしまいましたが
x座標が(1001100110101011)y座標が(0110101011100101)となりました。
※xとyそれぞれ18枚あったが最後2枚はつぶれてしまって使えなくなったので16枚までとし16ケタとした
あとは左側のプロジェクターで同じ場所を探し、それより右側を映さなくするあるいは黒色に処理しようと考えていました。
これをパターンが投影されている線分上すべての点でやろうと思ったのですがどういう風にプログラム書けばいいのかわからなくて困ってます。。
そもそももっとやりやすい方法があるのでしょうか・・
わからないくせに難しいことやってるなと思っています
ご教よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

OpenCVは3.4.3、Visual Studioは2017communityです。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izmktr

2019/01/24 02:23

わからないのはグレイコードから座標への変換ですか? カメラの中央で、グレイコードからの座標がわかれば、 それより右(左)の映像を出さないようにするだけだと思うのですが、 すべての点でやる必要はありますか?
hikaparo

2019/01/24 02:36

グレイコードからの座標の変換もそうですが左右の映像の消し方もわかってません、、。 すべての点でやろうとおもったほのはその方が精度がいいかなと思ったからです。確かに今思えばコードが映ってるピクセルだけでもいいのかなと思います。
thkana

2019/01/25 23:24

過去の質問を見ると(全部は見ていませんが)Pythonで作業を始めていたようですが、それがなぜわざわざC++でOpenCVをビルドして...などということになったのでしょう。自分が何をすればいいのかすらわからないうちに聞きかじりの色々な情報を飲み込んで消化不良で混沌にハマっているように見えます。 まずは、手作業で期待の画像を作る作業をしてみたらどうでしょう。それによって、自分が何をすればいいのか(コンピュータになにをやらせればいいのか)が明確に出来ると思います。 プログラムは、あなたがやらせたい作業をコンピュータに伝える手段でしかありません。ライブラリを使えば詳細を知らなくても結果を得られる部分はあるかも知れませんが、それでもライブラリ関数を呼ぶレベルから上は何をするかを把握していなければいけません。 まずは、コンピュータにやらせる作業を把握すること、それがプログラムをいじくり回すより先に行われるべきことです。
guest

回答1

0

2台のプロジェクターで単色画像を投影し、その画像の重なり部分をなくしたい

(実際に試したわけではないので想像ベースですが)次のようなアルゴリズムで実現できるかもしれません。

  • 矩形パターンを位置rectCに配した[C]キャリブレーション用画像を用意する。(グレイコードパターンは必要ない)
  • 画像[C]を2台のプロジェクターそれぞれから投影し、中央に配置したカメラにより[L]左側プロジェクタ投影時画像、[R]右プロジェクタ投影時画像を撮影する。
  • 画像[L]に対して 2値化 → findContours輪郭抽出 → minAreaRect矩形フィッティング を行い、矩形の4端点座標rectLを算出する。
  • 画像[R]に対しても同一処理を行い、4端点座標rectRを算出する。
  • findHomographyホモグラフィ推定(src=rectL/dst=rectC)により、画像[L]から画像[C]への投影行列Hlcを算出する。
  • 同様の推定(src=rectR/dst=rectC)により画像[R]から画像[C]への投影行列Hrcを算出する。
  • 撮影画像[L],[R]に引いた境界線の2端点座標posから、投影行列Hlcにより画像[C]上の境界座標posLへ、投影行列Hrcにより画像[C]上の境界座標posRへと変換する。

posL=左プロジェクタで投影する元映像の有効領域右端、posR=右プロジェクタで投影する元映像の有効領域左端となるはず。たぶん。

投稿2019/01/26 12:41

yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問