检测阈值区域

时间:2016-05-07 17:16:10

标签: c# wpf opencv emgucv

我有阈值图像:

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

1 个答案:

答案 0 :(得分:2)

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

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));
    }
}