ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android-如何获得轮廓分明的边缘而与颜色无关

2019-10-11 02:29:42  阅读:206  来源: 互联网

标签:edge-detection object-detection android opencv3-0 opencv4android


我正在尝试开发一个使用Android Camera来检测“万事达卡,签证,客户卡等”卡的应用,为此,我使用了OpenCV4Android 3.0.0版.为了完成此任务,我做了以下工作:

1-使用以下方法将从相机拍摄的帧转换为灰度

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

2-使用模糊帧

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

3-按如下方法使用Canny边缘检测器

Imgproc.Canny(this.mMatEdges, this.mMatEdges, 2, 900, 7, true);

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-找到检测到的卡的轮廓,如下所示:

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会产生边界清晰的边缘,可以很容易地检测出该边缘,如图像“ same-color-0”和“ same-color- 1\” .
此外,当我将同色的卡片放在桌子上并在周围移动相机时,即使我在移动相机,也可以正确检测到边缘.或换句话说,红色框包围
记忆卡始终固定在边缘,永不消失

情况2

如果卡的颜色不是“混合色”的同色,则边缘检测很差,如图像“ mixed-color-0”和“ mixed-color-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

解决方法:

您可以使用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

标签:edge-detection,object-detection,android,opencv3-0,opencv4android
来源: https://codeday.me/bug/20191011/1889459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有