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

 更新时间:2020年11月17日 08:33:45   作者:西瓜6  
这篇文章主要介绍了详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

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

具体步骤

 前期准备

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

pip install opencv-python

所用到的图片就是这个

西瓜6的barcode

使用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)

结果如图:

在这里插入图片描述

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

只以pyzbar举例

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

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

barcode_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)
  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识别图片条码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jupyter notebook保存文件默认路径更改方法汇总(亲测可以)

    jupyter notebook保存文件默认路径更改方法汇总(亲测可以)

    安装Anaconda后,新建文件的默认存储路径一般在C系统盘,那么路径是什么呢?如何更改jupyter notebook保存文件默认路径呢?今天小编就这一问题通过两种方法给大家讲解,需要的朋友跟随小编一起看看吧
    2021-06-06
  • python3 logging日志封装实例

    python3 logging日志封装实例

    这篇文章主要介绍了python3 logging日志封装实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python实现集中式的病毒扫描功能详解

    python实现集中式的病毒扫描功能详解

    这篇文章主要介绍了python实现集中式的病毒扫描功能,结合实例形式分析了Python集中式的病毒扫描相关原理、实现方法与操作注意事项,需要的朋友可以参考下
    2019-07-07
  • Python中itertools模块用法详解

    Python中itertools模块用法详解

    这篇文章主要介绍了Python中itertools模块用法,详细的讲述了itertools模块中常见函数的用法及相关示例,有助于深入掌握Python程序设计,需要的朋友可以参考下
    2014-09-09
  • Django之模板层的实现代码

    Django之模板层的实现代码

    这篇文章主要介绍了Django之模板层的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • ERLANG和PYTHON互通实现过程详解

    ERLANG和PYTHON互通实现过程详解

    这篇文章主要介绍了ERLANG和PYTHON互通过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python简单格式化时间的方法【strftime函数】

    Python简单格式化时间的方法【strftime函数】

    这篇文章主要介绍了Python简单格式化时间的方法,结合实例形式分析了Python使用strftime函数进行时间格式化的操作技巧,需要的朋友可以参考下
    2016-09-09
  • 基于python进行桶排序与基数排序的总结

    基于python进行桶排序与基数排序的总结

    今天小编就为大家分享一篇基于python进行桶排序与基数排序的总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 使用Python编程分析火爆全网的鱿鱼游戏豆瓣影评

    使用Python编程分析火爆全网的鱿鱼游戏豆瓣影评

    本文来为大家介绍如何使用Python爬取影评的操作,主要是爬取《鱿鱼游戏》在豆瓣上的一些影评,对数据做一些简单的分析,用数据的角度重新审视下这部剧,有需要的朋友可以借鉴参考下
    2021-10-10
  • 零基础学python应该从哪里入手

    零基础学python应该从哪里入手

    在本篇文章里小编给大家分享的是一篇关于零基础学python应该从哪里入手的相关基础内容,需要的朋友们可以参考下。
    2020-08-08

最新评论