Recherche de la distance minimale entre les contours

J’ai beaucoup de formes dans l’image pour lesquelles je veux sauvegarder leurs contours dans des tableaux. Je veux dire que je veux les coordonnées des contours de la forme 1 du tableau 1, de la forme 2 du tableau 2 ext …

Et s’il y a deux formes, comment puis-je tracer la ligne la plus courte en utilisant leurs coordonnées?

par exemple, j’ai eu ce résultat après de nombreuses opérations sur une image

entrez la description de l'image ici

après avoir trouvé les contours:

entrez la description de l'image ici

J’ai donc besoin des coordonnées de chaque contour de forme pour calculer la distance la plus courte qui les sépare

Vous pouvez vous référer à ce lien et à ce wiki pour détecter les contours d’une image.

Pour trouver la distance minimale entre deux formes, procédez comme suit:

  1. Trouvez les deux contours pour lesquels vous voulez trouver la distance minimale qui les sépare.
  2. Parcourez chaque sharepoints deux contours et trouvez la distance qui les sépare.
  3. Prenez la distance minimale en comparant toutes les autres distances et marquez ces points.

Voici l’implémentation EMGUCV pour cet algorithme.

private void button2_Click(object sender, EventArgs e) { Image Img_Scene_Gray = Img_Source_Bgr.Convert(); Image Img_Result_Bgr = Img_Source_Bgr.Copy(); LineSegment2D MinIntersectionLineSegment = new LineSegment2D(); Img_Scene_Gray = Img_Scene_Gray.ThresholdBinary(new Gray(10), new Gray(255)); #region Finding Contours using (MemStorage Scene_ContourStorage = new MemStorage()) { for (Contour Contours_Scene = Img_Scene_Gray.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, RETR_TYPE.CV_RETR_EXTERNAL, Scene_ContourStorage); Contours_Scene != null; Contours_Scene = Contours_Scene.HNext) { if (Contours_Scene.Area > 25) { if (Contours_Scene.HNext != null) { MinIntersectionLine(Contours_Scene, Contours_Scene.HNext, ref MinIntersectionLineSegment); Img_Result_Bgr.Draw(MinIntersectionLineSegment, new Bgr(Color.Green), 2); } Img_Result_Bgr.Draw(Contours_Scene, new Bgr(Color.Red), 1); } } } #endregion imageBox1.Image = Img_Result_Bgr; } void MinIntersectionLine(Contour a, Contour b,ref LineSegment2D Line) { double MinDist = 10000000; for (int i = 0; i < a.Total; i++) { for (int j = 0; j < b.Total; j++) { double Dist = Distance_BtwnPoints(a[i], b[j]); if (Dist < MinDist) { Line.P1 = a[i]; Line.P2 = b[j]; MinDist = Dist; } } } } double Distance_BtwnPoints(Point p, Point q) { int X_Diff = pX - qX; int Y_Diff = pY - qY; return Math.Sqrt((X_Diff * X_Diff) + (Y_Diff * Y_Diff)); } 

entrez la description de l'image ici