3

Android Cardを使ってカード "マスターカード、ビザ、カッターカードなど"を検出するアプリケーションを開発しようとしています。そのために私はOpenCV4Androidバージョン3.0.0を使用しました。このタスクを達成するために、私は、次のでした:色に関係なく明確なエッジを得るには

1-フレーム

Imgproc.blur(this.mMatGray, this.mMatEdges, new Size(7, 7)); 

3-適用を使用してフレームをぼかす

Imgproc.cvtColor(this.mMatInputFrame, this.mMatGray, Imgproc.COLOR_BGR2GRAY); 

2-使用してグレースケールカメラから撮影した変換しましたキャニーエッジ検出器は以下のようになります。

4-実際の画像にCannyの結果が表示されます。以下

this.mDest = new Mat(new Size(this.mMatInputFrame.width(), this.mMatInputFrame.height()), CvType.CV_8U, Scalar.all(0)); 
this.mMatInputFrame.copyTo(this.mDest, this.mMatEdges); 

5は、以下のように検出されたカードの輪郭を見つける

dilated = new Mat(); 
Mat dilateElement = Imgproc.getStructuringElement(Imgproc.MORPH_DILATE, new Size(3, 3)); 
Imgproc.dilate(mMatEdges, dilated, dilateElement); 

6を使用して画像をdialated:

ArrayList<MatOfPoint> contours = new ArrayList<>(); 
hierachy = new Mat(); 
Imgproc.findContours(dilated, contours, hierachy, Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE); 

for (int i = 0; i < contours.size(); i++) { 
    if (Imgproc.contourArea(contours.get(i), true) > 90000) { 
     Rect rect = Imgproc.boundingRect(contours.get(i)); 

     if (rect.height > 60) { 
      Imgproc.rectangle(mMatInputFrame, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0)); 
      } 
    } 
} 

私はアプリケーションを実行 、

ケース1

「カード全体が同じ色で塗られている」検出されるカードが均質な色である場合、Cannyは画像「同じ色0」と同じ-color-1 "となります。 さらに、テーブル上に均一な色のカードを置き、カメラを動かすと、カメラを動かしているにもかかわらず、エッジが正しく検出されています。換言すれば、 カードの縁を囲む赤枠は常にエッジの周りに固定され、決してカードは混合の均一な色」でない場合

ケース2

を消滅さ「混色0」と「混色1」の画像に示すようにエッジ検出が悪く、また、カードの端を囲む赤枠が頻繁に消えてしまいます。 このケースから拡張されたもう1つのケースは、カードが2色のときに1つが明るく、1つが暗い場合です。この場合、エッジ検出器は画像のようにエッジが明確に定義されているため、 「混色2」

色に関係なくカードの明確な端およびカードサイズの端を取得する方法を教えてください。 エッジ検出のための他のより正確な方法はありますか?

同色-0

enter image description here

同色-1

enter image description here

混色-0

enter image description here

混色-1

enter image description here

混色-2

enter image description here

原画像

enter image description here

enter image description here

enter image description here

+0

[構造化エッジ検出](http://stackoverflow.com/a/33318560/5008845)を試すことができます。また、openCV4Androidバージョン3.0.0ではstructuredEdgeDetectionが利用できないようですね。 – Miki

+0

@Miki原画像投稿 – user2121

+0

@Mikiそのようなクラスはありません。情報があれば教えてください。 – user2121

答えて

1

あなたはStructured Edge Detectionを使用することができます。

私はthis my other answerのC++コードを実行しているこれらの結果を得ました。これは私にとって良い、頑強な結果のようです。

enter image description here enter image description here enter image description here

は、Javaでこれを使用するには、 構造エッジ検出はのcontribモジュール ximgprocであることを知っている必要があります。 OpenCVを再コンパイルする必要があります。 Build OpenCV with contrib modules and Java wrapper

+0

私はこのリンクをhttps://github.com/opencv/opencv_contrib/blob/master/README.mdで参照してビルドopencv contrib。 「余分なモジュールを使ってOpenCVをビルドする方法」の項で、$で始まるコマンドがあります。それは何ですか?それはWindowsの通常のcmdですか?? – user2121

+0

これはシェル、Linux、Windowsです...私は通常cmake-guiを使用していますが、もっと簡単になります – Miki

+0

2のと ""の違いは何ですか? – user2121

関連する問題