当前位置: 首页 > 知识库问答 >
问题:

如何从上到下排序轮廓:Opencv,Android

赫连睿
2023-03-14

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

共有3个答案

丁俊智
2023-03-14

@user9876747解决方案非常适合小轮廓列表,但对于较大轮廓列表会引发以下异常。

java.lang.IllegalArgumentException: Comparison method violates its general contract!

因此,我能够将解决方案调整到下面的位置,它对大型轮廓列表很好。

 Collections.sort(contours, new Comparator<MatOfPoint>() {
        public int compare(MatOfPoint o1, MatOfPoint o2) {
            org.opencv.core.Rect rect1 = Imgproc.boundingRect(o1);
            org.opencv.core.Rect rect2 = Imgproc.boundingRect(o2);


            int result = Double.compare(rect1.br().y, rect2.br().y);
            double total = rect1.br().y / rect2.br().y;

            if (total < 1.1 && total > 1/1.1) {
                result = Double.compare(rect1.tl().x, rect2.tl().x);
            }
            return result;
        }
    });
阚通
2023-03-14

您有函数的边界Rect:您可以找到周围的点的边界矩形的topleft点。然后,您可以定义一个排序函数,根据每个轮廓的这个点的位置对轮廓进行排序。

牟嘉
2023-03-14

我有同样的问题,使用java的排序方法。

//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;
        }
    });
 类似资料:
  • 我有一个边缘被坎尼探测到。我想提取边缘的轮廓。 我已经检查了下面的帖子。OpenCV转换Canny边缘到轮廓。 但是它没有处理复杂的形状。例如,带矩形的圆或带线的圆。 cv::findContours()函数有两个问题。1.返回非闭合边的闭合轮廓,但我需要非闭合轮廓2。为闭合边返回2个闭合轮廓(可能其中一个轮廓用于边,另一个用于边的内侧,但我想要两个轮廓中的一个。 有没有办法解决这个问题?谢谢。

  • 目标 了解轮廓是什么。 学习查找轮廓,绘制轮廓等。 你将看到以下功能:cv.findContours(),cv.drawContours() 什么是轮廓? 轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测和识别的有用工具。 为了获得更高的准确性,请使用二进制图像。因此,在找到轮廓之前,请应用阈值或canny边缘检测。 从OpenCV 3.2开始

  • 我正在使用openCV检测图像中的矩形。在许多例子中,我使用阈值findContour约PolyDP。 如下图所示,我的问题是findContours找到的轮廓无法继续,因此在approxPolyDP之后,我无法获得矩形。。。 那么,你知道如何解决这个问题吗?谢谢你。:) 另一个问题:为什么轮廓是灰色的?在阈值之后,应该只有白色和黑色,不是吗? 轮廓 经批准

  • 基本上,我试图用一种颜色画出第一个轮廓。但此程序崩溃,出现以下错误: 09-11 09:56:38.390:D/DalvikVM(1920):GC_FOR_ALLOC释放170K,10%释放3702K/4100K,暂停4ms,共4ms 09-11 09:56:38.420:E/CV::error()(1920):OpenCV error:cv::mat cv::cvarrtomat(const C

  • 我想检查每个Canny检测到的边缘,并寻找其中的主线(以检查它们是否似乎形成矩形,例如,如果2对线是平行的等)。)。 Imgproc。HoughLinesP做了我想要的,但它给出了整个图像的线条,我想知道哪些线条来自相同的边缘。 我也尝试了FindContour,并用大约PolyDP在每个轮廓中寻找主线,但这看起来不合适,因为Canny检测到的边缘经常有缺口。这给出了边缘的轮廓,而不是边缘本身。

  • 我正在开发一个程序,提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于要删除任何非“方形”轮廓的位置。我想知道我怎么能做到这一点。 我所做的就是加载图像,使其变灰,模糊,精明的边缘检测,放大它,找到轮廓并绘制它们。 有没有一种方法可以让我在轮廓周围画出而不是填充它们?并删除周围大小不大致相同或几乎有90度角的轮廓? 这是初始图像: 以下是绘制轮廓的图像: