C# 求等高线间的最小距离

C# 求等高线间的最小距离,c#,opencv,C#,Opencv,我在图像中有许多形状,我想将它们的轮廓保存在数组中。 我的意思是,我想要数组1中形状1的轮廓坐标,数组2中形状2的轮廓坐标 如果有两个形状,我如何用它们的坐标在它们之间画出最短的线 例如,在对图像进行多次操作后,我得到了这个结果 找到等高线后: 因此,我需要每个形状轮廓的坐标来计算它们之间的最短距离,您可以参考这些坐标,以便从图像中检测轮廓 要查找两个形状的最小距离,请执行以下步骤: 找到要查找其最小距离的两个轮廓 在两个等高线中的每个点之间循环并找到它们之间的距离 通过比较所有其他距离获得

我在图像中有许多形状,我想将它们的轮廓保存在数组中。 我的意思是,我想要数组1中形状1的轮廓坐标,数组2中形状2的轮廓坐标

如果有两个形状,我如何用它们的坐标在它们之间画出最短的线

例如,在对图像进行多次操作后,我得到了这个结果

找到等高线后:

因此,我需要每个形状轮廓的坐标来计算它们之间的最短距离,您可以参考这些坐标,以便从图像中检测轮廓

要查找两个形状的最小距离,请执行以下步骤:

  • 找到要查找其最小距离的两个轮廓
  • 在两个等高线中的每个点之间循环并找到它们之间的距离
  • 通过比较所有其他距离获得最小距离,并标记该点

  • 下面是该算法的EMGUCV实现

    private void button2_Click(object sender, EventArgs e)
    {
        Image<Gray, byte> Img_Scene_Gray = Img_Source_Bgr.Convert<Gray, byte>();
        Image<Bgr, byte> 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<Point> 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<Point> a, Contour<Point> 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 = p.X - q.X;
        int Y_Diff = p.Y - q.Y;
        return Math.Sqrt((X_Diff * X_Diff) + (Y_Diff * Y_Diff));
    }
    
    private void按钮2\u单击(对象发送者,事件参数e)
    {
    Image Img_Scene_Gray=Img_Source_Bgr.Convert();
    Image Img_Result_Bgr=Img_Source_Bgr.Copy();
    LineSegment2D MinIntersectionLineSegment=新的LineSegment2D();
    Img_Scene_Gray=Img_Scene_Gray.ThresholdBinary(新灰度(10),新灰度(255));
    #区域查找等高线
    使用(MemStorage Scene\u ContourStorage=new MemStorage())
    {
    对于(等高线\u场景=Img\u场景\u灰色。FindContours(链\u近似\u方法。CV\u链\u近似\u简单,
    RETR\u TYPE.CV\u RETR\u EXTERNAL,Scene\u轮廓存储);轮廓线\u场景!=null;轮廓线\u场景=轮廓线\u场景.HNext)
    {
    如果(等高线\场景面积>25)
    {
    如果(等高线_Scene.HNext!=null)
    {
    最小间隔线(等高线\场景,等高线\场景.HNext,参考最小间隔线段);
    Img_结果Bgr.Draw(最小区间线段,新Bgr(颜色.绿色),2);
    }
    Img_结果_Bgr.Draw(轮廓线_场景,新Bgr(颜色.红色),1);
    }
    }
    }
    #端区
    imageBox1.Image=Img\u结果\u Bgr;
    }
    空隙最小截面线(等高线a、等高线b、参考线分段2D线)
    {
    双重正念=10000000;
    对于(int i=0;i

    谢谢,但我想将每个形状轮廓的坐标保存在单独的数组或列表中,以便比较它们并找到距离。请注意,我不知道这些形状是什么样的(矩形、三角形或任何其他形状)