利用python识别图片中的条码及条码图片矫正和增强
前言这周和大家分享如何用python识别图像里的条码 。 用到的库可以是zbar 。 希望西瓜6辛苦码的代码不要被盗了 。 (zxing的话 , 我一直没有装好 , 等装好之后再写一篇)
具体步骤前期准备用opencv去读取图片 , 用pip进行安装 。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答后台私信小编01即可
pip install opencv-python1
所用到的图片就是这个
文章插图
使用pyzbarwindows的安装方法是
pip install pyzbar1
而mac的话 , 最好用brew来安装 。 (有可能直接就好 , 也有可能很麻烦)装好之后就是读取图片 , 识别条码 。 代码如下
import cv2import pyzbar.pyzbar as pyzbarimage=cv2.imread("/Users/phoenix/Downloads/barcode.png")gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)texts = pyzbar.decode(gray)for text in texts:tt = text.data.decode("utf-8")print(tt)123456789
结果如图:
文章插图
特殊情况处理(条码图片矫正和增强)只以pyzbar举例
条码是颠倒的是否会影响识别?不影响 , 单纯颠倒180度和90度是不会影响识别的 。 我们把上一个图的颠倒180度 , 用颠倒后的图试一下
文章插图
import cv2import pyzbar.pyzbar as pyzbarimport numpy as npimage=cv2.imread("/Users/phoenix/Downloads/barcode_180.png")gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)texts = pyzbar.decode(gray)print(texts)if texts==[]:print("未识别成功")else:for text in texts:tt = text.data.decode("utf-8")print("识别成功")print(tt)123456789101112131415
结果如图
文章插图
90度的话也是同样可以成功的 。 但是其它角度就会GG 。
条码是倾斜的是否会影响识别?会的 , 但这种还比较好处理 。 如图
文章插图
这张图用上面的代码就会
文章插图
【利用python识别图片中的条码及条码图片矫正和增强】解决的思路是把这个图片旋转回来 , 至于如何判断转多少度 , 可以通过opencv来处理 。 通过膨胀和腐蚀将其变为如图 。
文章插图
接着再用cv2.minAreaRect函数 , 这个函数会返回如下 ,
文章插图
里面的第三个-45就是我们需要的角度 。
综合起来的实现代码 , 我就放在下面了 。 (我自己写的 , 如果有帮到你 , 快点关注和赞)
import cv2import pyzbar.pyzbar as pyzbarimport numpy as npdef barcode(gray):texts = pyzbar.decode(gray)if texts == []:angle = barcode_angle(gray)if angle < -45:angle = -90 - angletexts = bar(gray, angle)if texts == []:gray = np.uint8(np.clip((1.1 * gray + 10), 0, 255))angle = barcode_angle(gray)#西瓜6写的 , 转载需声明if angle < -45:angle = -90 - angletexts = bar(gray, angle)return textsdef bar(image, angle):gray = image#西瓜6写的 , 转载需声明bar = rotate_bound(gray, 0 - angle)roi = cv2.cvtColor(bar, cv2.COLOR_BGR2RGB)texts = pyzbar.decode(roi)return textsdef barcode_angle(image):gray = image#西瓜6写的 , 转载需声明ret, binary = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY_INV)kernel = np.ones((8, 8), np.uint8)dilation = cv2.dilate(binary, kernel, iterations=1)erosion = cv2.erode(dilation, kernel, iterations=1)erosion = cv2.erode(erosion, kernel, iterations=1)erosion = cv2.erode(erosion, kernel, iterations=1)contours, hierarchy = cv2.findContours(erosion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)if len(contours) == 0:rect = [0, 0, 0]else:rect = cv2.minAreaRect(contours[0])return rect[2]def rotate_bound(image, angle):(h, w) = image.shape[:2](cX, cY) = (w // 2, h // 2)M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)cos = np.abs(M[0, 0])sin = np.abs(M[0, 1])#西瓜6写的 , 转载需声明nW = int((h * sin) + (w * cos))nH = int((h * cos) + (w * sin))M[0, 2] += (nW / 2) - cXM[1, 2] += (nH / 2) - cYreturn cv2.warpAffine(image, M, (nW, nH))image=cv2.imread("/Users/phoenix/Downloads/barcode_455.png")gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)texts = barcode(gray)print(texts)if texts==[]:print("未识别成功")else:for text in texts:tt = text.data.decode("utf-8")print("识别成功")print(tt)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
- 二维码|村网通?澳大利亚一州推出疫情追踪二维码 还考虑采用人脸识别和地理定位
- 回收利用协|固废“零”时代产业如何共生?
- 首创|网易有道词典笔3发布:首创毫秒级超快点查、识别率超98%
- 不良|打开“无痕模式”就以为无人知?殊不知,“不良网站”正在利用你
- NIST测试显示人脸识别系统对蒙面人的识别能力越来越强
- 人脸识别|10元能买600张人脸照片 “刷脸”真的安全吗?
- 格式化|利用好这3个隐藏技巧,Power BI 开发体验更丝滑
- 合同|人脸识别,“必要性”标准有待细化
- 告诉|阿里大佬告诉你如何一分钟利用Python在家告别会员看电影
- 周娟|梅赛德斯-奔驰周娟:最大化利用品牌资产与客户建立品牌链接