やろうとしていることは,上図のような感じです.QRコードをデコードした後はどうするのかという話は,また別.初音ミクでも表示させておけば良いんじゃないかと思っている.おそらくは,そこから先はOpenGLの出番かと.うーん.勉強するべき技術が多いぜ.
何故こんな流れになっているかと申しますと.最初はlibdecodeqr付属のwebcamサンプルを拡張していたんですが,いかんせん歪みに弱く,QRコードをかなり大きめに撮影する必要がありました.これは複数のQRコードを同時に読ませようとする目的からして,かなり厳しいです.なので,OpenCVで画像処理してやればいいんじゃね?という発想からきています.射影変換等で多少変になっても,RS符号によって誤り訂正しまくってくれることを期待しています.そうすると,今度はOpenCVに処理させるべきQRコードと思われる部分をどのようにして切り出すかという話になるので,それはARToolKitに押しつけた形です.要するには,自力でコードを書く量は最小限にして,既存技術を最大限に活かそうという考えです.目的の本質じゃないところで苦労したくないんです.
というわけで,こんな感じの流れで実装していますが,「はっ?ばかじゃねーの?そんなの××で一発じゃん?」とか「○○を使ってARToolKitで直接QRの領域切り出せよ」とか「△△なら傾いたQRコードでもデコードするし,みたいな?」なんていうご意見や情報等がありましたら,どしどしとお寄せいただきたいと思います.特に,AR業界や画像処理業界の方々からのご意見をお待ちしております.異分野コラボレーションだ!(いや,マジでなにかご意見下さいorz)
現段階で出来ることは「QRコードの隅っこ3つにある四角形の4つ角の座標が取得できると事だ」考えると
(つまりQRコード1つなら12個の点が取れる)
まず1つのQRしか画像中に存在しない時,ここから真正面から見たQRコードを射影変換するには,
ある1つの四角形を正面から見たように射影変換するすればよい.すると残りの模様(残り2つの四角形を含む)
も正面から見た絵に変換できます.
すべての四角形がもっとも四角形らしくなるように最適化する方法もあるけどそれはそれでおいておく.
(射影に歪んだ四角形を正四角形に戻す方法は既知とします)
ここからマルチQRコード化の話
この補正した状態からなら,もしほかのQRコードも同一平面上にあるのなら,
すでにほかのQRコードも正面から見た絵に変換できているので,簡単に見つかるはず
もし,違う平面上なら,歪みは取れていないのでほかでも同じ事を繰り返す必要がある.
(射影ゆがみは奥行きに依存したものなので,違う平面では異なるゆがみがおきている)
ただし,見つけた四角形の模様をQRコードごとにグルーピングしないといけない問題が新たに生じる
(1つなら強制的に1つのQRコードに含まれるのは3つの四角形だが,2つならその組み合わせは3C3通り)
四角形の近さなどを条件に,3つを適切にセットにするというのが一番簡単なアルゴリズムだと思いますが,
ほかにも,QRらしさ適当に定義して,総当りで3つを選択したペアを作って一致度の高い順で
ソートしてやればいいのかな?
もしデコード時のエラーが誤り訂正符合で直らないのなら,超解像のプログラム送りますw
動画で突っ込んでくだしあ
コメント超ありがとうございます.参考になります.
> もしほかのQRコードも同一平面上にあるのなら,
> すでにほかのQRコードも正面から見た絵に変換できている
なるほどなるほど.これは想定外でした.
今の考えでは,すべてのQRコード候補に対して個別に射影変換してそれぞれlibdecodeqr行きを考えていました.
1つのQRコード候補を選んで面全体を射影変換してから,libdecodeqrに丸投げしてマルチQR認識ですね!
すべてが同じ平面上なら1つのシンボルを検出して,それを射影変換することで,面全体を射影変換するんですねっ?シンボル検出の手間とQRコード候補の領域検出が不要になりますね.
ががが.残念なことに,目的を達成するには,おそらくすべてのQRコードが同一平面上にはないとおもうので,結局のところは何回か射影変換が必要になりそうです.
そのため,各シンボルを距離的に近い理由でグルーピングして,QRコード候補として,その領域を切り出して射影変換して,libdecodeqrという手順にしてみました.
QRコード複数同時認識といっても,想定では高々5つ程度なので,この程度のアルゴリズムでも大して遅くはならないだろうという想定でやっています(まだ射影変換を試していない・・・).
ちょっとばかり,本業のお仕事が締切間近なので,自由研究は週末以降になりますが,射影変換以降を実装してみます!アドバイスありがとうございました.