花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图:

具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/article/details/51065547

详细解释:

第一步:利用opencv提取二维码区域

1,先将读入的摄像头frame转换成灰度图:

gray = cv2.cvtColor(image_path, cv2.COLOR_BGR2GRAY)

2,使用opencv自带的Sobel算子进行过滤:

gradX = cv2.Sobel(gray, cv2.CV_32F, 1, 0,-1)
gradY = cv2.Sobel(gray, cv2.CV_32F, 0, 1,-1)

具体参数可参考:http://blog.csdn.net/sunny2038/article/details/9170013

3,将过滤得到的X方向像素值减去Y方向的像素值:

gradient = cv2.subtract(gradX, gradY)

4,先缩放元素再取绝对值,最后转换格式为8bit型

gradient = cv2.convertScaleAbs(gradient)

5,均值滤波取二值化:

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

6,腐蚀和膨胀的函数:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)

7,找到边界findContours函数

binary,cnts,hierarchy = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

8,计算出包围目标的最小矩形区域:

c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))

第二步:识别二维码

关于识别那就比较简单了,主要是加载import zbar库,然后scan就好了。

cap = cv2.VideoCapture(camera_idx)

# create a reader
scanner = zbar.ImageScanner()
# configure the reader
scanner.parse_config('enable')
box = detect.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]
print roi.shape
# 把区域里的二维码传换成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)

基于opencv+python的二维码识别的更多相关文章

  1. 有关python下二维码识别用法及识别率对比分析

    最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...

  2. Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...

  3. 基于opencv3.0和下的条形码与二维码识别

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  4. Python 实现二维码生成和识别

    今天突然想给自己自己做个头像,然后还是二维码的形式,这样只要扫一扫就可以访问我的主页.然后就开始自己的苦逼之路... 其实实现二维码java,c#,C++等都可以实现:由于自己正在学python,所以 ...

  5. Opencv+Zbar二维码识别(二维码校正)

    二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...

  6. python qrcode二维码生成与识别

    二维码 二维码生成 1.用法 https://github.com/lincolnloop/python-qrcode 2.使用 简单实用 import qrcode # 二维码内容 data = & ...

  7. [opencv]二维码识别开发流程及问题复盘总结

    项目复盘总结 开发需求: 在桌面机器人(向下俯视)摄像头拍摄到的图像中做条形码识别与二维码识别. 条形码在图像固定位置,二维码做成卡片的形式在固定区域内随意摆放. 开发环境及相关库:ubuntu 18 ...

  8. [opencv]二维码识别率提升方案-resize调整

    这里采用循环resize的方式,对二维码图像进行放缩. 识别到name(二维码结果)不为空,则立即退出循环 //循环识别 for (int i = 1;name.empty(); i++){ resi ...

  9. Python制作二维码和条形码扫描器 (pyzbar)

    条码在生活中随处可见,其可分为三类:一维条码.二维条码.三维条码 一维条码: 我们平时习惯称为条形码.条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常见的条 ...

随机推荐

  1. DVWA-CSRF学习笔记

    DVWA-CSRF学习笔记 一.CSRF(跨站请求伪造) CSRF(跨站请求伪造),是指利用受害者尚未失效的身份认证信息(cookie.session会话等),诱骗其点击恶意链接或者访问包含攻击代码的 ...

  2. IDEA创建xml文件

    今天在用IDEA写项目的时候发现,创建xml文件只能通过File手动输入去创建,但在我看的一个学习视频上可以直接创建xml文件,好奇之下研究了一下,作此篇,希望能对需要的朋友有所帮助. 废话就不多说了 ...

  3. warning: Unexpected unnamed function (func-names)

    warning: Unexpected unnamed function (func-names) 看到这个提示基本是就是说你的函数不能是匿名函数,最好可以起一个名字,然后你增加一个函数名称就好了 R ...

  4. linux下sendmail

    1. 安装 # yum install sendmail.x86_64 bin/mail会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动sendmail服务,配置非常麻烦,而且 ...

  5. jdbc、Mybatis、Hibernate介绍(非原创)

    文章大纲 一.jdbc介绍二.Mybatis介绍三.Hibernate介绍四.jdbc.Mybatis.Hibernate比较五.参考文章   一.jdbc介绍 1. jdbc编程步骤 (1)加载数据 ...

  6. 异常处理,常用字符串方法,selenium模块

    异常处理 什么是异常处理 (处理异常,报错error) print(1 / 0) # 报了0除错误 # 打印结果: Traceback (most recent call last): File &q ...

  7. odoo10学习笔记七:国际化、报表

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189297.html 一:国际化(模块翻译) 我们开发的模块要国际化通用,就要开发出不同的语言支持. 这些 ...

  8. nodejs实现简单爬虫

    nodejs结合cheerio实现简单爬虫 let cheerio = require("cheerio"), fs = require("fs"), util ...

  9. SQLAlchemy 多对多

    创建多对多表 from sqlalchemy.ext.declarative import declarative_base Base=declarative_base() from sqlalche ...

  10. 201871020225-牟星源《面向对象程序设计(java)》第十五周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...