这周和⼤家分享如何⽤python识别图像⾥的条码。⽤到的库可以是zbar。希望西⽠6⾟苦码的代码不要被盗了。(zxing的话,我⼀直没有装好,等装好之后再写⼀篇)
具体步骤
前期准备
⽤opencv去读取图⽚,⽤pip进⾏安装。
pip install opencv-python
所⽤到的图⽚就是这个
使⽤pyzbar
windows的安装⽅法是
pip install pyzbar
⽽mac的话,最好⽤brew来安装。
dx3(有可能直接就好,也有可能很⿇烦)
装好之后就是读取图⽚,识别条码。
代码如下
import cv2
import pyzbar.pyzbar as pyzbar
image=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)
结果如图:
特殊情况处理(条码图⽚矫正和增强)
只以pyzbar举例
条码是颠倒的是否会影响识别?
互联网汽车不影响,单纯颠倒180度和90度是不会影响识别的。
多功能越野车
我们把上⼀个图的颠倒180度,⽤颠倒后的图试⼀下
import cv2
import pyzbar.pyzbar as pyzbar
import numpy as np
image=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)
结果如图
90度的话也是同样可以成功的。但是其它⾓度就会GG。
条码是倾斜的是否会影响识别?
会的,但这种还⽐较好处理。
如图
这张图⽤上⾯的代码就会
解决的思路是把这个图⽚旋转回来,⾄于如何判断转多少度,可以通过opencv来处理。通过膨胀和腐蚀将其变为如图。
接着再⽤cv2.minAreaRect函数,这个函数会返回如下,
⾥⾯的第三个-45就是我们需要的⾓度。
综合起来的实现代码,我就放在下⾯了。(我⾃⼰写的,如果有帮到你,快点关注和赞)
import cv2
import pyzbar.pyzbar as pyzbar
import numpy as np
def 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)
天津限号2022最新限号2月return texts
def bar(image, angle):
gray = image
#西⽠6写的,转载需声明
bar = rotate_bound(gray, 0 - angle)
roi = cv2.cvtColor(bar, cv2.COLOR_BGR2RGB)
texts = pyzbar.decode(roi)
return texts
def 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 = de(dilation, kernel, iterations=1)
erosion = de(erosion, kernel, iterations=1)
erosion = de(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 = RotationMatrix2D((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 识别图⽚条码内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
发布评论