【问题标题】:How to sort contours from top to bottom : Opencv , Android如何从上到下对轮廓进行排序:Opencv,Android
【发布时间】:2018-05-31 23:51:17
【问题描述】:

我找到了轮廓,但问题是 findcontours() 以随机顺序返回轮廓,就像在轮廓(0) 处一样,它从页面中间显示了一些sontour。我怎样才能对它们进行垂直排序?从上到下,然后从左到右?鉴于下图,我水平连接组件并将每个 MCQ 与其选择连接,然后应用 findcontours() 现在我想按顺序对它们进行排序

【问题讨论】:

  • 只是一个建议,如果你试图检测那些在标准化图像上匹配的小圆圈位置模板应该会给你很好的结果。
  • @ivan_a 看不懂,能详细点吗?
  • 有用,但有时这些算法会抛出异常:stackoverflow.com/questions/53538333/…

标签: java android sorting opencv contour


【解决方案1】:

你有函数boundingRect:你可以找到围绕这些点的边界矩形的左上角点。然后,您可以定义一个排序函数,根据每个轮廓的该点的位置对轮廓进行排序。

【讨论】:

  • @HelpingDesk 它将返回一个Rect,它有不同的方法,如tl()(左上角)和br()(右下角)。
  • 我使用 boundingrect() 来裁剪区域,但不熟悉它的实际效果。你能帮忙写一些代码吗?
  • @HelpingDesk 很抱歉,我没有使用 Java 版本。事实上,这很棘手。或许this可以给你一点帮助。
  • 我对 Tl().x 有点困惑,你能解释一下吗?谢谢
  • @HelpingDesk 您能否编辑您的问题以更好地解释您获得的结果是什么以及您不明白什么?正如我所说,我没有使用 Java 接口的经验,所以我没有现成的答案。
【解决方案2】:

我也有同样的问题,用java的sort方法。

//sort by y coordinates using the topleft point of every contour's bounding box
    Collections.sort(contourList, new Comparator<MatOfPoint>() {
        @Override
        public int compare(MatOfPoint o1, MatOfPoint o2) {
            Rect rect1 = Imgproc.boundingRect(o1);
            Rect rect2 = Imgproc.boundingRect(o2);
            int result = Double.compare(rect1.tl().y, rect2.tl().y);
            return result;
        }
    } );


//sort by x coordinates
Collections.sort(contourList, new Comparator<MatOfPoint>() {
        @Override
        public int compare(MatOfPoint o1, MatOfPoint o2) {
            Rect rect1 = Imgproc.boundingRect(o1);
            Rect rect2 = Imgproc.boundingRect(o2);
            int result = 0;
            double total = rect1.tl().y/rect2.tl().y;
            if (total>=0.9 && total<=1.4 ){
                result = Double.compare(rect1.tl().x, rect2.tl().x);
            }
            return result;
        }
    });

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 2016-12-03
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2021-09-14
    • 2022-07-20
    • 2013-05-29
    相关资源
    最近更新 更多