C#opencv获取十字架交点

上篇文章的方法使用体验感很差,换图很不好调整参数得出对应线,图像倾斜更是凉凉

测了很多图才发现是我菜

最近突然想到用平均来计算,目前是能解决之前的问题

0和1.57是平行和垂直,根据这个范围来区分类型,这样来计算,线更贴近,也不用考虑其他的,只需要控制—+2-2那个

  List<LineSegmentPolar> cleanline(LineSegmentPolar[] lines)
  {
      for (int i = 0; i < lines.Length; i++)
      {
          if (lines[i].Rho < 0)
          {
              lines[i].Rho = -lines[i].Rho;
              lines[i].Theta = (float)(lines[i].Theta - Cv2.PI);
          }
      }
      List<LineSegmentPolar> res = new List<LineSegmentPolar>();
      List<LineSegmentPolar> h0 = new List<LineSegmentPolar>();
      List<LineSegmentPolar> hBig0 = new List<LineSegmentPolar>();
      List<LineSegmentPolar> hSmall0 = new List<LineSegmentPolar>();

      List<LineSegmentPolar> h157 = new List<LineSegmentPolar>();
      List<LineSegmentPolar> hBig157 = new List<LineSegmentPolar>();
      List<LineSegmentPolar> hSmall157 = new List<LineSegmentPolar>();

      //三种:小于0的,等于0的,大于0的肯定小于0.1
      //三种:小于1.57,等于1.57,大于1.57
      #region MyRegion
      float sumBig157Theta = 0;
      float sum157Theta = 0;
      float sumSmall157Theta = 0;

      float sum157Rho = 0;//
      float sumBig157Rho = 0;//
      float sumSmall157Rho = 0;//

      float sum0Theta = 0;
      float sumBig0Theta = 0;
      float sumSmall0Theta = 0;
      float sum0Rho = 0;
      float sumBig0Rho = 0;
      float sumSmall0Rho = 0;
      foreach (var item in lines)
      {
          if (item.Theta > 1 && item.Theta < 1.57)
          {
              hSmall157.Add(item);
              sumSmall157Theta += item.Theta;
              sumSmall157Rho += item.Rho;
          }
          if (item.Theta >= 1.58 && item.Theta < 2)
          {
              hBig157.Add(item);
              sumBig157Theta += item.Theta;
              sumBig157Rho += item.Rho;
          }
          if (item.Theta >= 1.57 && item.Theta < 1.58)
          {
              h157.Add(item);
              sum157Theta += item.Theta;
              sum157Rho += item.Rho;
          }

          if (item.Theta == 0)
          {
              h0.Add(item);
              sum0Theta += item.Theta;
              sum0Rho += item.Rho;
          }
          if (item.Theta < 0.2 && item.Theta > 0)
          {
              hBig0.Add(item);
              sumBig0Theta += item.Theta;
              sumBig0Rho += item.Rho;
          }
          if (item.Theta < 0 && item.Theta > -0.2)
          {
              hSmall0.Add(item);
              sumSmall0Theta += item.Theta;
              sumSmall0Rho += item.Rho;
          }
      }
      float avg157Theta = sum157Theta / h157.Count;
      float avgBig157Theta = sumBig157Theta / hBig157.Count;
      float avgSmall157Theta = sumSmall157Theta / hSmall157.Count;

      float avg157Rho = sum157Rho / h157.Count;
      float avgBig157Rho = sumBig157Rho / hBig157.Count;
      float avgSmall157Rho = sumSmall157Rho / hSmall157.Count;

      float avg0Theta = sum0Theta / h0.Count;
      float avgBig0Theta = sumBig0Theta / hBig0.Count;
      float avgSmall0Theta = sumSmall0Theta / hSmall0.Count;

      float avg0Rho = sum0Rho / h0.Count;
      float avgBig0Rho = sumBig0Rho / hBig0.Count;
      float avgSmall0Rho = sumSmall0Rho / hSmall0.Count;

      #endregion

      //判断数量  取出合适的线 h0  和h157是标准的,
      #region H0
      if (h0.Count == 1)
      {
          if (hSmall0.Count < hBig0.Count)
          {
              res.Add(h0[0]);
              //res.Add(new LineSegmentPolar(avgBig0Rho, avgBig0Theta));
              res.Add(new LineSegmentPolar(h0[0].Rho + 2, 0));
          }
          else
          {
              res.Add(h0[0]);
              //res.Add(new LineSegmentPolar(avgSmall0Rho, avgSmall0Theta));
              res.Add(new LineSegmentPolar(h0[0].Rho - 2, 0));
          }
      }
      if (h0.Count >= 2)
      {
          res.Add(h0[0]);
          res.Add(h0[1]);
      }
      if (h0.Count < 1)
      {
          if ((hSmall0.Count < hBig0.Count))
          {
              res.Add(new LineSegmentPolar(hSmall0[0].Rho, 0));
              res.Add(new LineSegmentPolar(hSmall0[0].Rho + 2, 0));

          }
          else
          {
              res.Add(new LineSegmentPolar(hBig0[0].Rho, 0));
              res.Add(new LineSegmentPolar(hBig0[0].Rho - 2, 0));
          }
          //res.Add(new LineSegmentPolar(avgBig0Rho, avgBig0Theta));
          //res.Add(new LineSegmentPolar(avgBig0Rho, 0));
          //res.Add(new LineSegmentPolar(avgSmall0Rho, avgSmall0Theta));
          //res.Add(new LineSegmentPolar(avgSmall0Rho, 0));
      }
      #endregion

      #region H157
      if (h157.Count == 1)
      {
          if (hSmall157.Count < hBig157.Count)
          {
              res.Add(h157[0]);
              //res.Add(new LineSegmentPolar(avgBig157Rho, avgBig157Theta));
              res.Add(new LineSegmentPolar(h157[0].Rho + 2, h157[0].Theta));
          }
          else
          {
              res.Add(h157[0]);
              //res.Add(new LineSegmentPolar(avgSmall157Rho, avgSmall157Theta));
              res.Add(new LineSegmentPolar(h157[0].Rho - 2, h157[0].Theta));
          }
      }
      if (h157.Count >= 2)
      {
          res.Add(h157[0]);
          res.Add(h157[1]);
      }
      if (h157.Count < 1)
      {
          if ((hSmall157.Count < hBig157.Count))
          {
              res.Add(new LineSegmentPolar(hSmall157[0].Rho, float.Parse("1.57")));
              res.Add(new LineSegmentPolar(hSmall157[0].Rho + 2, float.Parse("1.57")));

          }
          else
          {
              res.Add(new LineSegmentPolar(hBig157[0].Rho, float.Parse("1.57")));
              res.Add(new LineSegmentPolar(hBig157[0].Rho - 2, float.Parse("1.57")));
          }
          //res.Add(new LineSegmentPolar(avgBig157Rho, avgBig157Theta));
          //res.Add(new LineSegmentPolar(avgSmall157Rho, avgSmall157Theta));
      }
      #endregion
      return res;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值