【问题标题】:Line Follower based on Image Processing基于图像处理的线跟随器
【发布时间】:2018-02-20 15:38:13
【问题描述】:

我开始从事线路跟随项目,但我需要使用图像处理技术。我有一些想法要考虑,但我想提出一些意见,因为我想澄清一些疑问。这是我解决这个问题的方法:我首先读取图像,然后应用阈值检测对象(线)。我进行颜色过滤,然后进行边缘检测。在此之后,我开始进行图像分类以检测所有线条,然后推断这些线条以仅输出/检测平行线(如车道检测算法)。使用这条平行线,我可以计算中心以保持我的车辆居中以及转弯的角度。

我不知道路径中的角度,所以系统必须能够转动任何角度,这就是我要计算角度的原因。我已经附上了一张带转弯的线的图片,这就是我将要处理的那种转弯。我已经设法实现了几乎所有东西。我的主要问题是角度的变化,基本上是转弯。检测到平行线后,如何让系统知道何时该转弯?这个问题可能有点令人困惑,但基本上只要角度接近零,车辆就会向前移动。但是当车辆接近转弯时,它可能会检测到两组平行线。也许我可以定义检测到的线的长度,以定义车辆是否必须向前移动?

任何想法将不胜感激。

【问题讨论】:

    标签: opencv image-processing computer-vision edge-detection hough-transform


    【解决方案1】:

    如果你有两条线(每条路径的中心线):

    y1 = m1 * x + b1
    y2 = m2 * x + b2
    

    当您选择一个 x 使得 y1 和 y2 相等时,它们相交(如果它们当然不平行,那么 m1 != m2)

    m1 * x + b1 = m2 * x + b2
    

    (做一堆代数)

    x  = (b2 - b1) / (m1 - m2)
    (y should be the same for both line formulas)
    

    当你接近这个点时,换线。

    注意:这不会处理完全垂直线的情况,因为它们有无限的斜率,并且没有 y 截距 - 参见parametric form of lines。每行有 2 个方程:

    x = f1(t1)
    y = f2(t1)
    

    x = f3(t2)
    y = f4(t2)
    

    设置f1(t1) == f3(t2)f2(t1) == f4(t2) 查找非平行线的交点。然后将t1代入第一行公式即可找到(x, y)

    【讨论】:

      【解决方案2】:

      基本上Lou Francoanswer 向您解释了如何获得每条路径的两条中心线的交点,然后该交点是开始转弯的好点。

      我会添加一个关于如何计算路径中心线的建议。

      根据我的经验,在处理从图像中提取的线的浮点表示时,这些线实际上永远不会平行,它们通常只是在图像外的一点相交(可能很远)。

      以下 C++ 函数 bisector_of_lines 的灵感来自 CGAL source code 中的方法 bisector_of_linesC2

      一行表示为a*x+b*y+c=0,如下函数 构造pq 两条线的平分线。

      line p is pa*x+pb*y+pc=0

      line q is qa*x+qb*y+qc=0

      平分线的abc是函数的最后三个参数:abc

      在一般情况下,平分线的向量方向是两条线的归一化方向之和,并且通过pq的交点。如果pq 平行,则平分线定义为与p 方向相同且与pq 距离相同的直线(参见CGAL 官方文档为CGAL::Line_2<Kernel> CGAL::bisector)。

      void
      bisector_of_lines(const double &pa, const double &pb, const double &pc,
                  const double &qa, const double &qb, const double &qc,
                  double &a, double &b, double &c)
      {
        // We normalize the equations of the 2 lines, and we then add them.
        double n1 = sqrt(pa*pa + pb*pb);
        double n2 = sqrt(qa*qa + qb*qb);
        a = n2 * pa + n1 * qa;
        b = n2 * pb + n1 * qb;
        c = n2 * pc + n1 * qc;
      
        // Care must be taken for the case when this produces a degenerate line.
        if (a == 0 && b == 0) {// maybe it is best to replace == with https://stackoverflow.com/questions/19837576/comparing-floating-point-number-to-zero
          a = n2 * pa - n1 * qa;
          b = n2 * pb - n1 * qb;
          c = n2 * pc - n1 * qc;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2012-07-26
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多