【问题标题】:OpenCV : findcontours() , too much external contoursOpenCV:findcontours(),外部轮廓太多
【发布时间】:2017-05-24 23:52:25
【问题描述】:

我想找到苹果的所有轮廓,但是当我使用contours.size()时,轮廓的数量超过了苹果的数量。

以下是找轮廓的图和我在上面画轮廓的图,以及程序的结果。

enter image description here

这里是代码。

//Contours  
vector<vector<Point>> contours,hull;
vector<Vec4i> hierarchy;
RNG rng(12345);
findContours(con, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

cout<<"contours.size(): "<<contours.size()<<endl;
cout<<"hierarchy.size(): "<<hierarchy.size()<<endl;


//draw contours and calculate areas
int area[10];
int currentareaCounted = 0;

for(int i = 0; i<contours.size()-1; i++){

    Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0, 255), 255);
    drawContours(contoursImg, contours, i, color, 2, 8, hierarchy);

    Mat drawingMatCount = cv::Mat::zeros(src_color.rows,src_color.cols, CV_8UC1);
    drawContours(drawingMatCount, contours, i, 255, -1, 8);
    currentareaCounted = countNonZero(drawingMatCount);

    area[i]=currentareaCounted;


    cout<<i<<"'th area "<<" : "<<currentareaCounted<<endl;
}

我很困惑为什么 contous.size() 是 7。它让我在用来绘制轮廓的循环中使用了 contours.size()-1,否则程序会中断。

如果有人发现任何错误,希望告诉我。非常感谢。

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    首先,你必须找到boundRect,然后你可以像那个代码那样绘制轮廓

    for (int i = 0; i < validContours.size(); i++)
    {
            if (boundRect[i].area() < 50)continue;
    
            rectangle(fin, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);
        }
    

    【讨论】:

    • 感谢您的意见。我发现我找不到 boundRect ,而且我的 contours[i].size() 很奇怪。 contours[i].size() 是否代表第 i 个轮廓中的点数?如果是,我很困惑 contours.size() 会爆炸。第一个尺寸看起来不错,但是第二个或第三个尺寸爆炸了。就像下面一样。轮廓[0].size()=200,轮廓[1].size()=515,轮廓[2].size()=106128452
    • 不,我还没有解决。我不知道该怎么做。
    • 我用不同数量的苹果尝试了其他图片。然后我发现如果所有边缘都被正确捕获,就像左边的图片白色部分是苹果一样,小于或等于3的数字是正常的。这意味着它的 contours.size() 是正确的。但是如果数字大于 3 ,则 contours.size() 是正确的数字加 1。真是奇怪。
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2019-01-25
    • 2012-11-15
    • 2016-10-21
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多