python - 如何使用 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
解决方案
您可以假设图像是在相同条件下拍摄的。
您的主要问题是透明灯丝中的反射被检测为边缘。但是,由于图像比较简单,没有任何其他边缘,您可以简单地取上边缘和下边缘,并测量它们之间的距离。
一个简单的方法是取2条垂直线(例如图像边),找到与线相交的边缘(基本上遍历图像中的一列并找到边缘像素),并将最高点和最低点连接起来形成灯丝的边缘。这也消除了灯丝中的曲率,我认为您的应用不需要它。
您可能希望使用 3 或 4 条垂直线,以确保稳健性。
推荐阅读
- javascript - 当它已经完成以角度获取数据时如何一一显示数据
- apache-spark - 这些指标对 Spark Structured Streaming 意味着什么?
- php - 如何将一列数组写入csv文件
- windows - 在windows系统中安装pthread?
- c - GCC 链接器丢弃中断处理程序
- ios - unarchivedObject 数据时面临的问题
- json - 在 Swift 上为 firebase 获取数据快照中子项的值
- python-3.x - pymysql.err.OperationalError: (2006, "MySQL server has gone away (TimeoutError(110, 'Connection timed out'))")
- c# - System.Data.Entity.Core.Entity 命令执行异常
- mongodb - 将 JMeter 连接到 MongoDb 时出现问题:com.mongodb.CommandFailureException ... 身份验证失败