Emgu / Opencv中的连接组件标签

时间:2014-03-10 13:07:25

标签: c# opencv computer-vision emgucv

我一直在寻找Emgu中的连接组件标记方法(OpenCV的c#包装器)。我没有找到这种基本CV策略的直接方法。但是,我确实遇到过很多使用FindContours和DrawContours但没有代码示例的建议。所以我去了它,似乎工作正常。

我放弃它有两个原因。

  1. 所以搜索它的人可以找到一个代码示例。
  2. 更重要的是,我想知道是否有关于此功能的优化和改进的建议。例如。 FindContours的链近似方法是否有效/合适?
  3.     public static Image<Gray, byte> LabelConnectedComponents(this Image<Gray, byte> binary, int startLabel)
        {
            Contour<Point> contours = binary.FindContours(
                CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, 
                RETR_TYPE.CV_RETR_CCOMP);
    
            int count = startLabel;
            for (Contour<Point> cont = contours;
                        cont != null;
                        cont = cont.HNext)
            {
                CvInvoke.cvDrawContours(
                binary,
                cont,
                new MCvScalar(count),
                new MCvScalar(0),
                2,
                -1,
                LINE_TYPE.FOUR_CONNECTED,
                new Point(0, 0));
                ++count;
            }
            return binary;
        }
    

1 个答案:

答案 0 :(得分:1)

我会使用以下内容:

   connected component labeling (AForge / Accord.NET ?)
   (although for many cases you will find it almost the same for the function that you wrote, give it a try to verify the results)

在此步骤之后,您可能会发现更多区域紧密且属于同一个人。 比你可以使用:        实施或搜索层次聚合聚类(HCA)的实施 结合近距离区域。

P.S .:  是FindContours高效/适当的链近似方法

如果您使用的是NO_APPROX,则不会使用近似的链码。通过使用它你可以获得非平滑的边缘(有许多小山丘和山谷),但如果这不打扰你,这个参数值是正常的。