侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用python写的opencv实时监测和解析二维码和条形码

Python  /  管理员 发布于 7年前   198

今天,我实现了一个很有趣的demo,它可以在视频里找到并解析二维码,然后把解析的内容实时在屏幕上显示出来。

然后我们直入主题,首先你得确保你装了opencv,python,zbar等环境。然后这个教程对于学过opencv的人可能更好理解,但是没学过也无妨,到时候也可以直接用。

比如我的电脑上的环境是opencv2.4.x,python2.7,和最新的zbar,在Ubuntu 12.12的系统下运行的

假设你的opencv已经安装好了,那么我们就可以安装zbar

你可以先更新一下

sudo apt-get update

然后在输入

sudo apt-get install python-zbar

如果环境装好了,我们就可以接着下一步操作了。

首先让我们来实现找到在图片里面找到二维码的功能

先新建一个python文件叫做;simple_barcode_detection.py

代码如下,这定义了一个函数,实现从一副图片里面找出二维码的位置

我们要检测的二维码的图片


import numpy as np import cv2 def detect(image):# 把图像从RGB装换成灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Scharr操作(指定使用ksize = -1)构造灰度图在水平和竖直方向上的梯度幅值表示。gradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)#Scharr操作后,从x的梯度减去y的梯度gradient = cv2.subtract(gradX, gradY)gradient = cv2.convertScaleAbs(gradient)#经过上面的操作后看起来是这样


# 对上述的梯度图采用用9x9的核进行平均模糊,这是有利于降噪的

#然后进行二值化处理,要么是255(白)要么是0(黑)

blurred = cv2.blur(gradient, (9, 9))(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)

#模糊与二值化处理后,看起来是这个样子,



#上面的操作后发现有一些条形码的竖杠之间存在一些缝隙,并使我们的算法能检测到斑点区域,我们进行一些基本的形态学操作#我们首先使用cv2.getStructuringElement构造一个长方形内核。这个内核的宽度大于长度,因此我们可以消除条形码中垂直条之间的缝隙。# 这里进行形态学操作,将上一步得到的内核应用到我们的二值图中,以此来消除竖杠间的缝隙。kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)#上述操作后看起来是这个样子


#我们发现还是存在一些小斑点,这时我们可以使用opencv里面的腐蚀和膨胀来处理他们,来去除白色的斑点

closed = cv2.erode(closed, None, iterations = 4)closed = cv2.dilate(closed, None, iterations = 4)#这时候的效果看起来是这样的


# 接下来我们来找轮廓(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#如果没找到则返回为空if len(cnts) == 0:return None#找到了就通过面积来排序,并计算旋转角# 给最大的轮廓找到边框c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]rect = cv2.minAreaRect(c)#box(里面是ndarry数组,包含了4个顶点的位置)box = np.int0(cv2.cv.BoxPoints(rect))# 返回boxreturn box

最终结果


 好了,上面的解释里面有中文,可能python解释的时候会通不过,我下面直接给出代码

import numpy as npimport cv2def detect(image):# convert the image to grayscalegray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# compute the Scharr gradient magnitude representation of the images# in both the x and y directiongradX = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 1, dy = 0, ksize = -1)gradY = cv2.Sobel(gray, ddepth = cv2.cv.CV_32F, dx = 0, dy = 1, ksize = -1)# subtract the y-gradient from the x-gradientgradient = cv2.subtract(gradX, gradY)gradient = cv2.convertScaleAbs(gradient)# blur and threshold the imageblurred = cv2.blur(gradient, (9, 9))(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)# construct a closing kernel and apply it to the thresholded imagekernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# perform a series of erosions and dilationsclosed = cv2.erode(closed, None, iterations = 4)closed = cv2.dilate(closed, None, iterations = 4)# find the contours in the thresholded image(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# if no contours were found, return Noneif len(cnts) == 0:return None# otherwise, sort the contours by area and compute the rotated# bounding box of the largest contourc = sorted(cnts, key = cv2.contourArea, reverse = True)[0]rect = cv2.minAreaRect(c)box = np.int0(cv2.cv.BoxPoints(rect))# return the bounding box of the barcodereturn box

完成了上述的工作,我们就完成了二维码和条形码的定位,接下去实现视频里面二维码的解析

你可以新建一个python文件,barcode_vid.py

解析二维码我们需要用zbar这个模块和PIL,PIL在python里面装好了

我们先导入模块

# import the necessary packagesimport simple_barcode_detectionimport cv2import numpy as npimport zbarfrom PIL import Image

#接下去是创建一个扫描器,他可以解析二维码的内容

# create a readerscanner = zbar.ImageScanner()# configure the readerscanner.parse_config('enable')#设置屏幕显示字体font=cv2.FONT_HERSHEY_SIMPLEX#启用摄像头camera=cv2.VideoCapture(0)#接下去是一个大的while循环while True:#得到当前的帧# grab the current frame(grabbed, frame) = camera.read()#检测视频是否到底了,如果检测视频文件里面的二维码或条形码用这个,如果开启摄像头就无所谓了# check to see if we have reached the end of the# videoif not grabbed:break调用刚才我们建的那个函数来查找二维码返回二维码的位置# detect the barcode in the imagebox = simple_barcode_detection.detect(frame)if box != None:#这下面的3步得到扫描区域,扫描区域要比检测出来的位置要大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)pil= Image.fromarray(frame).convert('L')width, height = pil.sizeraw = pil.tostring()#把图像装换成数据zarimage = zbar.Image(width, height, 'Y800', raw)#扫描器进行扫描scanner.scan(zarimage)#得到结果for symbol in zarimage:  # 对结果进行一些有用的处理print 'decoded', symbol.type, 'symbol', '"%s"' %symbol.datacv2.drawContours(frame, [box], -1, (0, 255, 0), 2)#把解析的内容放到视频上cv2.putText(frame,symbol.data,(20,100),font,1,(0,255,0),4)# show the frame and record if the user presses a keycv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFF# if the 'q' key is pressed, stop the loopif key == ord("q"):break# cleanup the camera and close any open windowscamera.release()cv2.destroyAllWindows()

CSDN不能上传视频,我下面传一下图片


下面还是上源码

# import the necessary packagesimport simple_barcode_detectionimport cv2import numpy as npimport zbarfrom PIL import Image# create a readerscanner = zbar.ImageScanner()# configure the readerscanner.parse_config('enable')font=cv2.FONT_HERSHEY_SIMPLEXcamera=cv2.VideoCapture(0)while True:# grab the current frame(grabbed, frame) = camera.read()# check to see if we have reached the end of the# videoif not grabbed:break# detect the barcode in the imagebox = simple_barcode_detection.detect(frame)if box != None: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]print roi.shaperoi=cv2.cvtColor(roi,cv2.COLOR_BGR2RGB)pil= Image.fromarray(frame).convert('L')width, height = pil.sizeraw = pil.tostring()# wrap image datazarimage = zbar.Image(width, height, 'Y800', raw)# scan the image for barcodesscanner.scan(zarimage)# extract resultsfor symbol in zarimage:  # do something useful with resultsprint 'decoded', symbol.type, 'symbol', '"%s"' %symbol.datacv2.drawContours(frame, [box], -1, (0, 255, 0), 2)cv2.putText(frame,symbol.data,(20,100),font,1,(0,255,0),4)# if a barcode was found, draw a bounding box on the frame# show the frame and record if the user presses a keycv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFF# if the 'q' key is pressed, stop the loopif key == ord("q"):break# cleanup the camera and close any open windowscamera.release()cv2.destroyAllWindows()

总结

以上所述是小编给大家介绍的使用python写的opencv实时监测和解析二维码和条形码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    Python使用mongodb保存爬取豆瓣电影的数据过程解析
    下一条:
    用python3 urllib破解有道翻译反爬虫机制详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客