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