用 Python 和 OpenCV 检测图片上的条形码(2)

我们这里所做的是首先进行4次腐蚀(erosion),然后进行4次膨胀(dilation)。腐蚀操作将会腐蚀图像中白色像素,以此来消除小斑点,而膨胀操作将使剩余的白色像素扩张并重新增长回去。

如果小斑点在腐蚀操作中被移除,那么在膨胀操作中就不会再出现。

经过我们这一系列的腐蚀和膨胀操作,可以看到我们已经成功地移除小斑点并得到条形码区域。

用 Python 和 OpenCV 检测图片上的条形码

图5:应用一系列的腐蚀和膨胀来移除不相关的小斑点

最后,让我们找到图像中条形码的轮廓:

36 # find the contours in the thresholded image, then sort the contours

37 # by their area, keeping only the largest one

38 (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,

39  cv2.CHAIN_APPROX_SIMPLE)

40 c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]

41

42 # compute the rotated bounding box of the largest contour

43 rect = cv2.minAreaRect(c)

44 box = np.int0(cv2.cv.BoxPoints(rect))

45

46 # draw a bounding box arounded the detected barcode and display the

47 # image

48 cv2.drawContours(image, [box], -1, (0, 255, 0), 3)

49 cv2.imshow("Image", image)

50 cv2.waitKey(0)

 

38~40行:幸运的是这一部分比较容易,我们简单地找到图像中的最大轮廓,如果我们正确完成了图像处理步骤,这里应该对应于条形码区域。

43~44行:然后我们为最大轮廓确定最小边框

48~50行:最后显示检测到的条形码

正如你在下面的图片中所见,我们已经成功检测到了条形码:

用 Python 和 OpenCV 检测图片上的条形码

图6:成功检测到示例图像中的条形码

下一部分,我们将尝试更多图像。

成功的条形码检测

要跟随这些结果,请使用文章下面的表单去下载本文的源码以及随带的图片。

一旦有了代码和图像,打开一个终端来执行下面的命令:

$ Python detect_barcode.py --image images/barcode_02.jpg

用 Python 和 OpenCV 检测图片上的条形码

图7:使用OpenCV检测图像中的一个条形码

检测椰油瓶子上的条形码没有问题。

让我们试下另外一张图片:

$ python detect_barcode.py --image images/barcode_03.jpg

用 Python 和 OpenCV 检测图片上的条形码

图8:使用计算机视觉检测图像中的一个条形码

我们同样能够在上面的图片中找到条形码。

关于食品的条形码检测已经足够了,书本上的条形码怎么样呢:

$ python detect_barcode.py --image images/barcode_04.jpg

用 Python 和 OpenCV 检测图片上的条形码

图9:使用Python和OpenCV检测书本上的条形码

没问题,再次通过。

那包裹上的跟踪码呢?

$ python detect_barcode.py --image images/barcode_05.jpg

用 Python 和 OpenCV 检测图片上的条形码

图10:使用计算机视觉和图像处理检测包裹上的条形码

我们的算法再次成功检测到条形码。

最后,我们再尝试一张图片,这个是我最爱的意大利面酱—饶氏自制伏特加酱(Rao’s Homemade Vodka Sauce):

$ python detect_barcode.py --image images/barcode_06.jpg

用 Python 和 OpenCV 检测图片上的条形码

图11:使用Python和Opencv很容易检测条形码

我们的算法又一次检测到条形码!

总结

这篇博文中,我们回顾了使用计算机视觉技术检测图像中条形码的必要步骤,使用Python编程语言和OpenCV库实现了我们的算法。

算法概要如下:

计算x方向和y方向上的Scharr梯度幅值表示

将x-gradient减去y-gradient来显示条形码区域

模糊并二值化图像

对二值化图像应用闭运算内核

进行系列的腐蚀、膨胀

找到图像中的最大轮廓,大概便是条形码

需要注意的是,该方法做了关于图像梯度表示的假设,因此只对水平条形码有效。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8bf7e6d053879848d2e230522fdff393.html