画像内の特定の曲線を検出するために OpenCV を使い始めたところです。まず、曲線があるかどうかを検証したいのですが、次に縦か横の凸曲線か凹曲線かで曲線の種類を特定したいと思います。OpenCVで利用可能な機能はありますか? そうでない場合は、どうすればそのような関数を作成できるかについて、いくつかのアイデアを教えていただけますか? ありがとう!ちなみにC++を使っています。
1 に答える
テンプレート マッチングは、この問題を解決する堅牢な方法ではなく (小さなピンホールからオブジェクトを見るようなものです)、エッジ検出器は必ずしも画像内の真のエッジを返すとは限りません。影などによる誤ったエッジも返されます。さらに、不完全なエッジの問題や、画像内のシーンの複雑さに応じてスケールアップするその他の問題に対処する必要があります。
一般的に、あなたが提起した問題は非常に難しいものであり、おもちゃの例を除いて、良い解決策はありません.
大雑把な試みとしては、最初にエッジ検出器を使用してもっともらしいエッジを検出することを試みることができます(たとえば、キャニー エッジ検出器が提案されています)。次に、RANSAC を使用して、検出されたエッジのポイントのサブセットを曲線モデルに適合させます。
たとえば、次の形式の曲線を検出しようとしているとしましょう f(x) = ax^2 + bx + c。RANSAC は基本的に、検出されたエッジのポイントの中から、この曲線モデルに最も適合するサブセットを見つけようとします。異なる曲線を検出するには、それに応じて f(x) を変更し、それぞれに対して RANSAC を実行します。次に、RANSAC によって割り当てられたポイントから適用されるいくつかのヒューリスティックを使用して、f(x) によって表される曲線が実際に画像に存在するかどうかを判断することができます (たとえば、モデルに適合するポイントが少なすぎる場合は、曲線はそこにはありません.しかし、ポイント数の適切なしきい値を決定する方法は?)。回転などの許容される変換を考慮する必要がある場合、モデルはより複雑になります。
このアプローチの問題は、基本的には、画像内にあると思われるものをポイントに合わせようとしているということです。時には、探しているものがそこになくても、「可能な限り最高の」フィットが返されることがあります。たとえば、同心円から検出された点がたくさんあります。これらの点から直線を検出しようとすると、RANSAC は最適な直線を返します! 実際、ランダムな初期化段階で選択したポイントに応じて、さまざまな実行からさまざまな行が得られる可能性があります。
この種の問題で RANSAC を使用する方法の詳細については、Marco ZulianiによるRANSAC for Dummiesを参照してください。彼はまた、このテクニカル レポートに付属する素敵なMATLAB ツールボックスを持っています。これはおそらく、選択した言語に移植できます。
背景がどのように見えるかを知っていない場合、または背景をきれいにするなどして背景を制御している場合を除き、これは解決するのが非常に難しい問題です。