5

C++用の使いやすいビジョンライブラリを見つけようとしています。これが私の状況です:私はコンピューターに接続されたカメラを持っています(ただし、簡単にするために、画像ファイルがコンピューター上に存在すると仮定することができます)、これは画像が理想的にどのように見えるかです:

ここに画像の説明を入力してください

垂直に積み重ねられた3つのオブジェクトは、非常に対照的な色になるという考え方です。オブジェクトの位置を特定する必要があるため、ビジョンライブラリはオブジェクトのエッジを見つけるか、オブジェクトの重心を特定する必要があります。

私はこれまでビジョンシステムを使用したことがないので、いくつかの調査を行っていますが、OpenCVはかなり人気があるようです。私のアプリケーションで使用するのは簡単ですか、それともオブジェクトの位置を簡単に決定するために使用できる別のライブラリがありますか?

アドバイスありがとうございます!

4

2 に答える 2

7

OpenCV は、間違いなく使いやすいビジョン ライブラリです。かなりの数のコンピューター ビジョン プロジェクトで使用してきましたが、非常に直感的に使用できます。

オブジェクトの色が不明であると推測しています (そうでない場合は、OpenCVで特定の色を見つける方法に関する非常に優れたチュートリアルがあります)。

問題を解決するための大まかなアイデアを次に示します (OpenCV で簡単に実装できる操作を考えています)。

  • 画像を HSV 色空間に変換します。コントラストが高い場合、色はこの空間で非常に異なる色相値を持つ必要があるため、色相画像のみを使用してください。

  • Otsuの方法を使用して画像にしきい値を設定します(しきい値は自動的に決定されます)

  • 中央のオブジェクトを選択すると (たとえば、背景に 2 つの接続されたコンポーネントがある場合)、セグメンテーションが完了します。findContoursオブジェクトが正方形の場合は、線にハフ変換を使用することもできます。

  • 外側のオブジェクトのみを選択する場合は、同じ方法で再び輪郭を見つけることができます。関心領域 (作業中の画像の一部) を輪郭の内側に設定し、画像の内側の部分を再びしきい値処理します。他の 2 つのオブジェクト間の境界を見つけます。最後に、見つかった輪郭を別の画像に重ねるだけです。

  • 最もトリッキーなケースは、最も内側のオブジェクトのみを検出するようにしきい値処理を行う場合です。一見すると、上記のケースと区別できませんが、2 番目の (内側の) しきい値では、関連する結果が得られません。その場合、見つかったしきい値領域 (2 番目のオブジェクトの色相) のすぐ外側の色相を選択し、(ちょうど見つかった) 最も内側のオブジェクトの色相をそれに設定することができます。ここで、再び 2-Hue 画像を取得します。これをしきい値処理して、外側の 2 つのオブジェクト間の輪郭を見つけることができます。最後に、前の場合と同様に、見つかった輪郭を重ね合わせます。

于 2011-12-29T21:06:46.890 に答える
4

この特定の画像では、フルカラー空間で作業する必要はありませんが、代わりに強度のみで作業できます(HSVの「V」部分-「値」は強度を意味します)。

ここに画像の説明を入力してください

ペネロペが述べたように、値空間と色相空間のどちらを使用するかは、実際のオブジェクト用に作成する自然な画像によって異なります。一般的なケースでは、画像を適切にセグメント化するために、色相と明度(強度)の組み合わせを使用する必要がある場合があります。色相値のベクトル空間で作業するよりも、HとVの画像平面で別々に作業してから結果を組み合わせる方が簡単です。(3Dベクトル空間でのセグメント化は確かに可能ですが、このプロジェクトではおそらく不必要に複雑になります。)

OpenCVの分水界アルゴリズムは、ニーズにぴったりです。 http://www.seas.upenn.edu/~bensapp/opencvdocs/ref/opencvref_cv.htm

大津の二値化の方法に関する注意点:強度値(または色相値)のヒストグラムが二峰性分布である場合、2つのモードを分離することは問題ありませんが、自然画像の場合、真の二峰性分布を持つことは一般的ではありません。背景および/または前景のオブジェクトの強度および/または色相がオブジェクトの片側から別の側に変化する場合、大津はパフォーマンスが低下する可能性があります。

ゴンザレスとウッズによるデジタル画像処理やその他の教科書で説明されているように、大津は確かに複数のモードに拡張することができます。ただし、大津を使用して一度に1組のモードを分離した場合でも、背景のグラデーションによって問題が発生します。

また、カメラレンズがズームインまたはズームアウトした場合でも、同じ2値化しきい値が見つかるようにする必要があります。基本的な大津テクニックは、画像ヒストグラムのすべてのピクセルを使用します。つまり、画像内のすべてのピクセルをスクランブルして、元の画像と同じ画像ヒストグラムで純粋なノイズを生成でき、大津の方法では同じしきい値が生成されます。

一般的なトリックの1つは、エッジの近くのピクセルに依存することです。あなたの例では、画像を鋭いエッジ、鋭いコーナー、そして(うまくいけば)均一なHSV値を持つ領域と見なすことができます。エッジ付近のピクセルのサンプリングは、次のようないくつかの方法で実行できます。

  1. 強力なエッジポイントを見つけます(Cannyまたはより簡単な手法を使用)。エッジグラデーションの方向に沿って、エッジポイントから+/- Dの距離で、(相対)前景と(相対)背景のグレーレベルをサンプリングします。距離Dは、問題のオブジェクトのサイズよりもはるかに小さくする必要があります。
  2. 強いエッジポイントを見つけます。エッジポイント自体のグレーレベルを、おそらく望ましいしきい値の推定値として使用します。この例では、2つの強いピークでエッジアップします。1つはobject1とobject2の間のエッジで、もう1つはobject2とobject3の間のエッジです。

オブジェクトにはコーナーがあるため、それらを使用して、サンプリングに適したオブジェクトの境界やエッジピクセルを特定できます。

名目上長方形のオブジェクトがある場合は、ハフエッジまたはRANSACエッジアルゴリズムを使用して、画像内の線を識別したり、コーナーで交差点を見つけたりすることもできます。

とはいえ、オブジェクトが互いに積み重なっているほぼすべての自然な画像では、いくつかの問題が発生します。

  • 名目上一貫した色のオブジェクト全体の色と強度の勾配
  • オブジェクトが光学システムからさまざまな距離にある場合、さまざまなシャープネスのエッジ

存在するオブジェクトの数が確実にわかっている場合は、KMeans法を試すことができます。 http://aishack.in/tutorials/knearest-neighbors-in-opencv/

オブジェクトの数がわからない場合など、より複雑なセグメンテーションタスクの場合は、平均シフト手法を使用できますが、最初に単純な手法を試すことをお勧めします。

最初のステップで最も簡単な修正は、適切な照明を使用することです。反射と影を減らすには、拡散反射照明を使用します。多くのアプリケーションでは、理想的に拡散する照明に最も近いのは「曇りの日」の照明です。http: //www.microscan.com/en-us/products/nerlite-machine-vision-lighting/cdi-illuminators.aspx

もっと簡単に言えば、スタジオ撮影で使用されるような1つまたは複数の「バウンス」ライトを試すことができます。 http://www.photography.com/articles/taking-photos/bounce-lighting/

于 2011-12-30T16:00:34.190 に答える