我正在研究一个问题,我需要找到机器人可以采取的路径而不会碰到任何农作物行。 Raw Image
我最初的方法是将其转换为鸟瞰图,然后使用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)
我最终得到了这个Final_output
现在我想检测机器人可以走的黑色区域,所以只有第一行是我感兴趣的区域,我尝试了其他方法在行中心绘制一条线,但是在opencv中找不到任何帮助我确实设法通过将图像垂直分成两部分来解决问题,并使用cv2.fitline函数获得一条连接行的一侧的线,并与行的另一侧进行了相同的操作,最后我绘制了中心线。这不是一种理想的方法,我觉得可能会有一些opencv函数以更好的方式完成它。
这是我想要的最终输出
Final expected result with green color showing the center of path

最佳答案

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

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

edges = cv2.Canny(image, 100, 200, None, 3, cv2.DIST_L2)

请注意,大多数边缘围绕着机器人要遵循的轨迹。由于每个边缘都是白色像素的集合,因此我们可以计算列的总强度:
normalized = cv2.normalize(edges, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)
column_intensity = normalized.sum(axis=0)
绘制结果,我们得到
如果我们要找到图形的最小值,那么我们将找到x方向,其中避免了大多数边缘。但是首先,让我们对函数进行平滑处理以避免产生噪音。
# smooth function through moving average
window_size = 30
window = np.ones((window_size,)) / window_size
smoothed = np.convolve(column_intensity, window, mode="valid")

由于存在很多局部最小值,因此我们的附加约束是机器人应采用的x方向最接近图像中心。
# find indices of local minima and select the one closest to the center
indices = scipy.signal.argrelmin(smoothed)[0]
distances = np.abs(indices - int(width / 2))
x = indices[np.argmin(distances)]
现在我们有了x方向,我们需要确定y坐标,以便估计机器人应该旋转的 Angular (tan(angle)= y / x)。选择与图像中的行一样多,这意味着需要手动设置y坐标。如果我们选择一个更接近机器人的y,则随着机器人前进, Angular 将更加不稳定。相反,如果我们选择距离机器人较远的y,那么它的波动性较小,但准确性也较低。那取决于你;最终图像是使用y = 400创建的。
我希望这符合您的需求:)

关于python - 检测机器人可以在裁剪行之间采取的路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62923170/

10-13 03:26