详解利用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 相关文章推荐
2款Python内存检测工具介绍和使用方法
Jun 01 Python
在Python中处理XML的教程
Apr 29 Python
Python3读取zip文件信息的方法
May 22 Python
python中getaddrinfo()基本用法实例分析
Jun 28 Python
python实现获取Ip归属地等信息
Aug 27 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
微信跳一跳小游戏python脚本
Jan 05 Python
python定向爬取淘宝商品价格
Feb 27 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
python opencv图片编码为h264文件的实例
Dec 12 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
python如何利用traceback获取详细的异常信息
Jun 05 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如何实现Socket服务器
2015/09/23 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
python合并同类型excel表格的方法
2018/04/01 Python
python保存网页图片到本地的方法
2018/07/24 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
速比涛英国官网:Speedo英国
2019/07/15 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
语文教学感言
2014/02/06 职场文书
前处理组长岗位职责
2014/03/01 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
党建工作经验交流材料
2014/05/25 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript