2011-10-16 12 views
5

アンドロイド携帯電話で写真を撮ったら、その中のオブジェクトをクリックして特定したいと思います。ほとんどの場合、可能なオブジェクト:
1.ルーラー
2人
3.鉛筆
、私はAndroidのビルド済み-OpenCVのバージョン2.3.1を使用していると私は定規オブジェクトにクリックして、それをマークすることをFLOODFILLしようとしました輪郭が閉じていない場合は、画像全体が塗りつぶされます。
a)私はルーラーオブジェクトをクリックして、南、北、東、西に行き、エッジがどこにあるか調べて、これらの座標を収集しようとしましたが、重い問題が発生しました(質問しません)。オブジェクト検出android opencv

質問:
1.希望のオブジェクトをちょうど埋めるように輪郭を何とか閉じることはできますか?
2.私が実際に見つけたいのは、底部の座標と、ルーラーの高さ(例えば)です。
他の解決策があります。どのようにそれを実現しますか?

更新:私はこの問題をa)で修正し、現時点でこのアプローチを使用しています(幸せではありません)。私はEntrecoのアプローチも試しましたが、今は欲しい解決策を提示していないようです。

答えて

6

これを試してもわかりませんが、通常は画像を最初に処理してより良い結果を得ることができます。

1)ノイズ

2)AdaptiveThreshold適用を除去するGuassianBlurを適用 - >を使用することにより、クラック

を埋めるために、Dilate適用

3)黒と白の操作に画像を変換しますAdaptiveThresholdとDilate操作の設定が異なると、閉じた輪郭を得ることができます。

私が使用した例は、次のとおりです。

// 1) Apply gaussian blur to remove noise 
Imgproc.GaussianBlur(mGraySubmat, mIntermediateMat, new Size(11,11), 0); 

// 2) AdaptiveThreshold -> classify as either black or white 
Imgproc.adaptiveThreshold(mIntermediateMat, mIntermediateMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 5, 2); 

// 3) Invert the image -> so most of the image is black 
Core.bitwise_not(mIntermediateMat, mIntermediateMat); 

// 4) Dilate -> fill the image using the MORPH_DILATE 
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3,3), new Point(1,1)); 
Imgproc.dilate(mIntermediateMat, mIntermediateMat, kernel); 
+0

@Entrecoさんのお返事ありがとうございます。私はこれを試して報告します。 – gartenabfall

+0

@Entrecoは、閉じた輪郭を囲む矩形を描くことができます –

+0

黒い矩形オブジェクトの場合はエッジを検出しません。 –