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
après avoir trouvé les contours:
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:
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)); }