gpt4 book ai didi

computer-vision - 边缘跟随摄像头

转载 作者:行者123 更新时间:2023-12-04 04:37:34 24 4
gpt4 key购买 nike

我想用一条跟随机器人的线跟随下图中最右边的边缘。

source9

我尝试了简单的“阈值处理”,但不幸的是,它包含模糊的白色光晕:

posterized9

I 阈值的原因是从 Sobel 边缘检测器获得一条干净的线:

edge9

有没有一个好的算法可以用来隔离这条边/沿着这条边移动?我目前使用的那个似乎容易出错,但它是迄今为止我能找到的最好的一个。

注:边缘可以在任何方向弯曲或对齐,但边缘上的点将始终非常靠近图像的中心。 Here's a video of what I'm trying to do.由于光环搞砸了阈值,它在 (1:35) 之后没有正确地跟随边缘。

这是另一个示例:

source6

posterized6

edge6

在这里,我填充最中心的边缘以将其与右下角的小凸起分开:

final6

最佳答案

最简单的方法(垂直线)

如果您知道您的图像在线条的右侧会有黑色,这里有一个简单的方法:

1) 应用Sobel 算子求x 方向的一阶导数。结果将是梯度最强的最负图像。 (使用较大的内核大小来平均光晕效果。您甚至可以先对图像应用高斯模糊,如果 7x7 内核不够用,则可以获得更多平均。)

2)对于图像的每一行,找到最小(即最负)值的索引。这是您对该行中行位置的估计。

3) 随心所欲。 (也许取图像上半部分和下半部分这些线位置的中值,以获得描述该线的 2 个点的估计值。)

稍微高级一点(任意行)

如果您不知道线的方向,但您知道它足够直,可以用直线近似,请使用此选项。

1)

dx = cv2.Sobel(grayscaleImg,cv2.cv.CV_32F,1,0,ksize=7)
dy = cv2.Sobel(grayscaleImg,cv2.cv.CV_32F,0,1,ksize=7)
angle = np.atan2(dy,dx)
magnitudeSquared = np.square(dx)+np.square(dy)

您现在拥有图像中每个点的角度(以弧度为单位)和梯度大小。

2)从这里您可以使用基本的 numpy 操作来查找线:过滤点以仅保留幅度平方 > 某个阈值的点。然后捕获最常见的角度(np.bincount() 对此很有用)。现在你知道你的线的角度了。

3)进一步过滤点,只保留接近该角度的点。您现在拥有线上的所有点。通过这些点的坐标拟合一条线。

最先进最脆(任意曲线)

如果你真的需要处理曲线,这里有一种方法:

1)使用上面的方法对图像进行阈值处理。手动调整阈值,直到白/黑划分大致发生在您想要的位置。 (可能 127 不是正确的阈值。但如果您的光照条件一致,您或许可以找到一个有效的阈值。确认它适用于多个图像。)

2) 使用 OpenCV 的 findcontours()将曲线拟合到白/黑边界。如果太波涛汹涌,请使用 approxPolyDP()来简化它。

关于computer-vision - 边缘跟随摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36781338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com