首页 > 解决方案 > 如何使用 OpenCV 检测物体的边缘

问题描述

我正在尝试使用 OpenCV 来测量灯丝的尺寸(用于 3D 打印的塑料材料)

我想做的是测量灯丝尺寸(用于 3D 打印的塑料材料)。这个想法是我使用 LED 面板照亮灯丝,然后用相机拍摄图像,预处理图像,应用边缘检测并计算它的大小。大多数细丝由一种颜色制成,易于预处理并获得良好的效果。

问题来自透明灯丝。我无法获得有用的结果。我想寻求一点帮助,或者是否有人可以向我推荐正确的方向。我已经尝试将图像裁剪到比灯丝高一点的高度,宽度只有几个像素,并使用这些图像中的像素数计算尺寸,但这并没有很好地工作。所以现在我在这里并尝试通过边缘检测来做到这一点

下面的代码适用于普通灯丝,问题是当我尝试将它用于透明灯丝时。我尝试过调整 Canny 函数的阈值。我尝试过不同的色彩空间。但我无法得到结果。

可能有助于理解的图片: https ://imgur.com/gallery/CIv7fxY

image = cv.imread("../images/img_fil_2.PNG")  # load image

gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)  # convert image to grayscale

edges = cv.Canny(gray, 100, 200)  # detect edges of image

标签: pythonopencvcomputer-vision

解决方案


您可以假设图像是在相同条件下拍摄的。

您的主要问题是透明灯丝中的反射被检测为边缘。但是,由于图像比较简单,没有任何其他边缘,您可以简单地取上边缘和下边缘,并测量它们之间的距离。

一个简单的方法是取2条垂直线(例如图像边),找到与线相交的边缘(基本上遍历图像中的一列并找到边缘像素),并将最高点和最低点连接起来形成灯丝的边缘。这也消除了灯丝中的曲率,我认为您的应用不需要它。

您可能希望使用 3 或 4 条垂直线,以确保稳健性。


推荐阅读