时间:2021-05-22
前言
这周和大家分享如何用python识别图像里的条码。用到的库可以是zbar。希望西瓜6辛苦码的代码不要被盗了。(zxing的话,我一直没有装好,等装好之后再写一篇)
具体步骤
前期准备
用opencv去读取图片,用pip进行安装。
pip install opencv-python所用到的图片就是这个
使用pyzbar
windows的安装方法是
pip install pyzbar而mac的话,最好用brew来安装。
(有可能直接就好,也有可能很麻烦)
装好之后就是读取图片,识别条码。
代码如下
结果如图:
特殊情况处理(条码图片矫正和增强)
只以pyzbar举例
条码是颠倒的是否会影响识别?
不影响,单纯颠倒180度和90度是不会影响识别的。
我们把上一个图的颠倒180度,用颠倒后的图试一下
结果如图
90度的话也是同样可以成功的。但是其它角度就会GG。
条码是倾斜的是否会影响识别?
会的,但这种还比较好处理。
如图
这张图用上面的代码就会
解决的思路是把这个图片旋转回来,至于如何判断转多少度,可以通过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 - angle texts = 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 - angle texts = 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) - cX M[1, 2] += (nH / 2) - cY return 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)条码是模糊的是否会影响识别?
会的,处理方法就是传统的调对比度,锐化。。。。
不过这个只能解决部分部分,至于有的条码,微信可以扫,支付宝可以扫,但是我们识别不了,这个也不能怪库不好,这部分该放弃就放弃吧。
结束语
如果你想用python来解决图像里的条码识别问题,这篇文章肯定是可以帮到你的。到此这篇关于详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强的文章就介绍到这了,更多相关python识别图片条码内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Barcode的一个实现案例一、简介Barcode模块管理条码扫描,提供常见的条码(二维码及一维码)的扫描识别功能,可调用设备的摄像头对条码图片扫描进行数据输入
一个标签可能含有多种对象,我们常见的一般是含条码及文本的条码标签。当然,也有很多标签中是含有图片的,例如有些商品标签。每种商品其每个条形码对应的图片也是不一样的
二维码(dimensionalbarcode),又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码。设备扫描二维条码,通过识别条码的长度和宽度中所记
Tclip用于图片裁剪,有以下特点:能进行人脸识别。图片中有人脸,将自动视为人脸区域为重要区域,将不会被裁剪掉。自动识别其它重要区域。如果图片中未识别出人脸,则
利用opencv来识别图片中的矩形。其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合。1.对输入灰度图片进行高斯滤波2.做灰度直方图,提取阈值,做二值