拡張現実は簡単です

この記事の対象者

モバイルデバイスに関連したコンピュータービジョンと拡張現実に興味があるが、どこから始めればよいかわからない人向け。

まえがき

だから、私たちはサンクトペテルブルク州立大学の数学と機械学部の学生であり、彼らは余暇にコンピュータビジョンの基本的な側面に精通することを決めました。 理論的基盤を統合するために、実用的なことを行うことにしました。 私たちの非常に興味深い講義への訪問は、拡張現実の人々に爆弾を落とすことを可能にするアプリケーションの考えを促しました。

Androidがモバイルプラットフォームとして選択された理由は、Androidを使用してアプリケーションを作成した経験がほとんどなかったためです。また、JavaはObjective-Cよりもはるかに優れています。 画像処理には、有名なOpenCVライブラリを使用することにしました。
カットの下で、単純なアプリケーションの作成のストーリー。

すでにGoogle Playにある拡張現実アプリは何ですか?

従来、これらは3つのカテゴリに分類できます。
  1. 加速度計、コンパス、GPSからデータを受信し、それらにのみ焦点を合わせて、画像に何かを重ねます(
  2. 印刷が必要なラベルまたは一般的なラベルを使用する(
  3. データをまったく受信も使用もせず、単に画像をオーバーレイするだけです(

基本的に、Google Playで見つけることができるのはこれだけです。

どこから始めますか?

OpenCVライブラリーを使用してコンピュータービジョンを知る最も簡単な方法。 O'Reillyの本「Learning OpenCV」(rutrekerで入手可能)をお勧めします。 また、 開発者Wikiを頻繁にチェックアウトする必要があります。

問題の声明

実際、何をしなければなりませんでしたか? まず、爆弾を爆発させる可能性のある画像内のオブジェクトを選択する必要がありました。 移動するオブジェクトを検索し、それらとの衝突をチェックするというアプローチを使用することにしました。 モバイルデバイスのリソースが限られているため、これは非常に迅速に実行できます。これは非常に重要です。

実装

何を思いつきましたか? 1つのフレームでいくつかの重要なポイントを取り、それらが次のフレームのどこにあるかを確認します。 次に、それらのシフトを検討し、それらをオブジェクトになるクラスターに分散します。 背景は、最大面積(または最大数のポイントを持つクラスターですが、結果としてこのアプローチを放棄したクラスター)と見なすことができます。

キーポイントのシフトを決定するために、 Lucas-Kanadeメソッドを使用することにしました。 入り口で、彼は2つの写真と、最初の写真の点の配列を必要とし、出力は同じ点の配列ですが、2番目の写真で既に見つかりました。 必要なものだけで十分に高速に動作します。

この場合、goodFeaturesToTrack(...)メソッドはキーポイントの検索に適しています。 名前から推測できるように、彼は特徴(特定の基準によって他と異なるキーポイント)を探しています。これは、フレームからフレームに簡単に追跡できます。 単純なフィーチャ検索よりも動作が遅くなりますが、シフトの計算の精度は向上します。

問題とヒント

  1. カメラシフトを正確に判断することはできません。
    最初に、次のアプローチを計画しました。2つのフレームの共通部分を切り取り、一方を他方から減算します。 理論的には、非ゼロの部分は移動するオブジェクトの場所を示します。 しかし実際には、わずかなカメラの動きでも、シフトと明るさの違いが不正確であるため、ゼロ領域はほとんどありませんでした。 アプリケーションを設計するときは、この事実を考慮する必要があります。
  2. すべてをネイティブで行う必要があります。
    最初のバージョンは、純粋なJavaで作成されました。 ただし、ライブラリ自体はネイティブですが、大量のデータの不要な転送が大量に発生し、ガベージコレクターが頻繁に呼び出されるため、動作が非常に遅くなります。 すべての計算をネイティブに行った後、生産性は数倍に向上しました。
  3. デバッグ
    デバイスでのデバッグには多くの時間がかかり、この目的のためのエミュレータはオプションではありません(遅すぎる)。 そのため、C ++でアプリケーションのPCバージョンを使用すると便利です。特定のセクションをAndroidのネイティブコードに簡単にコピーできます。
  4. マルチスレッド。
    フレームの処理には多くの時間がかかり、ユーザーは画像を変更する際の遅延を喜んで観察することはできません。 したがって、画像の出力とその処理を2つのストリームに分割するという、まったく自然なことを行う必要があります。
  5. ドキュメンテーション
    Android用のOpenCVバージョンでは、わかりやすいドキュメントがないことに感銘を受けました。 もちろん、基本的にはPCバージョンと同じですが、いくつかの点はまだ異なります。


おわりに

画像処理には深刻な計算能力が必要です。 私たちのアプリケーションは、Acer Liquid(768 MHz)に匹敵する性能のデバイスでもうまく機能します。 現在製造されているほとんどのデバイスでは、もっと複雑なことをすることはかなり可能です。

また、ご覧のとおり、コンピュータービジョンに複雑なものは何もありません。現時点では、Android向けの拡張現実を備えたアプリケーションはほとんどありません。

Source: https://habr.com/ru/post/J144280/


All Articles