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

查找并消除轮廓opencv

益泰平
2023-03-14

我正在开发一个程序,提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于要删除任何非“方形”轮廓的位置。我想知道我怎么能做到这一点。

我所做的就是加载图像,使其变灰,模糊,精明的边缘检测,放大它,找到轮廓并绘制它们。

有没有一种方法可以让我在轮廓周围画出而不是填充它们?并删除周围大小不大致相同或几乎有90度角的轮廓?

public static void main(String[] args) {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

    Mat capturedFrame = Imgcodecs.imread("first.png");

    //Gray
    Mat gray = new Mat();
    Imgproc.cvtColor(capturedFrame, gray, Imgproc.COLOR_BGR2GRAY);

    //Blur
    Mat blur = new Mat();
    Imgproc.blur(gray, blur, new Size(3,3));
    //Canny image
    Mat canny = new Mat();
    Imgproc.Canny(blur, canny, 20, 40, 3, true);

    Imgcodecs.imwrite("test.png", canny);

    //System.exit(0);
    Mat kernel = Imgproc.getStructuringElement(1, new Size(3,3));
    Mat dilated = new Mat();
    Imgproc.dilate(canny,dilated, kernel);

    List<MatOfPoint> contours = new ArrayList<>();
    //find contours
    Imgproc.findContours(dilated, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE);
    //draw contours

    Imgproc.cvtColor(capturedFrame, capturedFrame, Imgproc.COLOR_BGR2RGB);
    for(int i = 0; i < contours.size(); i++){
        Imgproc.drawContours(capturedFrame, contours, i, new Scalar(0, 0, 255), -1);
    }

    Imgcodecs.imwrite("after.png", capturedFrame);

    Imshow img = new Imshow("firstImg");    
    img.show(capturedFrame);
}

这是初始图像:

以下是绘制轮廓的图像:

共有1个答案

赫连法
2023-03-14

要绘制未填充的轮廓,请使用非负厚度:我mgproc.draw轮廓(capuredFrame, contour, i, new Scalar(0, 0, 255), 1);例如。

要删除不必要的查找轮廓区域,只需在绘制时跳过过大或过小的轮廓区域即可。

 类似资料:
  • 我想,我很理解函数“cv2.FindOntours(图像、模式、方法)。但我在opencv的一个文档中得到了这个东西轮廓,层次=cv2.FindOntours(thresh,2,1)。我不明白这里2,1的含义以及为什么使用它们。请有人解释一下。

  • 本文向大家介绍如何使用Java OpenCV库查找图像轮廓?,包括了如何使用Java OpenCV库查找图像轮廓?的使用技巧和注意事项,需要的朋友参考一下 轮廓线不过是连接沿着特定形状的边界的所有点的线。使用这个你可以- 查找对象的形状。 计算对象的面积。 检测物体。 识别对象。 您可以使用findContours()方法找到图像中各种形状的轮廓,对象。此方法接受以下参数- 二进制图像。 类型为M

  • 我试图找到使用opencv findcontour的轮廓,但一些轮廓丢失了一个相当简单的图像。图像是在create_mat()函数中创建的,在rbt中使用findcontour。我曾尝试改变模式findcontour使用:CV_RETR_EXTERNAL,CV_RETR_LIST...我都试过了,改变方法:CV_CHAIN_APPROX_NONE...... opencv版本是3.3 我也尝试过先

  • 主要内容:1. outline-style,2. outline-width,3. outline-color,4. outline,5. outline-offset轮廓(outline)是绘制于元素周围的一条线,位于边框的外围(紧贴着边框),主要用来突出显示某个元素,如下图所示: 图:轮廓(outline) 轮廓和边框看起来非常相似,但它们之间也并非没有区别,例如: 元素上下左右四个方向上边框的样式、宽度、颜色可以单独设置,而轮廓在元素四个方向的宽度、样式、颜色都是相同的,不能单独设置; 边

  • 我有2个URL,其中1个特定于Dev,另一个特定于Prod。我也在使用Spring profiling,其中我有一个单独的文件用于Dev和Prod application-Dev。性能和应用-prod。属性和我的应用。对于Dev env,属性文件如下所示 spring.profiles.active=dev 现在在我的java代码中,我想有一个属性,它将根据我使用的Spring配置文件绑定到适当的

  • 我正在做一个应该作为地平线探测的项目。我使用精明的边缘和轮廓进行地平线检测。它工作得很好,但是我对边缘的小区域有问题 所以问题是,如何摆脱小面积的边缘/轮廓?或者我如何只显示一个最大的轮廓? 以下图片显示了它的外观: http://i.stack.imgur.com/f4USX.png 这张照片是用轮廓上的小区域拍摄的,我需要消除这些区域: http://i.stack.imgur.com/TQi