折り紙と拡張現実(続き)

以下に書かれているものはすべて小さな背景があります。 ここでは、技術的な詳細に集中することにしました。 したがって、私たちの探究心の前に、次のタスクを設定します。

シートにマーカーとして特別なバーコードを配置し、その内容と画像上の位置に関する情報を描画モジュールに戻すことが決定されましたが、モジュール自体はこの情報をいつどのように使用するかに関する情報を保存します。



名前は付けられていないが想定されている条件の1つは、「あなたの」認識モジュールと「あなたの」バーコードの使用です(いいえ、車輪を再発明する必要はありません。既存の部品から組み立てることができました。 開発されたバーコードは、 リードソロモンアルゴリズムによる暗号化に基づいており、おそらく、それらに別の記事を捧げるべきです。



次に、これらの不思議な兆候を認識するためのモジュールについて話しましょう。



最初のステップは、入力を取得することです。 静止画像、ビデオ録画、ウェブカメラからのビデオなど、いくつかのソースからそれらを受け取ることができます。 いずれにせよ、拡張現実の仕事は静止画像の処理になります(ビデオの場合はフレームになります;過去のフレームから収集されたデータを考慮する機能、不安定な画像の場合にデータの「慣性」を導入するなども追加されます。 一般性を失うことなく、静的な画像(言い換えれば、写真)の使用を検討しましょう。







写真の明るさはさまざまですが(これは1段階で重要になります)、バーコードが配置されたシートという1つのものによって結合されます。 バーコードは特別に開発され、認識アルゴリズムでも考慮される多くの機能を備えています(後で説明します)。



まず、画像を「変色」する必要があります。 色には情報が含まれていないため、この余分な情報は削除します。







得られた画像上で、オブジェクトの境界を見つけます。 これを行うには、ピクセルごとに、ペアワイズの周囲の値から最大の差を選択します。



ペアワイズ周囲値との最大差



その結果、「モノフォニック」領域では値はゼロに近くなります(画像にノイズがある場合、値はゼロとわずかに異なります)が、残りと対照的なピクセルが考慮中の領域に入ると、値は急激に増加します。 この操作後に得られる画像は、どの情報が重要でないかを明確に示しています(バーコードが白黒で、白い紙に印刷されていることを忘れないでください。つまり、常に高いコントラストが得られます)。







結果の画像では、オブジェクトの境界をすでに検索できているように見えます。 ただし、ここの境界線は1つの色で構成されておらず、グレーの複数のシェードが含まれていることを忘れないでください。 したがって、最初にしきい値の二値化を実行します。 画像の明るさは何らかの理由で私たちにとって重要だったことを覚えていますか? したがって、この段階では重要です。 2値化のしきい値を厳密に設定すると、非常に明るい写真と非常に暗い写真でフィルターが正しく機能しません(希望どおりではありません)。 したがって、画像自体に応じて2値化のしきい値を決定するOtsu Tresholdingアルゴリズムを使用します。 したがって、私たちにとって重要な境界は消去されません。







これで画像には白黒ピクセルのみが含まれるようになり、オブジェクトの検索を開始できます。



多くの境界線割り当てアルゴリズムがあります。 最も単純なものの1つ、「シーケンシャルスキャンアルゴリズム」を使用します。 背景ピクセルをスキップして画像を1行ずつ調べますが、連続する「重要な」ピクセルを組み合わせます(分析の瞬間の各ピクセルでは、左、左上、上、右上のピクセルが重要です)。 関連する記事で詳しく説明されている境界線やその他の必要な操作を組み合わせて、インデックスを再作成した後、最終的に関連エリアのリストを取得します。 ほんの少しだけ残った-それらからバーコードであるものを選択する。



これを行うために、いくつかのチェックを行います(グレーの濃淡の画像を再度使用します):

  1. 見つかったオブジェクトのうち、指定されたサイズより小さいものを破棄します。バーコードには情報付きの8×8セルが含まれているため、最小画像サイズ(16 x 16ピクセルなど)を使用します。
  2. 各オブジェクトの境界を分析してみましょう。 それらを一連のセグメントに置き換えると、境界が4つのセグメントで構成されているものだけが残ります(バーコードは正方形ですが、シートがカメラに垂直ではないため、歪む可能性がありますが、とにかく4辺を節約します)
  3. バーコードの特徴の1つは連続した黒い境界線であるため、内側の境界線が外側の境界線よりも暗いオブジェクトのみを残します。
  4. 残りのオブジェクトの正方形を復元します。 これを行うために、正方形の画像上に元の(歪んだ)画像を表示するためのマトリックスを作成し、データを補間することで競合(ピクセルの不足または過剰)を解決します。 この例の画像の場合、次のバーコードの写真を取得します。



  5. 繰り返しますが、結果の画像にOtsuフィルターを適用します。



  6. 結果の画像を二値化し、数値行列に変換します。 バーコードは64個のセル(8×8)で構成されているため、画像を64個の正方形の領域に分割します。 各セルに対して、その「正確な」値を計算します:黒または白(「精度」が十分でない場合、たとえば、ある色のピクセルの40%と別のピクセルの60%の場合、画像はさらなる分析に適さないと見なされます) 結果に基づいて、1と0で満たされた8×8行列を作成します。

  7. 結果のマトリックスを分析します:角度マーカーを探し、上部と下部の概念に従ってマトリックスを回転させます(上記のバーコード画像はすでに確立された方法で既に回転しています)、そこから有用な情報を抽出し、デコードします(情報はリードソロモンアルゴリズムを使用してエンコードされます)。 この段階では、ご想像のとおり、バーコードの以前のすべてのチェックに合格した領域も削除されます。 ただし、受信した情報はすでに使用できます。


______________________

テキストは、©SoftCoder.ruのHabr Editorで作成されます。



All Articles