详解利用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实现计算资源图标crc值的方法
Oct 05 Python
django 自定义用户user模型的三种方法
Nov 18 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
python获取Pandas列名的几种方法
Aug 07 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python 如何快速复制序列
Sep 07 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
如何实现一个python函数装饰器(Decorator)
Oct 12 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
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
JS实现简单打字测试
2020/06/24 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
解决python中 f.write写入中文出错的问题
2018/10/31 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
Python中如何添加自定义模块
2020/06/09 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
商业活动邀请函
2014/02/04 职场文书
珍惜水资源建议书
2014/03/12 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA