我开始研究线跟随者项目,但我需要使用图像处理技术。我有一些想法需要考虑,但我想要一些意见,因为我想澄清一些疑问。这是我解决这个问题的方法:我首先读取图像,然后应用阈值来检测对象(线)。我进行颜色过滤然后进行边缘检测。在此之后,我开始进行图像分类以检测所有线,然后将这些线外推到仅输出/检测平行线(如车道检测算法)。通过这条平行线,我可以计算中心,以保持我的车辆居中和转弯的角度。
我不知道路径中的角度,所以系统必须能够转动任何角度,这就是我计算角度的原因。我已经包含了一个转弯线的图片,这是我要处理的那种转弯。我已经设法实现了几乎所有的东西。我的主要问题是角度的变化,基本上是转弯。在检测到平行线后,如何让我的系统知道什么时候转弯?问题可能有点令人困惑,但基本上,只要角度接近零,车辆就会向前移动。但是当车辆接近转弯时,它可能会检测到两组平行线。也许我可以定义检测线的长度,以确定车辆是否必须向前移动?
任何想法都将不胜感激。
答案 0 :(得分: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)
答案 1 :(得分:0)
基本上answer到Lou Franco解释了如何获得每条路径的两条中心线的交点,然后该路口是开始轮到你的好地方。
我会添加一个关于如何计算路径中心线的建议。
根据我的经验,当处理从图像中提取的线条的浮点表示时,这些线条实际上从不平行,它们通常只是在图像外部(可能很远)处相交。
以下C ++函数bisector_of_lines
的灵感来自于CGAL source code中找到的方法bisector_of_linesC2
。
一条线表示为a*x+b*y+c=0
,以下函数
构造两行p
和q
的平分线。
line p is pa*x+pb*y+pc=0
line q is qa*x+qb*y+qc=0
平分线的a
,b
,c
是函数的最后三个参数:a
,b
和{{1} }。
在一般情况下,平分线具有矢量的方向,该矢量的方向是两条线的归一化方向的总和,并且通过c
和p
的交点。如果q
和p
是平行的,则平分线被定义为与q
具有相同方向的线,与p
和{的距离相同{1}}(请参阅CGAL::Line_2<Kernel> CGAL::bisector
的官方CGAL文档。)
p