2011-06-12 21 views
15

私は形状検出のための小さなアプリケーションを書いています。私が最初にやるべきことは、画像上で最も重要な形を見つけることです。私は、画像をグレースケール、スレッシュホールド、エッジ検出に変換するなど、いくつかの前処理から始めました。あなたがメインの形状が表示されて見ることができるように、これらの操作の前と後の画像は、(それが少し散乱されるが形状検出 - OpenCVによる等高線近似

ので

enter image description here

enter image description here

の下に提示されます)、いくつかの騒音(小さな木など)もあります。私がする必要があることは、何とか最も重要な形状(最大のもの)のみを抽出することです。この場合はタワーです。 私がやりたかったのは、opencvの輪郭検索機能を使用して、何らかの形で近似したポリゴンの輪郭を見つけ出すことでした。それで私は(何とか)カウンターの面積を計算し、最大のものだけを選択します。 は、これまでのところ私は(のみ)を使用して輪郭を見つけることがうまく管理

cvFindContours(crated,g_storage,&contours); 

私はしかし、私は、この関数の結果のための任意の便利な情報を取得することはできませんよ、

cvApproxPoly 

機能があることを知っています。 輪郭の面積を計算したり、多角形で近似することが可能かどうか、誰かに教えてもらえますか?たぶん、最も重要な形状のみを抽出する方が良いアイデアですか?

答えて

5

あなたの主な問題は、塔の輪郭が散在していることです。それらの小さな部分から全体の輪郭を再現するのは難しいでしょう。あなたは一枚であなたの輪郭を持っていたら、このようにそのエリアを確認することができます

object segmentation多分何かのように)あなたのエッジ検出フェーズを最適化(cvAdaptiveThresholdを試してみてください)、または異なるアプローチを使用します。

CvSeq* convex_hull=cvConvexHull2(contour, storage, CV_CLOCKWISE, 2); 
CvSeq* quad=cvApproxPoly(convex_hull, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0); 
float size=fabs(cvContourArea(quad,CV_WHOLE_SEQ,0)); 

あなたはしますパラメータを調整する必要があります。これは長方形を検出するために使用されました。

8

ここでエッジ検出を行う必要はありません。バイナリイメージのしきい値にして、その上でブロブ(cvFindContours)を見つけます。返された各CvSeqでcvContourAreaを使用して、その領域を見つけることができます。

2

「輪郭ノイズ」(ケースの膨張)を抑えるために、形態学的操作を使用することができます。しかし、形態学的操作の使いやすさは現在の課題に依存することを覚えておく必要があります。たとえば、2つのオブジェクトが互いに接近して配置されている場合、それらから1つのオブジェクトを拡張できます。

6

あなたは常に制御バックグラウンドを持っている場合(@damianによっても示唆されているように)、私はこれらのステップのために行くだろう:

  1. 値化、すなわち、このような背景= 0として画像を作成しますオブジェクト領域= 1(または255)。その後、イメージ上に複数の白い領域が表示されます。これを行うにはいくつかの方法がありますが、背景が制御されている場合は固定のしきい値を使用できます。ここでは、オブジェクト内のノイズを除去したことに注意してください。バイナリイメージでは、オブジェクトを滑らかにするために、形態学的な開閉をいつでも使用できます。
  2. cvFindContoursを使用すると、すべてのオブジェクトを見つけることができます。
  3. cvFloodFillを使用して、より小さな輪郭を背景色で塗りつぶします。
+0

バイナリゼーションプロセスのアドオンとして。良いしきい値を見つけることは常に困難です。私はいつもヒソグラムを計算し、「低点」を探します。そこには通常、ネイバーのしきい値があります。 JPEGを使用している場合、この方法はあまりうまくいかないかもしれません。 –

関連する問題