【问题标题】:Detecting threshold area(s)检测阈值区域
【发布时间】:2016-09-02 15:40:18
【问题描述】:

我有阈值图像:

我想知道,我可以检测“白色区域”并在它们周围绘制矩形(还需要保存数据)
或者我可以画出平行六面体(多边形)并且“说”里面的区域是白色的吗?
谢谢。

【问题讨论】:

    标签: c# wpf opencv emgucv


    【解决方案1】:

    所以为了检测白色区域,只需获取图像的轮廓即可。这可以通过以下方式完成:

    vector<vector<Point>>contours;
    vector<Vec4i> hierarchy;
    findContours(blackWhiteImage,
        contours,
        hierarchy,
        CV_RETR_TREE,
        CV_CHAIN_APPROX_SIMPLE,
        Point(0,0));
    

    然后,您可以生成近似边界框,用于模拟您提取的每个轮廓:

    vector<vector<Point> > contours_poly( contours.size() );
    vector<Rect> boundRect( contours.size() );
    for( int i = 0; i < contours.size(); i++ ){
       approxPolyDP( Mat(contours[i]),
           contours_poly[i],
           3,
           true );
           //3 is epsilon tuning param for bias-variance trade off
           //true denotes contours are closed
    
       boundRect[i] = boundingRect( Mat(contours_poly[i]) );
    }
    

    完成此操作后,您可以访问 boundingRect 数组中的 boundingRect 对象,就像访问任何其他数组一样。

    EmguCV (C#) 无近似值的模拟代码:

    VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
    Mat hierarchy;
    
    CvInvoke.FindContours(binMat, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
    
    for (int i = 0; i < contours.Size; ++i)
    {
        if (CvInvoke.ContourArea(contours[i]) > 8)
        {
            Rectangle rc = CvInvoke.BoundingRectangle(contours[i]);
            CvInvoke.Rectangle(srcMat, rc, new MCvScalar(0, 0, 255));
        }
    }
    

    【讨论】:

    • 什么是 contours_poly? Mat(...) 也一样
    • Mat(...) 正在构造一个 cv::Mat 实例,以便我们可以将正确类型的参数传递给 boundingRect 构造函数。另外,我最初不包括contours_poly的初始化是不好的。它只是一个保存从 approxPolyDP 获得的近似多边形的变量,以便我们可以使用它们来构造矩阵以传递给 boundingRect 构造函数
    • 好的。我使用您的示例在 c# 中编写了一些代码。我想我会接受你的回答。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 2017-07-05
    • 2014-06-08
    • 2015-05-30
    • 2014-06-15
    • 2013-12-01
    • 2011-09-04
    • 2011-02-18
    相关资源
    最近更新 更多