我一直在寻找Emgu(OpenCV的C#包装器)中用于连接组件标签的方法。我没有找到这种基本的简历策略的直接方法。但是,我确实遇到了许多使用FindContours和DrawContours进行操作的建议,但没有代码示例。因此,我尝试了一下,看来效果还不错。

我将其放在此处的原因有两个。

  • 因此,搜索它的人们可以找到一个代码示例。
  • 更重要的是,我想知道是否有关于此功能的优化和改进的建议。例如。 /适用于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,则不会使用链码的近似值。通过使用此功能,可以得到不平滑的边缘(具有许多小的山丘和山谷),但如果这样不打扰您,则此参数值就可以了。

    关于c# - Emgu/Opencv中的连接组件标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22301008/

    10-10 13:38