详解利用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中黄金分割法实现方法
May 06 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
Python的装饰器用法学习笔记
Jun 24 Python
matplotlib绘制动画代码示例
Jan 02 Python
python3.x上post发送json数据
Mar 04 Python
Django处理文件上传File Uploads的实例
May 28 Python
Python编程深度学习计算库之numpy
Dec 28 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
编写python代码实现简单抽奖器
Oct 20 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
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
生成php程序的php代码
2008/04/07 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
javascript实现动态标签云
2015/10/16 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
信息服务专业毕业生求职信
2014/03/02 职场文书
企业宣传工作方案
2014/06/02 职场文书
主题团日活动总结
2014/06/25 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery