Python 检测机器人在作物行之间的路径

Python 检测机器人在作物行之间的路径,python,image,opencv,computer-vision,Python,Image,Opencv,Computer Vision,我正在研究一个问题,我需要找到机器人在不碰到任何作物行的情况下可以走的路径 我最初的方法是将其转换为鸟瞰视图,然后使用canny和骨架化技术。然后我应用Hough变换来生成裁剪行。当行是直的时,这种方法效果很好,但是如果我将图像旋转45度,我就找不到任何使用Hough变换的行。因此我决定使用另一种方法 首先,我只选择了绿色区域,并应用形态滤波器去除出现的小分枝 img = cv2.imread('''') min_green2 = np.array([45, 50, 50]) max_green

我正在研究一个问题,我需要找到机器人在不碰到任何作物行的情况下可以走的路径

我最初的方法是将其转换为鸟瞰视图,然后使用canny和骨架化技术。然后我应用Hough变换来生成裁剪行。当行是直的时,这种方法效果很好,但是如果我将图像旋转45度,我就找不到任何使用Hough变换的行。因此我决定使用另一种方法

首先,我只选择了绿色区域,并应用形态滤波器去除出现的小分枝

img = cv2.imread('''')
min_green2 = np.array([45, 50, 50])
max_green2 = np.array([75, 250, 250])
image_blur = cv2.GaussianBlur(img, (5, 5), 0)
image_blur_hsv = cv2.cvtColor(image_blur, cv2.COLOR_BGR2HSV)
image_green = cv2.inRange(image_blur_hsv, min_red2, max_red2)
se1 = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
se2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
mask = cv2.morphologyEx(image_green, cv2.MORPH_OPEN, se1)
我最终得到了这个

现在,我想检测机器人可以走的路径,即黑色区域。因此,只有第一行是我感兴趣的区域,我尝试了不同的方法在该行的中心画一条线,但在opencv中找不到任何帮助。我通过将图像垂直拆分为两个并使用cv2.fitline函数来获得一条线,成功地解决了这一问题连接行的一侧,并对行的另一侧执行相同的操作,最后我绘制了中心线。但这不是一个理想的方法,我觉得可能有一些opencv函数可以更好地完成此操作。是否有人可以帮助我或以正确的方式指导我

这是我正在寻找的最终输出

因此,以下是我使用numpy和scipy的方法,产生了以下结果:

在不进行任何模糊或形态学操作的情况下,使用Canny边缘检测器:

边缘=cv2.Cannyimage,100200,无,3,cv2.DIST_L2 请注意,大多数边围绕着机器人想要跟随的轨迹。由于每条边都是白色像素的集合,因此我们可以计算一列的总强度:

归一化=cv2.normalizeedges,无,alpha=0,beta=1,norm\u type=cv2.norm\u MINMAX 列强度=标准化。sumaxis=0 绘制结果,我们得到

如果我们要找到图的最小值,那么我们会找到x方向,在那里大部分边都被避免了。但是首先,让我们平滑函数以避免一些噪声

滑动平均平滑函数 窗口大小=30 window=np.oneswindow\u size,/window\u size 平滑=np.convolvecolumn\u强度,窗口,模式=有效 由于存在大量局部极小值,我们的附加约束是机器人应采取的x方向最接近图像中心

找到局部极小值的索引并选择最靠近中心的索引 索引=scipy.signal.ARGREMINSMOOTED[0] 距离=np.abs索引-intwidth/2 x=指数[np.Argmindistance] 现在我们有了x方向,我们需要确定一个y坐标,以便估计机器人旋转的角度tanangle=y/x。图像中有多少行就有多少选择,这意味着需要手动设置y坐标。如果我们选择一个离机器人更近的y轴,随着机器人的前进,角度将更不稳定。相反,如果我们选择一个远离机器人的y轴,那么它的波动性会更小,但精确度也会更低。这取决于你;最终图像是用y=400创建的

我希望这符合您的需要: