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:
同色-1
混色-0
混色-1
混色-2
原画像:
[構造化エッジ検出](http://stackoverflow.com/a/33318560/5008845)を試すことができます。また、openCV4Androidバージョン3.0.0ではstructuredEdgeDetectionが利用できないようですね。 – Miki
@Miki原画像投稿 – user2121
@Mikiそのようなクラスはありません。情報があれば教えてください。 – user2121