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


风晓
风晓 2023-12-29 10:59:55 51704 赞同 0 反对 0
分类: 资源
关于二维码和条形码的检测和识别,在OpenCV中已经有提供了对应的API,cv2.QRCodeDetector() | cv2.barcode_BarcodeDetector() ,相关的实现极其简单:

 

 只需要上述短短三行代码即可检测二维码和条形码的位置并识别码内信息,相关parameter和retval自行查找。

 

下述是不借助OpenCV直接实现的API来实现定位

 

Code:

复制代码
 1 def barcode(image):
 2     gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 3     blur = cv2.GaussianBlur(gray, (5, 5), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 4     cv2.imshow('GaussianBlur', blur)
 5     kernel_x = numpy.array([
 6         [-1, 0, 1],
 7         [-2, 0, 2],
 8         [-1, 0, 1]
 9     ])
10     kernel_y = numpy.array([
11         [-1, -2, -1],
12         [0, 0, 0],
13         [1, 2, 1]
14     ])
15     x = cv2.filter2D(blur, -1, kernel_x)
16     y = cv2.filter2D(blur, -1, kernel_y)
17     cv2.imshow('Sobel', x)
18     _, threshold = cv2.threshold(x, 127, 255, cv2.THRESH_BINARY)
19     kernel = numpy.ones((3, 3), numpy.uint8)
20     r_e = cv2.erode(threshold, kernel, iterations=1)
21     r_d = cv2.dilate(r_e, kernel, iterations=10)
22     contours, hir = cv2.findContours(r_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
23     max_contour = numpy.array(max(contours, key=cv2.contourArea))
24     x, y, w, h = cv2.boundingRect(max_contour)
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整体轮廓必须是最大的。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
风晓L1
粉丝 1 资源 2038 + 关注 私信
最近热门资源
桌面通用(全架构)【在双系统环境下隐藏Windows启动菜单】操作指南  2049
银河麒麟桌面操作系统V10(SP1)2203-如何进行远程桌面互访?  1990
银河麒麟桌面操作系统【保留数据盘重装系统】  1800
麒麟系统各种原因开不了机解决(合集)  1575
桌面通用(全架构)【rpm包转成deb包】操作方法  930
银河麒麟桌面操作系统 V10-SP1 双系统安装 efi 分区问题  914
统信系统安装(合集)  852
统信桌面专业版【手动分区安装UOS系统】介绍  844
统启动异常几种类型(initramfs 模式)  687
最近下载排行榜
桌面通用(全架构)【在双系统环境下隐藏Windows启动菜单】操作指南 0
银河麒麟桌面操作系统V10(SP1)2203-如何进行远程桌面互访? 0
银河麒麟桌面操作系统【保留数据盘重装系统】 0
麒麟系统各种原因开不了机解决(合集) 0
桌面通用(全架构)【rpm包转成deb包】操作方法 0
银河麒麟桌面操作系统 V10-SP1 双系统安装 efi 分区问题 0
统信系统安装(合集) 0
统信桌面专业版【手动分区安装UOS系统】介绍 0
统启动异常几种类型(initramfs 模式) 0
作者收入月榜
1

prtyaa 收益393.72元

2

zlj141319 收益220.97元

3

1843880570 收益214.2元

4

IT-feng 收益213.03元

5

风晓 收益208.24元

6

777 收益172.82元

7

Fhawking 收益106.6元

8

信创来了 收益105.89元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!