Emgu / Opencv中的连接组件标记



我一直在寻找Emgu (OpenCV的c#包装器)中连接组件标签的方法。对于这种基本的简历策略,我没有找到一个直接的方法。然而,我确实遇到了许多使用FindContours和DrawContours的建议,但没有代码示例。所以我试了一下,看起来效果不错。

我把它放在这里有两个原因。

  1. 所以人们搜索它可以找到一个代码示例。
  2. 更重要的是,我想知道是否有优化和改进这个功能的建议。例如,FindContours的链近似方法是否有效/合适?
    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;
    }

我将使用如下:

   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)的实现

注。FindContours的链式近似方法是否有效/合适

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

相关内容

  • 没有找到相关文章

最新更新