先上源码,github地址:https://github.com/DerrickRose25/Opencv_QRcode_recognition
环境:Pycharm 、Python3.7
在pycharm里安装opencv-python、pyzbar的包

简版代码识别度高,但是直接使用库函数没有任何意义,但是很实用:

import cv2
import pyzbar.pyzbar as pyzbardef decodeDisplay(image):barcodes = pyzbar.decode(image)for barcode in barcodes:# 提取条形码的边界框的位置# 画出图像中条形码的边界框(x, y, w, h) = barcode.rectcv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)# 条形码数据为字节对象,所以如果我们想在输出图像上# 画出来,就需要先将它转换成字符串barcodeData = barcode.data.decode("utf-8")barcodeType = barcode.type# 绘出图像上条形码的数据和条形码类型text = "{} ({})".format(barcodeData, barcodeType)cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,.5, (0, 0, 125), 2)# 向终端打印条形码数据和条形码类型print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))return imagedef detect():camera = cv2.VideoCapture(0)#camera = cv2.VideoCapture('http://192.168.1.104:8080/?action=stream')while True:# 读取当前帧ret, frame = camera.read()# 转为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)im = decodeDisplay(gray)cv2.imshow("camera", im)if cv2.waitKey(1) & 0xFF == ord('q'):breakcamera.release()cv2.destroyAllWindows()if __name__ == '__main__':detect()

复杂版采用了opencv的原理,听过对图像进行滤波、开闭运算等一系列操作得到二维码或者条形码位置,虽然最后也是调用了库进行解析,但是在定位上还是采用了OpenCV的传统算法:

import cv2
import numpy as np
import pyzbar.pyzbar as pyzbar# 二维码定位
global check  # 全局变量check为校验位def detect(image):global check# 把图像从RGB转换成灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行Sobel算子运算# 使用scharr操作(指定ksize=-1)构造灰度图在水平和竖直方向上的梯度幅值表示gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)  # 对x方向求导gradY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)  # 对y方向求导# Scharr操作后,从X梯度减去Y梯度得到轮廓图,此时噪点较多gradient = cv2.subtract(gradX, gradY)# 经过处理后,用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像,而只是一副灰色的窗口gradient = cv2.convertScaleAbs(gradient)# cv2.imshow('gradient', gradient)# 然后对梯度图采用用9x9的核进行平均模糊,进行于降噪# 然后进行二值化处理,要么是255(白)要么是0(黑)blurred = cv2.blur(gradient, (9, 9))  # 通过低通滤波平滑图像ret, thresh = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)  # 进行图像固定阈值二值化# cv2.imshow("thresh",thresh)# 通过形态学操作,建立一个7*21的长方形内核,内核宽度大于长度,因此可以消除条形码中垂直条之间的缝隙# 将建立的内核应用到二值图中,以此来消除竖杠间的缝隙kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))  # 条形码'''kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))              #二维码'''# 对图像进行闭运算closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# cv2.imshow("closed",closed)# 所得图像仍有许多白点,通过腐蚀和膨胀去除白点,最后一个参数是腐蚀的次数closed = cv2.erode(closed, None, iterations=4)# cv2.imshow("closed1",closed)closed = cv2.dilate(closed, None, iterations=6)# cv2.imshow("closed2", closed)# 寻找轮廓contours, hierarchy = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 如果没有找到,返回空9if len(contours) == 0:check = Falsereturn None# ec = sorted(contours, key=cv2.contourArea, reverse=True)[0]rect = cv2.minAreaRect(c)  # 生成最小外接矩形# box为一个ndarry数组,返回4个顶点位置box = np.int0(cv2.boxPoints(rect))cv2.drawContours(frame, [box], 0, (255, 0, 0), 2)# cv2.imshow("frame", frame)check = Truereturn box# 二维码识别
def scan():box = detect(frame)  # 调用detect()函数来查找二维码返回二维码的位置# print(box)# 这下面的3步得到扫描区域,扫描区域要比检测出来的位置要大if check == True:min = np.min(box, axis=0)max = np.max(box, axis=0)roi = frame[min[1] - 10:max[1] + 10, min[0] - 10:max[0] + 10]# 把区域里的二维码传换成RGB,并把它转换成pil里面的图像,因为zbar得调用pil里面的图像,而不能用opencv的图像# roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)# cv2.imshow("roi",roi)# print(roi.shape)if roi.any() != 0:barcodes = pyzbar.decode(roi)for barcode in barcodes:# 提取条形码的边界框的位置# 画出图像中条形码的边界框# (x, y, w, h) = barcode.rect# cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 0, 255), 2)# 条形码数据为字节对象,所以如果我们想在输出图像上# 画出来,就需要先将它转换成字符串barcodeData = barcode.data.decode("utf-8")barcodeType = barcode.type# 向终端打印条形码数据和条形码类型print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))return roiif __name__ == '__main__':cameraCapture = cv2.VideoCapture(0)while True:# 获取当前帧ret, frame = cameraCapture.read()scan()cv2.imshow("camera", frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcameraCapture.release()cv2.destroyAllWindows()'''image = cv2.imread("Images/coke.jpg")detect(image)cv2.waitKey(0)cv2.destroyAllWindows()'''

OpenCV+Python二维码条形码识别相关推荐

  1. 数字图像处理二维码识别 python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码: (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维 ...

  2. [软件工具][windows]pdf二维码条形码识别重命名工具使用教程

    pdf二维码条形码识别重命名工具是一款专门用于识别pdf中的二维码或者条形码并将识别结果变成pdf名字,是目前全球首款用于识别pdf条码的软件,具有识别精度高.识别速度快等特点.接下来介绍这个软件使用 ...

  3. python二维码生成识别代码_Python学习案例之二维码生成识别

    前言 在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低.不过就最新版本的测试来说,识别率有了现显著提高. 对比 ...

  4. vue 二维码+条形码识别

    需求及说明: web端 ,识别图片中,二维码和条形码 识别信息可能有重叠需要合并后去重 二维码和条形码在同一张图片上(编写代码暂无冲突) 说明:二维码.条形码分开说明分析 二维码: //使用npm安装 ...

  5. python二维码生成识别代码_Python3+qrcode+zxing生成和识别二维码教程

    一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错&quo ...

  6. 基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码

    完整代码:https://download.csdn.net/download/qq_38735017/87416699 原理简介 车牌字符识别使用的算法是 opencv 的 SVM opencv 的 ...

  7. 77、基于STM32单片机的超市餐饮二维码/条形码摄像头识别结账扫码系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序源码 七.资料包括 摘要 二维码识别系统是集数据采集,识别,以及显示 ...

  8. python opencv 条形码及二维码检测识别

    目录 条形码检测识别 二维码检测识别 基于python opencv pyzbar 实现. 条形码检测识别 原图: 最后截取图: 直接上代码: import cv2 import numpy as n ...

  9. Opencv+Zbar二维码识别(标准条形码/二维码识别)

    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...

最新文章

  1. java.lang.Enum
  2. 扬州ns服务器维修视频,NS连接服务器报错问题解决方法--给遇到同样问题的盆友...
  3. Java设计模式之观察者Observer模式代码示例
  4. [PTA]L2-001 紧急救援 (25 分)
  5. java开发五年面试经验_只有经验丰富的开发人员才能教您有关Java的5件事
  6. SecureCRT远程登录ubuntu
  7. 为OLED屏添加GUI支持2:2D图形库
  8. java五层架构_Web五层架构
  9. 号外号外!兹有第一届区块链技术及应用峰会(BTA)·中国首轮议题抢鲜看
  10. migration java_如何重置migration
  11. 《德米安》从那以后伤口很痛,但偶尔我会找到钥匙,沉入心底
  12. python中perf_counter_Python time.perf_counter()用法及代码示例
  13. win10 tensorflow-gpu1.4 rtx2060 安装详细教程 fater-rcnn
  14. 数据库如何备份表(Oracle、mysql、DB2)
  15. 数据仓库之维度表和事实表
  16. 掩膜裁剪tif步骤_ENVI中掩膜掩膜操作及影像分类教程(转)
  17. 原根算法C语言,算法导论-----数论-----元素的幂
  18. pr 导入 歌词 字幕
  19. Vue指定日期选择框的值--自动计算过期时间
  20. BI 前端实践 4:自定义多维分析界面

热门文章

  1. 申宝股票-冰雪产业板块上涨
  2. 人工智能和ChatGPT深度学习相关资源列表
  3. 外汇交易技术——形态分析
  4. 互联网行业女孩子做什么比较好?
  5. chrome 网页截取全图
  6. python占位符%
  7. matlab 向量场线积分
  8. 基于Java+Swing+Mysql人口普查登记系统
  9. java计算机毕业设计基于安卓Android/微信小程序的大学生学习激励系统APP
  10. android里发送邮件mail的几种方式