找到最大的轮廓 OpenCV

Posted

技术标签:

【中文标题】找到最大的轮廓 OpenCV【英文标题】:Find largest contours OpenCV 【发布时间】:2015-10-28 21:18:04 【问题描述】:

我使用了精巧的边缘检测,并在我尝试处理的图像上找到了轮廓。 我想找到五个最大的轮廓,然后看看图像中五个最大的轮廓内是否有轮廓。 这可能吗?我是 OpenCV 新手。

【问题讨论】:

您要查找内部 5 个最大的轮廓是否存在? 是的。我有五个瓶子的照片,我想看看瓶子上是否有标签。最大的轮廓勾勒出每个瓶子的轮廓,如果瓶子有标签,里面还有额外的轮廓。希望这是有道理的。 嗯,是的,这是有道理的。你能展示一下你到目前为止的尝试吗? 我现在不在电脑旁,但我的代码主要基于此处打开的 cv 代码中的源代码 docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/… 我在函数中添加了一个 for 循环以找到最大的轮廓.我不确定,但我想我必须以某种方式索引五个最大的轮廓。 发布了答案。您可以看到如何找到N 的最大轮廓,以及如何获取每个轮廓的内部轮廓。 【参考方案1】:

您可以找到N 最大的轮廓来检查它们的长度。您应该注意将参数CHAIN_APPROX_NONE 传递给findContours 以使其正常工作。

然后您可以检查每个蒙版内部是否有其他轮廓。

图片:

N = 5 最大轮廓,每个轮廓都有内轮廓。

代码:

#include <opencv2\opencv.hpp>
#include <vector>
#include <numeric>
using namespace cv;
using namespace std;


int main()

    Mat3b img = imread("path_to_image");

    Mat1b gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    Mat1b edges;
    Canny(gray, edges, 200, 50);

    vector<vector<Point>> contours;
    findContours(edges.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);

    vector<int> indices(contours.size());
    iota(indices.begin(), indices.end(), 0);

    sort(indices.begin(), indices.end(), [&contours](int lhs, int rhs) 
        return contours[lhs].size() > contours[rhs].size();
    );

    int N = 5; // set number of largest contours
    N = min(N, int(contours.size()));

    Mat3b res = img.clone();

    // Draw N largest contours
    for (int i = 0; i < N; ++i)
    
        Scalar color(rand() & 255, rand() & 255, rand() & 255);
        Vec3b otherColor(color[2], color[0], color[1]);

        drawContours(res, contours, indices[i], color, CV_FILLED);

        // Create a mask for the contour
        Mat1b res_mask(img.rows, img.cols, uchar(0));
        drawContours(res_mask, contours, indices[i], Scalar(255), CV_FILLED);

        // AND with edges
        res_mask &= edges;

        // remove larger contours
        drawContours(res_mask, contours, indices[i], Scalar(0), 2);

        for (int r = 0; r < img.rows; ++r)
        
            for (int c = 0; c < img.cols; ++c)
            
                if (res_mask(r, c))
                
                    res(r,c) = otherColor;
                
            
        
    

    imshow("Image", img);
    imshow("N largest contours", res);
    waitKey();

    return 0;

【讨论】:

以上是关于找到最大的轮廓 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

(有代码有案例)vs2019 opencv 找到图像最大轮廓用GrabCut算法进行图像分割

android如何在 java opencv 中查找最大轮廓

opencv查找轮廓后如何改变轮廓内的颜色C++

OpenCV跟踪轮廓将整个图像跟踪为最大轮廓?

opencv 轮廓的外围多边形提取或者删除最小最大轮廓

opencv 轮廓的外围多边形提取或者 删除最小最大轮廓