图像计数线

时间:2018-05-02 08:37:38

标签: opencv

我计划在Raspberry pi 3上使用Opencv和相机来计算下图中的线条 enter image description here

它将用于生产线程的机器中。如果一个(或多个)丢失,它将停止机器。

现在我想知道怎么做......?

  1. 我将循环捕获图像
  2. 我将裁剪图像以仅查看带有线条的部分
  3. 我会将其转换为黑色和白色
  4. 怎么算他们?在循环中 - 检查像素值的变化?或者有一个更好/更快的想法?
  5. 感谢您的建议!

    修改

    P.S。 我使用了cv2.findContours(来自Jeru Luke的回答)。 我在相机前面放了一张带有黑线的A4纸。我在循环中工作正常但是...我在表格上有43行。当相机检测到一些差异时,我将结果写入文件。有时我有710,800,67等。

    请使用https://www.dropbox.com/s/jnn4w8mq3rrtppo/bledy.txt?dl=0

    的值查看文件

    行....错误是permanet几秒钟。当我有43,43,43,43,44,43,43,43(一个是错的)时,Tere注意到了wronge因为我在错误之前看了几个值。但是,当数百个不好的价值观我不知道......

2 个答案:

答案 0 :(得分:1)

使用 Hough Lines Transform 来检测线条,并计算您找到的计数。

这里有一个关于你的问题的教程(因为你没有指定语言,这是在python中)。

OpenCV Tutorial Hough Lines

答案 1 :(得分:1)

我有一些比较简单的东西。它不涉及任何for循环因此需要更少的时间。在找到合适的阈值后,我使用了计算图像轮廓的概念。我通过反复试验找到了完美的门槛。

我在python中有这个方法:

import cv2

path = 'C:/Users/Desktop/stack/contour/'
img = cv2.imread(path + 'lines.png', 0)
cv2.imshow('original Image', img)

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('thresh1', thresh)

_, contours, hierarchy =    cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print('Number of lines:', len(contours))

cv2.waitKey(0)
cv2.destroyAllWindows()

注意:

  1. 如您所见,没有涉及for个循环。也不需要计算像素变化的数量。每个假定的线都变成轮廓。使用`len(等高线)可以获得存在的行数。
  2. 使用Hough Line变换只能在线条笔直的情况下才能正常工作。由于所提供图像中的线条是倾斜的,因此无法找到完美的线条。 @MarkSetchell的评论更加强调了这一说法。