翼度科技»论坛 编程开发 python 查看内容

【Python】【OpenCV】定位条形码(一)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
先上代码:
  1. 1 def barcode(image):
  2. 2     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  3. 3     blur = cv2.GaussianBlur(gray, (5, 5), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  4. 4     cv2.imshow('GaussianBlur', blur)
  5. 5     kernel_x = numpy.array([
  6. 6         [-1, 0, 1],
  7. 7         [-2, 0, 2],
  8. 8         [-1, 0, 1]
  9. 9     ])
  10. 10     kernel_y = numpy.array([
  11. 11         [-1, -2, -1],
  12. 12         [0, 0, 0],
  13. 13         [1, 2, 1]
  14. 14     ])
  15. 15     x = cv2.filter2D(blur, -1, kernel_x)
  16. 16     y = cv2.filter2D(blur, -1, kernel_y)
  17. 17     cv2.imshow('Sobel', x)
  18. 18     _, threshold = cv2.threshold(x, 127, 255, cv2.THRESH_BINARY)
  19. 19     kernel = numpy.ones((3, 3), numpy.uint8)
  20. 20     r_e = cv2.erode(threshold, kernel, iterations=1)
  21. 21     r_d = cv2.dilate(r_e, kernel, iterations=10)
  22. 22     contours, hir = cv2.findContours(r_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  23. 23     max_contour = numpy.array(max(contours, key=cv2.contourArea))
  24. 24     x, y, w, h = cv2.boundingRect(max_contour)
  25. 25     cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
复制代码
 
定位思路:
1、转灰度图
2、通过高斯模糊去除图像噪点,如果不使用高斯模糊去噪的话,条形码的线段会有些弯曲,看场景是否需要

3、使用sobel进行边缘检测,请注意分辨sobel水平变换和垂直变换的差别

4、进行二值化,相比于上一步的sobel,可以发现消除一些独立的噪点,但是还是保留了一些,可以更改参数再进行调整

5、进行形态学运算(膨胀腐蚀)对应代码中的iterations的次数是尝试过后的最佳成效,可以自己调整次数看看不同效果


 6、寻找轮廓,通过对原图处理后,我们得到的上述最终的效果图可以发现,最大的白色区域就是我们需要的条形码区域,所以我们通过cv2.contourArea()和max()配合来寻找最大面积,最后在原图上绘制出我们的目标区域

 
值得注意的是,上述思路有比较大的局限性,首先是针对原图的显示问题,如果不是水平拍摄,是垂直拍摄时,我们需要更改sobel使用垂直变换卷积核,或者对原图进行旋转。
其次是,我们定位最终的barcode区域使用到了max来查找最大面积,所以这就意味着,原图中,barcode整体轮廓必须是最大的。
 
参考博客:一种改进的条形码定位方案,基于openCV实现,附完整源代码_opencv条形码识别-CSDN博客

来源:https://www.cnblogs.com/vangoghpeng/p/17914588.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具