详解利用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类属性的延迟计算
Oct 22 Python
Python定时器实例代码
Nov 01 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
Python之修改图片像素值的方法
Jul 03 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python代码块及缓存机制原理详解
Dec 13 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
python有几个版本
Jun 17 Python
python 基于opencv实现高斯平滑
Dec 18 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
input file获得文件根目录简单实现
2013/04/26 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Python自动抢红包教程详解
2019/06/11 Python
pycharm 安装JPype的教程
2019/08/08 Python
python数据预处理方式 :数据降维
2020/02/24 Python
python爬虫要用到的库总结
2020/07/28 Python
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
毕业生自荐书
2013/12/18 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
2014年建筑工作总结
2014/11/26 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
原告离婚代理词
2015/05/23 职场文书
导游词之永泰公主墓
2019/12/04 职场文书