【Python】【OpenCV】定位二维码

这篇具有很好参考价值的文章主要介绍了【Python】【OpenCV】定位二维码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  相较于BarCode,QRCode有明显的特征区域,也就是左上角、右上角、左下角三个”回“字区域,得益于hierarchy中,父子关系的轮廓是连续的(下标),所以这个时候我们就可以通过cv2.findContours()返回的hierarchy来进行定位。

  我们直接上代码

 1 import cv2
 2 import numpy
 3 
 4 
 5 def qrcode(image):
 6     # 有些二维码和边缘紧贴,无法识别出整个矩形,所以我们先对图片大小进行扩展
 7     expand_length = 10
 8     edge = expand_length // 2
 9     h, w = image.shape[:2]
10     image_extend = numpy.zeros((image.shape[0] + expand_length, image.shape[1] + expand_length, 3), numpy.uint8)
11     image_extend[:] = 255
12     image_extend[edge:edge + h, edge:edge + w] = image
13 
14     # 转灰度、二值化、找轮廓
15     gray = cv2.cvtColor(image_extend, cv2.COLOR_BGR2GRAY)
16     # blur = cv2.GaussianBlur(gray, (5, 5), 0)
17     _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
18     contours, hir = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
19 
20     '''
21     2.4282182798755647
22     2.3203121154092337
23     2.3487607213520345
24     2.318010267306266
25     '''
26 
27     # 三个“回”字特征轮廓存储
28     parent_hierarchy_list = []
29     parent_contours_list = []
30 
31     # 通过层级信息去查找三个“回”字特征区域
32     for index, item in enumerate(hir[0][:-2]):  # 查找最外层(A)轮廓
33         if item[2] != -1:
34             parent_index = item[2] - 1
35             if hir[0][index+1][3] == parent_index:  # 查找次一层(B)轮廓
36                 child_first = hir[0][index+1][2] - 1
37                 if hir[0][index+2][3] == child_first:   # 查找最里层(C)轮廓
38                     # 计算A轮廓的周长和C轮廓周长的比值
39                     error = cv2.arcLength(contours[parent_index], True) / cv2.arcLength(contours[parent_index + 2], True)
40                     if 2 < error < 3:
41                         parent_hierarchy_list.append(item)
42                         parent_contours_list.append(contours[index])
43                         # 绘制出三个“回”字特征区域的最外层轮廓
44                         cv2.drawContours(image_extend, contours, index, (0, 255, 0), 3)
45 
46     # 将整个二维码区域绘制出来
47     points_list = []
48     for index, box in enumerate(parent_contours_list):
49         x, y, w, h = cv2.boundingRect(box)
50         if index == 0:
51             points_list.append((x, y+h))
52         if index == 1:
53             points_list.append((x+w, y))
54         if index == 2:
55             points_list.append((x, y))
56     points_list = numpy.array(points_list)
57     rect = cv2.minAreaRect(points_list)
58     box = cv2.boxPoints(rect)
59     box = numpy.int0(box)
60     cv2.drawContours(image_extend, [box], 0, (255, 0, 0), 2)
61 
62     cv2.imshow('', image_extend)
63 
64 
65 if __name__ == '__main__':
66     img = cv2.imread('../images/QRCode_3.png')
67     qrcode(img)
68     cv2.waitKey()
69     cv2.destroyAllWindows()

 

通常我们所见的二维码都是有留白边缘区域的,但是在随便找一些二维码图的过程中,有一些是没有留白边缘区域的:

【Python】【OpenCV】定位二维码

   上图是在IDE中打开的,原图是没有灰色边缘的,这个时候我们如果直接读取这张图片,得到的轮廓信息并不是我们期待的三个连续的父子关系的hierarchy,为了避免这种情况,这里就手动向外扩展十个像素,人为制造一个间隔。

  通常来说,我们通过三层for循环来定位特征区域已经是足够的,但是如果二维码的其他区域也出现了三层轮廓,那么我们就需要进行筛选,所以代码通过计算最外层轮廓的长度和最内存轮廓长度的比值来进行筛选,每一个“回”的黑白框框的比例大概为1:1:3:1:1,也就是说他们的边长比为7:3,而这个比值在标准二维码中,只有三个特征区域才符合。

  代码的21到24行中的数值,便是尝试过了四个不同的二维码得出的比值,都接近7:3。

【Python】【OpenCV】定位二维码

 最后我们绘制出四个边框,完成二维码的定位:

【Python】【OpenCV】定位二维码

 

 

参考博客:opencv实现二维码检测_opencv识别二维码-CSDN博客文章来源地址https://www.toymoban.com/news/detail-760563.html

到了这里,关于【Python】【OpenCV】定位二维码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码; (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维码实时检测和识别 代码保证原创、无错误、能正常运行(如果电脑环境配置没问题) 送二维

    2024年01月16日
    浏览(35)
  • Python Opencv实践 - 二维码和条形码识别

            使用pyzbar模块来识别二维码和条形码。ZBar是一个开源软件,用来从图像中读取条形码,支持多种编码,比如EAN-13/UPC-A、UPC-E、EAN-8、代码128、代码39、交错2/5以及二维码。         pyzbar是python封装ZBar的模块,我们用它来做条形码和二维码的识别。         安装方法:

    2024年02月04日
    浏览(30)
  • Python - Opencv + pyzbar实时摄像头识别二维码

    直接上代码: 简单使用的记录

    2024年02月15日
    浏览(33)
  • 计算机竞赛 python+opencv+深度学习实现二维码识别

    🔥 优质竞赛项目系列,今天要分享的是 🚩 python+opencv+深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/danch

    2024年02月12日
    浏览(35)
  • Python - OpenCV识别条形码、二维码(已封装,拿来即用)

    此代码可识别条形码和二维码,已封装好,拿来即用: 结果:

    2024年02月12日
    浏览(30)
  • 动态识别二维码(树莓派4b + python3 + pyzbar + opencv + 摄像头)

            最近需要做一个 工训物料小车 扫码领取任务的功能,于是使用 树莓派 的摄像头扫码二维码。经过我的多番寻找,发现有个叫pyzbar的库,可以结合opencv,可以做一个 视频动态二维码扫描 。         本文实现的功能: 实现树莓派的二维码扫描         opencv的

    2024年02月14日
    浏览(26)
  • 单目相机测距(3米范围内)二维码实现方案(python代码 仅仅依赖opencv)

    总体思路:先通过opencv 识别二维码的的四个像素角位置,然后把二维码的物理位置设置为 ,相当于这是一个任意找的物体上的四个点,对应的我们找到了在图像中对应的像素坐标。这就解决了世界坐标系与像素坐标系之间的对应问题,然后再通过PNP求解的方式,就可以通过

    2024年02月04日
    浏览(31)
  • Python用opencv实现动态识别二维码,以及加强版Python GUI(图像用户界面编程)

            关于动态识别二维码信息,利用电脑摄像头动态扫描二维码,扫描视频中的二维码。         由于我在项目中设计了一个PC端执行软件,所以用到了GUI编程,即图像用户界面编程,所以把关于这部分的GUI编程取了出来写在了下面。实际上用上面这个程序已经可以识

    2024年02月15日
    浏览(29)
  • OpenCV(三十八):二维码检测

    1.二维码识别原理 功能图形: 位置探测图形:通常,二维码中有三个位置探测图形,呈现L型或大角度十字架形状,分布在二维码的三个角上,用于帮助扫描设备定位二维码的位置和方向。 位置探测图形分隔符:帮助扫描设备区分位置探测图形和二维码的数据区域。 计算模式

    2024年02月07日
    浏览(33)
  • 计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

    🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 物体检测就是对数字图像中一类特定的物体的

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包