私のコンピューター ビジョンでは、輪郭検出に多くの時間を費やしており、より高速である必要があります。NEON 命令とベクトル化を介して他のすべてを最適化したので、実際には輪郭検出がプロファイルを支配しています。残念ながら、これを最適化する方法は私には明らかではありません。
私は基準マーカー、つまり cvFindContours() を見つけるために古典的な長方形検出プロセスを行っており、その後に輪郭から正方形を近似しています。非常に多くのマーカーが表示されている場合 (または壊滅的に、マーカーではない長方形の密集したグリッドが表示されている場合)、cvFindContours() の呼び出しだけで、iPhone で 30 ミリ秒以上かかることがあります。
私はすでに信じられないほど高価な C++ の cv::FindContours() を cvFindContours() に置き換えました。特にベクトル > が渡された場合、C++ バージョンは、内部の cvFindContours() よりも長い時間、ベクトルの割り当てと入力に費やしました!
今、私は完全に cvFindContours、より具体的には cvFindNextContour() の時間に縛られています。cvFindNextContour 内のコードは分岐が多く、明らかにベクトル化が容易ではありません。また、複雑なアルゴリズムを実装しているため、最適化を試みても間違いを犯さないとは思えません。
私はすでに cvBlobLib (あいまいさをなくすために、これを意味します: http://code.google.com/p/cvblob/ ) を調べて、同じことをより高速に実行できる代替アルゴリズムが提供されているかどうかを確認しました。ソースのベース ダウンロードは、輪郭を std::list() に記録し、ほとんどすべての時間をメモリ割り当てに費やすため、信じられないほど遅くなります。そのリストを 256 要素に事前にサイズ設定された std::vector に置き換えて、push_back() の初期コピーを排除しても、cvFindContours() よりも 3 倍長くかかる関数が残ります。その 66% は直接 cvb::cvLabel( )。したがって、この方法を実行することは現実的ではないようです。
多くの長方形の検出を最適化する方法について、誰かアイデアはありますか? 私の漠然とした手を振るには、次のものが含まれます。
cvFindContour() に相当する高速な実装はありますか? 理想的には、私がマルチプラットフォームであるソース コードとして、そこにありますか?
輪郭の大部分は必要ありません。「成功した」長方形だけが役に立ちます。特に、それらの内部輪郭は役に立ちません。理論的には、cvFindContours をまったく呼び出さず、代わりに cvStartFindContours/cvFindNextContour を呼び出して、見つかった各輪郭をテストし、探している四角形が見つかった場合は再帰しないようにすることはできますか?
古典的な FindContours()/ApproxPoly() アプローチから使用できる完全に異なる長方形検出アルゴリズムはありますか?
関心のある有用な領域で cvFindContours を「プライミング」する方法はありますか? たとえば、FAST コーナー検出は、非常にアグレッシブなしきい値を使用しても、ほとんどの場合、基準マーカー コーナーを返します。検出を制限するように設定されたそのポイントを使用する方法はありますか? (残念ながら、多くのマーカーの場合、またはマーカーに関係のない密集したグリッド線の場合、これがどの程度役立つかはわかりません。これは私のアプリでよく発生します。)
上記と同じように、ブロブ検出は(私が正しく理解していれば)再帰的なフラッドフィリングとして実装できるため、興味深いブロブ矩形を何らかの方法で引き出し、輪郭検出をシードするために使用できる、これの高速なベクトル化された実装はありますかそこから?
どんなアイデアでも大歓迎です!