Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 基于图像处理的直线跟随器_Opencv_Image Processing_Computer Vision_Edge Detection_Hough Transform - Fatal编程技术网

Opencv 基于图像处理的直线跟随器

Opencv 基于图像处理的直线跟随器,opencv,image-processing,computer-vision,edge-detection,hough-transform,Opencv,Image Processing,Computer Vision,Edge Detection,Hough Transform,我开始在一个直线跟随器项目上工作,但它要求我使用图像处理技术。我有一些想法要考虑,但我想输入一些,因为我想澄清一些疑惑。这是我解决这个问题的方法:我首先读取图像,然后应用阈值来检测对象(线)。我做颜色过滤,然后做边缘检测。在这之后,我开始进行图像分类以检测所有线条,然后外推这些线条以仅输出/检测平行线条(如车道检测算法)。利用这条平行线,我可以计算保持车辆居中的中心和转弯角度 我不知道路径中的角度,所以系统必须能够转动任何角度,这就是我将计算角度的原因。我已经包括了一张带转弯的线条图片,这就是我

我开始在一个直线跟随器项目上工作,但它要求我使用图像处理技术。我有一些想法要考虑,但我想输入一些,因为我想澄清一些疑惑。这是我解决这个问题的方法:我首先读取图像,然后应用阈值来检测对象(线)。我做颜色过滤,然后做边缘检测。在这之后,我开始进行图像分类以检测所有线条,然后外推这些线条以仅输出/检测平行线条(如车道检测算法)。利用这条平行线,我可以计算保持车辆居中的中心和转弯角度

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

任何想法都将不胜感激

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

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

(做一大堆代数)

靠近此点时,请切换线路

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

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

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

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

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

根据我的经验,当使用从图像中提取的线的浮点表示时,这些线实际上从来都不是平行的,它们通常在图像外的某个点相交(可能很远)

< > C++函数>代码> <行> <代码> >由< < 一行表示为,以下函数 构造两条直线的平分线
p
q

第p行是pa*x+pb*y+pc=0

第q行是qa*x+qb*y+qc=0

平分线的
a
b
c
是函数的最后三个参数:
a
b
c

在一般情况下,平分线具有向量的方向,该方向是两条直线的归一化方向之和,并且通过
p
q
的交点。如果
p
q
是平行的,则平分线定义为与
p
方向相同的线,且与
p
q
的距离相同(有关详细信息,请参阅官方CGAL文档)

m1 * x + b1 = m2 * x + b2
x  = (b2 - b1) / (m1 - m2)
(y should be the same for both line formulas)
x = f1(t1)
y = f2(t1)
x = f3(t2)
y = f4(t2)
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;
  }
}