【Python】【OpenCV】定位条形码(一)
关于二维码和条形码的检测和识别,在OpenCV中已经有提供了对应的API,cv2.QRCodeDetector() | cv2.barcode_BarcodeDetector() ,相关的实现极其简单:


只需要上述短短三行代码即可检测二维码和条形码的位置并识别码内信息,相关parameter和retval自行查找。
下述是不借助OpenCV直接实现的API来实现定位
Code:
1 def barcode(image):
2 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
3 blur = cv2.GaussianBlur(gray, (5, 5), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
4 cv2.imshow('GaussianBlur', blur)
5 kernel_x = numpy.array([
6 [-1, 0, 1],
7 [-2, 0, 2],
8 [-1, 0, 1]
9 ])
10 kernel_y = numpy.array([
11 [-1, -2, -1],
12 [0, 0, 0],
13 [1, 2, 1]
14 ])
15 x = cv2.filter2D(blur, -1, kernel_x)
16 y = cv2.filter2D(blur, -1, kernel_y)
17 cv2.imshow('Sobel', x)
18 _, threshold = cv2.threshold(x, 127, 255, cv2.THRESH_BINARY)
19 kernel = numpy.ones((3, 3), numpy.uint8)
20 r_e = cv2.erode(threshold, kernel, iterations=1)
21 r_d = cv2.dilate(r_e, kernel, iterations=10)
22 contours, hir = cv2.findContours(r_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
23 max_contour = numpy.array(max(contours, key=cv2.contourArea))
24 x, y, w, h = cv2.boundingRect(max_contour)
25 cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
定位思路:
1、转灰度图
2、通过高斯模糊去除图像噪点,如果不使用高斯模糊去噪的话,条形码的线段会有些弯曲,看场景是否需要

3、使用sobel进行边缘检测,请注意分辨sobel水平变换和垂直变换的差别

4、进行二值化,相比于上一步的sobel,可以发现消除一些独立的噪点,但是还是保留了一些,可以更改参数再进行调整

5、进行形态学运算(膨胀腐蚀)对应代码中的iterations的次数是尝试过后的最佳成效,可以自己调整次数看看不同效果


6、寻找轮廓,通过对原图处理后,我们得到的上述最终的效果图可以发现,最大的白色区域就是我们需要的条形码区域,所以我们通过cv2.contourArea()和max()配合来寻找最大面积,最后在原图上绘制出我们的目标区域

值得注意的是,上述思路有比较大的局限性,首先是针对原图的显示问题,如果不是水平拍摄,是垂直拍摄时,我们需要更改sobel使用垂直变换卷积核,或者对原图进行旋转。
其次是,我们定位最终的barcode区域使用到了max来查找最大面积,所以这就意味着,原图中,barcode整体轮廓必须是最大的。
参考博客:一种改进的条形码定位方案,基于openCV实现,附完整源代码_opencv条形码识别-CSDN博客
【Python】【OpenCV】定位条形码(一)的更多相关文章
- python+opencv实现车牌定位
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三. 由于时间紧张,代码没有进行任何优化, ...
- python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)
概述 车牌识别是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常来讲如果结合opencv进行车牌识别主要分为四个大步骤,分别为: 图像采集 车牌定位 分割车牌字符 字符识别 当然,如果结合了机器 ...
- 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台
搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...
- .NET + OpenCV & Python + OpenCV 配置
最近需要做一个图像识别的GUI应用,权衡了Opencv+ 1)QT,2)Python GUI,3).NET后选择了.NET... 本文给出C#+Opencv和Python+Opencv的相应参考,节省 ...
- RPi 2B python opencv camera demo example
/************************************************************************************** * RPi 2B pyt ...
- Python+OpenCV图像处理(一)
Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...
- python opencv show图片,debug技巧
debug的时候可以直接把图片画出来debug. imshow函数就是python opencv的展示图片的函数,第一个是你要起的图片名,第二个是图片本身.waitKey函数是用来展示图片多久的,默认 ...
- Python+OpenCV图像处理(一)——读取显示一张图片
先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...
- Python+opencv 图像拼接
1.http://www.cnblogs.com/skyfsm/p/7411961.html ,给出了很好地拼接算法实现 2.由于不是Python的,所以简单做了一些翻译转成Python+opencv ...
- 【python+opencv】直线检测+圆检测
Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题
三.用go语言,给出 RANDOMIZED-SELECT的一个基于循环的版本. 文心一言: 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示.这个版本使用 Go 语言编写,利用 ...
- 关于Unity 如何与Blazor Server结合
关于Unity 如何与Blazor Server结合 一.介绍 最近工作中有`Unity`与`Blazor Server`结合的需求,在网上找了一圈,发现这方面的资料比较少,特此写下这篇记录一下自己的 ...
- Apache(2.4.49 2.4.50)--目录遍历--命令执行--(CVE-2021-42013)&&(CVE-2021-41773)
Apache(2.4.49 2.4.50)--目录遍历--命令执行--(CVE-2021-42013)&&(CVE-2021-41773) 复现环境 采用Vulfocus靶场环境进行复 ...
- Go指针探秘:深入理解内存与安全性
Go指针为程序员提供了对内存的深入管理能力,同时确保了代码的安全性.本文深入探讨了Go指针的基础概念.操作.深层理解及其特性与限制.通过深入了解其设计哲学和应用,我们可以更好地利用Go的强大功能. 关 ...
- strimzi实战之二:部署和消息功能初体验
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<strimzi实战>系列 ...
- SpringBoot WebSocket STOMP
SpringBoot WebSocket STOMP 关键词:Springboot, WebSocket, STOMP, broadcast, sendToUser, MessageMapping, ...
- WPF中以MVVM方式,实现RTSP视频播放
前言视频播放在上位机开发中经常会遇到,基本上是两种常见的解决方案 1.采用厂家提供的sdk和前端控件进行展示,常见的海康/大华都提供了相关sdk及文档 2.开启相机onvif协议,捅过rtsp视频流进 ...
- C51单片机开发
C51单片机开发笔记 定时器 C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用. 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信 ...
- 使用Kali Linux进行主机发现实验
主机发现 [实训目的] 掌握主机扫描的工作原理,学会使用ping等扫描工具,发现网络当中活跃的主机. [场景描述] 在虚拟机环境下配置4个虚拟系统"Win XP1" "W ...
- SQL Server事务及隔离级别
事务的并发操作可能出现的问题 中文 英文 描述 脏读 Dirty Reads 事务2读到了事务1未提交的事务,事务1随后回滚,但事务2读到了事务1的"中间数据". 在Read Un ...