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


Posted in Python onAugust 14, 2019

今天,我实现了一个很有趣的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

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

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

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

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)
#经过上面的操作后看起来是这样

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

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

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

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

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

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

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

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

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

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

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

# 接下来我们来找轮廓
(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))
# 返回box
return box

最终结果

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

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

import numpy as np
import cv2
def detect(image):
	# convert the image to grayscale
	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	# compute the Scharr gradient magnitude representation of the images
	# in both the x and y direction
	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)
	# subtract the y-gradient from the x-gradient
	gradient = cv2.subtract(gradX, gradY)
	gradient = cv2.convertScaleAbs(gradient)
	# blur and threshold the image
	blurred = cv2.blur(gradient, (9, 9))
	(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
	# construct a closing kernel and apply it to the thresholded image
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
	closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
	# perform a series of erosions and dilations
	closed = 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 None
	if len(cnts) == 0:
		return None
	# otherwise, sort the contours by area and compute the rotated
	# bounding box of the largest contour
	c = 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 barcode
	return box

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

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

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

我们先导入模块

# import the necessary packages
import simple_barcode_detection
import cv2
import numpy as np
import zbar
from PIL import Image

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

# create a reader
scanner = zbar.ImageScanner()
# configure the reader
scanner.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
# video
if not grabbed:
break
调用刚才我们建的那个函数来查找二维码返回二维码的位置
# detect the barcode in the image
box = 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.size
raw = pil.tostring()
#把图像装换成数据
zarimage = zbar.Image(width, height, 'Y800', raw)
#扫描器进行扫描
scanner.scan(zarimage)
#得到结果
for symbol in zarimage:
  # 对结果进行一些有用的处理
print 'decoded', symbol.type, 'symbol', '"%s"' %symbol.data
cv2.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 key
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# if the 'q' key is pressed, stop the loop
if key == ord("q"):
break
# cleanup the camera and close any open windows
camera.release()
cv2.destroyAllWindows()

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

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

下面还是上源码

# import the necessary packages
import simple_barcode_detection
import cv2
import numpy as np
import zbar
from PIL import Image
# create a reader
scanner = zbar.ImageScanner()
# configure the reader
scanner.parse_config('enable')
font=cv2.FONT_HERSHEY_SIMPLEX
camera=cv2.VideoCapture(0)
while True:
# grab the current frame
(grabbed, frame) = camera.read()
# check to see if we have reached the end of the
# video
if not grabbed:
break
# detect the barcode in the image
box = 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.shape
roi=cv2.cvtColor(roi,cv2.COLOR_BGR2RGB)
pil= Image.fromarray(frame).convert('L')
width, height = pil.size
raw = pil.tostring()
# wrap image data
zarimage = zbar.Image(width, height, 'Y800', raw)
# scan the image for barcodes
scanner.scan(zarimage)
# extract results
for symbol in zarimage:
  # do something useful with results
print 'decoded', symbol.type, 'symbol', '"%s"' %symbol.data
cv2.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 key
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
# if the 'q' key is pressed, stop the loop
if key == ord("q"):
break
# cleanup the camera and close any open windows
camera.release()
cv2.destroyAllWindows()

总结

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

Python 相关文章推荐
Python批量查询域名是否被注册过
Jun 21 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
selenium+python实现自动化登录的方法
Sep 04 Python
python使用Matplotlib画条形图
Mar 25 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
Python底层封装实现方法详解
Jan 22 Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 Python
Django mysqlclient安装和使用详解
Sep 17 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 14 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
总结Python使用过程中的bug
Jun 18 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 #Python
使用Python实现图像标记点的坐标输出功能
Aug 14 #Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 #Python
python提取照片坐标信息的实例代码
Aug 14 #Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 #Python
详解用python计算阶乘的几种方法
Aug 14 #Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 #Python
You might like
基于mysql的论坛(7)
2006/10/09 PHP
php cookis创建实现代码
2009/03/16 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
javascript jQuery插件练习
2008/12/24 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
Python 第一步 hello world
2009/09/25 Python
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
python中list列表的高级函数
2016/05/17 Python
Python打印输出数组中全部元素
2018/03/13 Python
Python学习小技巧总结
2018/06/10 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
python中altair可视化库实例用法
2021/01/26 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP