详解利用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提示No module named images的解决方法
Sep 29 Python
十条建议帮你提高Python编程效率
Feb 16 Python
Python线程指南详细介绍
Jan 05 Python
Django自定义分页与bootstrap分页结合
Feb 22 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
python list转置和前后反转的例子
Aug 26 Python
python机器学习实现决策树
Nov 11 Python
python opencv如何实现图片绘制
Jan 19 Python
Python中return函数返回值实例用法
Nov 19 Python
Python APScheduler执行使用方法详解
Dec 10 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
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
python中import reload __import__的区别详解
2017/10/16 Python
Python 字符串与数字输出方法
2018/07/16 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
如何在python中实现随机选择
2019/11/02 Python
flask 实现token机制的示例代码
2019/11/07 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Python函数式编程实例详解
2020/01/17 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
Weblogic的布署方式
2013/08/23 面试题
介绍一下OSI七层模型
2012/07/03 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
学习张林森心得体会
2014/09/10 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技