详解利用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下如何让web元素的生成更简单的分析
Jul 17 Python
十条建议帮你提高Python编程效率
Feb 16 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
python实现Virginia无密钥解密
Mar 20 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
python绘制直方图和密度图的实例
Jul 08 Python
python获取linux系统信息的三种方法
Oct 14 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
如何解决.cuda()加载用时很长的问题
May 24 Python
Python matplotlib多个子图绘制整合
Apr 13 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
非常实用的PHP常用函数汇总
2014/12/17 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
Python猜数字算法题详解
2020/03/01 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
django 模型中的计算字段实例
2020/05/19 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
西班牙手机之家:Phone House
2018/10/18 全球购物
造价工程师个人求职信
2013/09/21 职场文书
纠风工作实施方案
2014/03/15 职场文书
大班开学家长寄语
2014/04/04 职场文书
本科毕业生求职信
2014/06/15 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Python语言中的数据类型-序列
2022/02/24 Python