详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强


Posted in Python onNovember 17, 2020

前言

这周和大家分享如何用python识别图像里的条码。用到的库可以是zbar。希望西瓜6辛苦码的代码不要被盗了。(zxing的话,我一直没有装好,等装好之后再写一篇)

具体步骤

 前期准备

用opencv去读取图片,用pip进行安装。

pip install opencv-python

所用到的图片就是这个

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

使用pyzbar

windows的安装方法是

pip install pyzbar

而mac的话,最好用brew来安装。
(有可能直接就好,也有可能很麻烦)
装好之后就是读取图片,识别条码。
代码如下

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)

结果如图:

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

特殊情况处理(条码图片矫正和增强)

只以pyzbar举例

条码是颠倒的是否会影响识别?

不影响,单纯颠倒180度和90度是不会影响识别的。
我们把上一个图的颠倒180度,用颠倒后的图试一下

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

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)

结果如图

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

90度的话也是同样可以成功的。但是其它角度就会GG。

条码是倾斜的是否会影响识别?

会的,但这种还比较好处理。
如图

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

这张图用上面的代码就会

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

解决的思路是把这个图片旋转回来,至于如何判断转多少度,可以通过opencv来处理。通过膨胀和腐蚀将其变为如图。

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

接着再用cv2.minAreaRect函数,这个函数会返回如下,

详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强

里面的第三个-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)
  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 = 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识别图片条码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python用字典统计单词或汉字词个数示例
Apr 22 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
python使用分治法实现求解最大值的方法
May 12 Python
Python3处理文件中每个词的方法
May 22 Python
机器学习10大经典算法详解
Dec 07 Python
python实现换位加密算法的示例
Oct 14 Python
Python3中exp()函数用法分析
Feb 19 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
150行python代码实现贪吃蛇游戏
Apr 24 Python
Python绘制组合图的示例
Sep 18 Python
python数字图像处理:图像简单滤波
Jun 28 Python
详解Pytorch显存动态分配规律探索
Nov 17 #Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 #Python
python tkinter实现连连看游戏
Nov 16 #Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 #Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 #Python
python 从list中随机取值的方法
Nov 16 #Python
python实现在列表中查找某个元素的下标示例
Nov 16 #Python
You might like
ucenter通信原理分析
2015/01/09 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
js实现无缝滚动双图切换效果
2019/07/09 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
基于python的列表list和集合set操作
2019/11/24 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
高三自我评价
2014/02/01 职场文书
应届大学生自荐书
2014/06/17 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
男方婚前保证书
2015/02/28 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL