使用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中的引用和拷贝浅析
Nov 22 Python
详解Python中的Cookie模块使用
Jul 06 Python
python3操作mysql数据库的方法
Jun 23 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
python的移位操作实现详解
Aug 21 Python
python  logging日志打印过程解析
Oct 22 Python
python-视频分帧&多帧合成视频实例
Dec 10 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Python利用pip安装tar.gz格式的离线资源包
Sep 14 Python
如何利用python读取micaps文件详解
Oct 18 Python
浅谈Python类的单继承相关知识
May 12 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
javascript延时加载之defer测试
2012/12/28 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
javascript实现图片自动和可控的轮播切换特效
2015/04/13 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
在Python中进行自动化单元测试的教程
2015/04/15 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python实现的计算马氏距离算法示例
2018/04/03 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
python实现彩色图转换成灰度图
2019/01/15 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
简单了解python中对象的取反运算符
2019/07/01 Python
简单了解python代码优化小技巧
2019/07/08 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
草莓网官网:StrawberryNET
2019/08/21 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
linux下进程间通信的方式
2013/01/23 面试题
初中三好学生事迹材料
2014/01/13 职场文书
中班开学寄语
2014/04/04 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
详解python网络进程
2021/06/15 Python
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android