11

私は、モバイル コンテキストで「リアルタイム」にシーン内の既知の画像を検出するプロジェクトに取り組んでいます (つまり、スマートフォンのカメラを使用してフレームをキャプチャし、フレームのサイズを 150x225 に変更しています)。絵自体はかなり複雑になる可能性があります。現在、各フレームを平均 1.2 秒で処理しています (OpenCV を使用)。この処理時間と全体的な精度を改善する方法を探しています。私の現在の実装は次のように機能します:

  1. フレームをキャプチャする
  2. グレースケールに変換する
  3. キーポイントを検出し、ORB を使用して記述子を抽出する
  4. 記述子 (2NN) (オブジェクト -> シーン) を一致させ、比率テストでフィルター処理します
  5. 記述子 (2NN) (シーン -> オブジェクト) を一致させ、比率テストでフィルター処理します
  6. 4. と 5. による非対称マッチングの削除。
  7. 一致する信頼度を計算します (キーポイントの合計に対する一致したキーポイントの割合)

私のアプローチは正しいものではないかもしれませんが、改善の余地はたくさんありますが、結果は問題ありません。SURF 抽出が遅すぎて、ホモグラフィを使用できなかったことに既に気付きました (ORB に関連している可能性があります)。すべての提案を歓迎します!

4

2 に答える 2

7

パフォーマンスは常にモバイルの問題です:)

できることがいくつかあります。OpenCV:C ++とCのパフォーマンスの比較では、処理時間の改善に関する一般的な方法について説明しています。

そしてあなたのプロジェクトのいくつかの詳細:

  • カラー画像をキャプチャしてグレースケールに変換すると、リソースの無駄になります。ネイティブカメラフォーマットはYUVです。コストのかかるRGBに変換されてから、やはりコストのかかるグレーに変換されます。YUV(Y)の最初のチャネルがグレースケールである間、これはすべて...したがって、YUVをキャプチャし、画像データの最初の部分をコピーして最初のチャネルを抽出します(AndroidのYUVは平面です。つまり、最初のw * hピクセルはYチャネルに属します)
  • ORBは高速になるように作成されました。そしてそうです。しかし、ほんの数週間前に、FREAKがOpenCVに追加されました。これは新しい記述子であり、その作成者はORB / SIFT / SURF/etcよりも正確かつ高速であると主張しています。それを試してみてください。あなたはopencv>=2.4.2でそれを見つけることができます(これは現在のものです)

編集

ブラッドラーセンの質問が明らかになっています-マッチャーが処理するのに900ms滞在している場合、それは問題です!Andrey Kamaevによるこの投稿を確認してくださいOpenCVORB機能検出器はどのように機能しますか?ここで彼は記述子とマッチャーの間の可能な組み合わせを説明します。FLANNベースのucharマッチャーを試してください。

また、それらを照合するのにそれだけの時間がかかる場合は、非常に多くの検出(数百または数千)が得られると思います。検出を制限するか、最初のn個の最良の値のみを選択してください。

于 2012-07-16T07:46:29.573 に答える
3

シーン内のオブジェクトを検出するには FAST を試す必要があります。これは SURF よりも高速であり、FAST のピラミッド バージョンを使用する記事を見つけることができます。モバイルでのパフォーマンスを向上させるために、ループを最適化したり、固定小数点演算を使用したりできます。頑張ってください。

于 2012-07-17T11:05:26.170 に答える