计算距图像中心的最近点

时间:2017-01-18 18:13:33

标签: c#

代码执行此操作:

  1. 找到正方形

  2. 找到距图像中心最近的质心(按距离)

  3. 在图像上绘制最接近的方形质心(紫色)

  4. 问题: 我的问题是它在每个方格上画画所以它没有找到最接近的质心。 在两个正方形上绘制紫色圆圈

    CODE:

    double distancia_menor = double.MaxValue;
    
    using (MemStorage storage = new MemStorage()) //aloca espaço na memoria
    {
        //Procura contornos 
        for (Contour<System.Drawing.Point> contours = frame_drone_canny.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE, storage); contours != null; contours = contours.HNext)
        {
            Contour<System.Drawing.Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage); //AproxContour                       
    
            if (currentContour.Area > 3300/*currentContour.Area >= area_contornos_min.Value && currentContour.Area <= area_contornos_max.Value*/) //se a area estiver dentro dos valores das trackbars
            {
                if (currentContour.Total == 4) //se for retangulo/quadrado
                {
                    retangular = true;
    
                    pontos = currentContour.ToArray(); //pontos para array
                    LineSegment2D[] edges = PointCollection.PolyLine(pontos, true);
    
                    for (int i = 0; i < edges.Length; i++)
                    {
                        double angle = Math.Abs(edges[(i + 1) % edges.Length].GetExteriorAngleDegree(edges[i]));
    
                        if (angle < 75 || angle > 105) //Limitação do angulo para determinar se é quadrado ou nao
                        {
                            retangular = false; //não é quadrado
                            centroid = new Point(0, 0);
                            //posicao_atual = new PointF(0, 0);
                        }
                    }
    
                    if (retangular)
                    {
                        centroid.X = (int)currentContour.GetMoments().GravityCenter.x;
                        centroid.Y = (int)currentContour.GetMoments().GravityCenter.y;
    
                        double c = Math.Sqrt((Math.Pow(centroid.X - tamanho_imagem.X / 2, 2) + Math.Pow(centroid.X - tamanho_imagem.X / 2, 2)));
                        Debug.WriteLine(c);
                    }
                }
    
                if (c < distancia_menor)
                {
                    distancia_menor = c;
                    centroid_mais_proximo = new PointF(centroid.X, centroid.Y);
    
                    frame_drone_copia.Draw(new CircleF(new System.Drawing.PointF(centroid_mais_proximo.X, centroid_mais_proximo.Y), 1), new Bgr(Color.Purple), 17);
                }
            }
        }
    }
    

    图片:

    enter image description here

1 个答案:

答案 0 :(得分:0)

您正在测试这两种形状,并在更新最小值时绘制紫色圆圈。如果循环首先测试最接近的循环,它将只绘制正确的循环。但是,由于碰巧先测试的是更远的一个,它会画出两个圆圈。

更改代码以找到循环内最近的点并移动代码以在循环外绘制紫色圆圈。