【问题标题】:how to remove the background of a contour using OpenCV in Android?如何在 Android 中使用 OpenCV 去除轮廓的背景?
【发布时间】:2018-05-12 06:36:44
【问题描述】:

扫描的样本令牌:https://ibin.co/3irqGlxXezL3.jpg

输入图片:https://ibin.co/3irmfXKjYocz.jpg

Output Image

如您所见,我已经应用了 .submat,但我不确定为什么它会掩盖轮廓的内部而不是外表面。此外,过滤最大轮廓也不一致。关于如何根据票证的尺寸使其更健壮的任何想法,因为我的目标是扫描具有相同尺寸的票证。

作为一名新手 OpenCV 爱好者,我希望有人能指导我完成我在这里的最终任务,即从票证中的日历中获取年、月、日和时间,并以文本形式显示。

票上会有打孔作为标记。所以,我的想法是跟踪每个(孔)blob并将其与周围的数字一起提取,以了解它基于其周围的数字,并对所有具有某种层次结构的blob(孔)执行此操作知道提取是分别来自“年”字段还是月或日字段。或者还有其他更好的方法吗?

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    Mat srcMat = inputFrame.rgba();
    Mat processedMat = new Mat();
    Imgproc.cvtColor(srcMat, processedMat, Imgproc.COLOR_BGR2GRAY);
    Imgproc.GaussianBlur(processedMat, processedMat, new Size(3, 3), 0);
    Imgproc.threshold(processedMat, processedMat, 98, 255, Imgproc.THRESH_BINARY);
    List<MatOfPoint> contours = new ArrayList<>();
    Mat hierarchy = new Mat();
    Imgproc.findContours(processedMat, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    Log.e(TAG, "ContourSize: " + contours.size());
    double maxVal = 0;
    int maxValIdx = 0;
    for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
        double contourArea = Imgproc.contourArea(contours.get(contourIdx));
        if (maxVal < contourArea) {
            maxVal = contourArea;
            maxValIdx = contourIdx;
        }
    }
    Imgproc.drawContours(srcMat, contours, maxValIdx, new Scalar(0, 255, 0), -2);
    if (!contours.isEmpty()) {
        Log.e("largestContour", "" + contours.get(maxValIdx));
        Rect rect = Imgproc.boundingRect(contours.get(maxValIdx));
        srcMat.submat(rect);
    }
    return srcMat;
}

【问题讨论】:

    标签: java android opencv ocr


    【解决方案1】:

    嗯,

    首先,您使用的是drawContours 方法的重载版本。 负厚度表示将绘制填充的计数。

    因此,尝试将 -2 更改为正数以获得所需的轮廓。

    现在让我试着说一下我在机票上检测这些日期的第一种方法是什么:

    1) 使用透视变换将您的轮廓转换为垂直视图:

    在 Python 中查看此 example

    2) 使用 blob 检测来查找您的 blob:

    在 Python 和 C++ 中查看此 example

    如果您有一个定义良好的工单布局模型,它应该可以工作。

    【讨论】:

    • 我尝试将粗细更改为正数,通过这样做,它只勾勒出令牌,如下所示:ibin.co/3isRy2LSEwHn.png 并且没有分离背景,我想这是向前迈出的第一步因为我必须将令牌分开才能应用其余部分。
    • 是的。正如预期的那样。绘图功能仅用于向您反馈有关轮廓区域的信息。现在,尝试使用 poligons 来实现所需的顶点docs.opencv.org/3.3.1/dd/d49/tutorial_py_contour_features.html,然后应用透视变换。
    • 我无法在 java 中找到教程或示例供我使用,也无法找到我的 Python 示例。是否有某种尺寸过滤器可以应用于我的令牌轮廓以使其更加一致,现在它会移动位置并绘制不均匀和不完整的轮廓,你能帮我掩蔽以使图像的其余部分模糊吗或使令牌从背景中弹出的东西。而且我很难应用透视变换从图像中裁剪标记以进行进一步处理....
    • 我仍然很难将扭曲感知应用于令牌轮廓,但是我已经设法使用 submat 裁剪令牌,尽管它也给出了相邻区域,因为它正在裁剪矩形作为正方形。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2011-09-07
    • 2014-08-23
    • 1970-01-01
    • 2021-07-27
    • 2016-09-25
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多