SURFを使用して拡張現実マーカーを作成する

SURFを使用して拡張現実マーカーを作成する



これは、拡張現実のトピックの続きです。 これが最初の部分です。 Incoユーザーによるトピックの議論で、彼は拡張現実マーカーVideoを認識する方向で彼の仕事の興味深い結果を示しました。その瞬間、時間がありませんでしたが、数か月後、私はそれがすべてどのように機能し、アプローチがどれほど安定していて、自由な時間があるのか​​と思いました。 私はこのアイデアの私の実装を紹介し、 このイベントでレポートを作成しました。





このトピックでは、レポートの概要と、会議に十分な時間がなかった理由、つまりプログラムのソースコードについて説明します。 プレゼンテーションを完全に視聴するには、スクリーンキャストを使用できます。



拡張現実とは何ですか?


まず第一に、拡張現実とは何かについてお話したいと思います。

私たちの現実は存在します-私たちの目で見るもの、それをどう解釈するか、そしてそれが実際にどのようであるか。 さらに、仮想現実があります。 これが生成されるもの、存在しないもの、彼らがあなたに見せたいものです。

拡張現実が位置するのは、これら2つの現実の接合部です。 それは私たちの現実に向かってもっとシフトするかもしれません、それからそれは拡張された現実になるでしょう、またはそれは仮想に向かってもっとシフトするかもしれません-そしてそれは私たちの現実によって補われる仮想です。



現在、拡張現実とは何ですか?




今では使用されています:



拡張現実はどのように機能しますか?




まず、画像があります。 なぜ画像なのか-人は視力で70%の情報、つまりカメラからの画像を知覚するからです。 さらに、さまざまなセンサー、GPS、ジャイロスコープ、加速度計、コンパス-これらはすべて、デバイス、その向きと空間内の位置に関する情報を提供します。

例えば、あなたがどこにいるのか、そしてあなたの電話が何を探しているのかを知ると、あなたの見込み客が何であるか、あなたが見ているものを教え、それに応じて、この情報を使用して、あなたが見ているもの、私たちが仮定していることについての拡張現実を導き出すことができますほらね たとえば、新しいから:

次に、画像処理、センサー情報の取得。 実際、すべてがそれほど単純ではありません。 カメラから取得した画像には、多くの場合予備処理が必要です。 センサーが提供するデータは正確ではありません。同じ加速度計を使用すると、高周波数で恥知らずに好きになります。つまり、必要な間違ったデータが常に提供されます。 GPSと同様に、これには精度のしきい値があり、携帯電話でGPSを使用したことがある人なら誰でも知っています。 ジャイロスコープ-ジェット機のようなジャイロスコープであると誰もが想像します。 はい、それは3つの平面で位置を与えますが、コンパスと加速度計なしでは、それは十分に正確ではありません。 繰り返しますが、拡張現実はイメージだけでなく、デバイスで起こるすべてを考慮に入れます。

オブジェクトの識別。 これは質問に対する答えですが、私は何を見ますか。 これは、この拡張現実の中で最も興味深いものです。 それなしでは、これらはすべてクールなおもちゃです。つまり、電話をひねると、左側に車やバイクがあり、右側に移動します。





拡張現実の重要な問題は、補完するものです。 何かを特定する必要があります。 これを行うには、数学とコンピューターサイエンスの認識アルゴリズムがあります。 素晴らしい画像が見つかりました。 次に、画像データベースで検索してみましょう。 そのため、画像をコピーしました。たとえば、画像です。どのような画像であるかを知ることは興味深いでしょう。 これも難しい作業です。 インデックスを作成する方法は、コンピューターサイエンスの非常に興味深い方向でもあり、当然、多くのタスクがあります。

そして今、実際にそれを表示する方法、ユーザーがこれを理解できるようにユーザーを提示する方法は? これにより、ユーザビリティの問題が発生します。



オブジェクトを識別する方法は?




そのため、画像を取得し、オブジェクト、マーカー、つまり補完するものを識別する必要があります。 これは、マーカーを使用して、またはマーカーなしで実行できます。 ここでは、バーコード、碑文、QRコード、これがマーカーです。 電話機はそれを認識し、たとえば現実を補完します。たとえば、普通の文字の翻訳を行います。 たとえば、車の番号、家の番号など、インターネットから見つかった情報。

幾何学的な図。 古典的な拡張現実マーカーは正方形です。 なんで? 飛行機を組み立ててホモグラフィを見つけるのは非常に簡単だからです。 3つの座標で位置を見つけます。

作成するグラフィックマーカーは、正方形などの明確な形状を持っている場合、それぞれ現実から際立っており、内部に不協和音を導入しています。 マーカーが現実に近い場合、それがこの現実に入る場合-より良いです。 写真は描かれた正方形よりも優れており、写真はQRコードよりも優れています。 マーカーなしで、座標、空間内の位置、そしてもちろん実際にはマーカーではないグラフィックマーカーを取得できます。 私たちは現実の一部を認識し、それが私たちのマーカーだとイエスと言うことができます。 繰り返しますが、人々に何かを知ってもらいたい場合は、イメージを事前に生成できます。 壁に掛ける絵などのマーカーを作成します。



マーカーになるもの。


拡張現実マーカーを使用する場合、90年代前半から開発されたシステムがいくつかあります。 拡張現実のマーカーテクノロジーを詳細に説明したトピックへのリンクを次に示します。

こちらがデューラーの彫刻、サイです。 マーカーになりますか? はい、できます。



したがって、どのように? しかし、実際には、SURFメソッドがあります。 永続的な特徴を見つけるためのテクニックを非常によく説明している素晴らしい記事があります。



メソッドを慎重に理解し、元の(1、2、3)出版物を見ると、そのような結論が表示されます(これについてはスクリーンキャストで詳しく説明します)。

  1. メソッドには、調整が必要な感度があります。
  2. このメソッドは誤検知を与えます。
  3. メソッドを構築する際、経験的係数が使用されますが、これも特定のケースに合わせて調整する必要があります。
  4. このメソッドには、並列化と最適化の前提条件があります。


そして最も重要なこと-完成したアプリケーションで拡張現実を使用するためには、マーカーを認識するだけでは不十分です。マーカーを追跡し、誤検知、追跡するためにこれらの方法を使用した場合にSURFが与える異常な爆発を追跡および消滅できる必要があります。



フレーム内のオブジェクトの座標を見つけてビデオをオーバーレイする方法は?


3次元の場合の数学を説明する記事があります (マーカーに3Dモデルをオーバーレイしようとする場合)。 2次元の場合、すべてがはるかに単純です。

いくつかのポイント(4つ以上)のアフィン変換のパラメーターを見つける必要があります。これにより、見つかったキーポイントが一致するように画像を圧縮、拡大、歪曲する方法がわかります。



これが、誤検知の危険性の原因です。 「間違った」ポイントを取ると、結果は誤って見つかった変換行列になり、画像はそこにありません。 これに対処する方法-いくつかのアプローチがありますが、それらはすべて、観測のデータの異常なレベルを判断する方法に要約されます。 つまり グループ化とクラスタリング。



コード


このプログラムを実装するには、インストール済みのOpenCVライブラリが必要です。 このコードはLinux用に作成されましたが、Visual Cでコンパイルする必要があります。ソースへのリンク: Opensurf.zip

コードの概要:

このソースコードはOpenSurfプロジェクトに基づいており、main.cppファイルが変更されています

実際、私が触れたいことは(main.cppファイルの断片):



ソースデータ:

//    ,    CvCapture* capture1 = cvCaptureFromFile("imgs/ribky.avi"); //     (capture),        CvCapture* capture = cvCaptureFromFile("imgs/child_book.avi"); //CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY ); //  -  // This is the reference object we wish to find in video frame IplImage *img = cvLoadImage("imgs/marker6.png");
      
      







キーポイントを取得します:



 //   img = cvQueryFrame(capture); frm_id++; //    surfDetDes(img, ipts, false, 4, 4, 2, 0.001f); //      getMatches(ipts,ref_ipts,matches);
      
      







フレームの構築と最初の40フレームの緑色のドットの描画は非常に透明であるため、ビデオのフレームのオーバーレイに直接進みます。



 //      frame = cvQueryFrame(capture1); //     pt1.resize(n); pt2.resize(n); //      for(int i = 0; i < n; i++ ) { pt1[i] = cvPoint2D32f(matches[i].second.x, matches[i].second.y); pt2[i] = cvPoint2D32f(matches[i].first.x, matches[i].first.y); } _pt1 = cvMat(1, n, CV_32FC2, &pt1[0] ); _pt2 = cvMat(1, n, CV_32FC2, &pt2[0] ); //  (     ) cvFindHomography(&_pt1, &_pt2, &_h, CV_RANSAC, 5); //  cvZero(frame1); //  ,          0,255,0 cvWarpPerspective(frame, frame1, &_h, CV_WARP_FILL_OUTLIERS,cvScalar(0,255,0) ); //   0,255,0          //    = not (0,253..255,0) imagegr=cvCreateImage(cvGetSize(frame1), frame1->depth, 1); cvInRangeS(frame1, cvScalar(0, 253, 0), cvScalar(0, 255, 0), imagegr ); cvNot(imagegr, imagegr); //  ,     0,253... 255,0   cvCopy(frame1,img,imagegr);
      
      







Googleメガネの作成と拡張現実への関心の高まりに照らして、プレゼンテーションの目的は、方法を説明し、議論中に何度も掛け合わされるアイデアや考えを人々と共有することでした。



All Articles