基于Opencv识别,矫正二维码(C++)
参考链接
[ 基于opencv 识别、定位二维码 (c++版)
](https://www.cnblogs.com/yuanchenhui/p/opencv_qr.html)
OpenCV4.0.0二维码识别代码简析
1.使用Qrdetector实现二维码检测
opencv中的QRCodeDetector类可以实现二维码的定位,识别功能,由于本项目使用的是自己设计的二维码,因此暂时只使用到QRCodeDetector的检测功能
函数接口
bool detect (InputArray img, OutputArray points) const
使用示例
QRCodeDetector dec;
vector<Point2f> list;
dec.detect(src, list);
原图
将list画出后,得到
优缺点
优点: 检测快速方便,速度较快,代码量少
缺点:准确率不高,有的时候标准的二维码也会检测失效
错误示例
2.使用轮廓检测算法实现二维码检测
思路
1.将彩图转换为灰度图
cvtColor(image, dstGray, COLOR_BGR2GRAY);
- 将灰度图使用二值化方法,转换为黑白
也可以直接使用Canny算法进行边缘提取
OTSU算法更适合色偏较大的二维码,能够实现准确的二值化
threshold(dstGray, dstGray, 100, 255, THRESH_BINARY);
或 threshold(srcGray, srcGray, 188, 255, THRESH_BINARY|THRESH_OTUS );
- 轮廓查找
进行轮廓层级查找,并进行层级判断,当嵌套层级大于2时,有可能为定位点
关于轮廓查找的参考文档
轮廓层级>2的条件不够强,如果环境光较为自然的话,可以把条件改成>5。某处光源过强,会照成提取出来的轮廓撕裂,这时要额外增加判断条件。具体做法参考开头的文档一
contours, hierarchy = cv2.findContours(srcGray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
hierarchy = hierarchy[0]
found = []
for i in range(len(contours)):
k = i
c = 0
while hierarchy[k][2] != -1:
k = hierarchy[k][2]
c = c + 1
if c >= 2:
found.append(i)
foundContours = [contours[i] for i in found]
效果
增强判断条件后,只会检测到周围三个定位点
3.使用透视变换矫正二维码
1. 使用QRdetector得到的Point进行透视变换
透视变换参考
假设正常二维码的大小为(ROW,COL)
vector<Point2f> dstTri;
dstTri.push_back(Point2f( 0,0 ));
dstTri.push_back(Point2f( 0,COL-1 ));
dstTri.push_back(Point2f( ROW-1,COL-1));
dstTri.push_back(Point2f( ROW-1,0 ));//创建目的点
Mat warp_mat = getPerspectiveTransform(list, dstTri);//得到旋转矩阵
warpPerspective(src, output, warp_mat, srcImg.size());//对src进行透视变幻
经过透视变换结果
2. 通过二维码定位点的中点进行透视变换
由于qrcodetect类经常出错,为了解决此问题,只能使用轮廓查找定位二维码,但因为轮廓查找只找出三个定位点,无法透视变换,因此项目中二维码需要额外增加一个定位点(标准的二维码也不只3个定位点
- 通过minAreaRect方法生成轮廓的最小外接矩形
- 计算四个矩形中点,与对应的原图四个定位点中点进行透视变换
代码如下
RotatedRect rect = minAreaRect((contour2[i]));//生成某一定位点轮廓的最小外接矩形
M = cv2.moments(cnt) # 计算第一条轮廓的各阶矩,字典形式
center_x = int(M["m10"] / M["m00"])
center_y = int(M["m01"] / M["m00"])
center_point.append((center_x,center_y))
# 使用矩方法来计算中点
对四个中点按指定顺序进行排序,并做透视变换
效果与使用Qrdetector的point进行透视变换类似
warpPerspective(srcGray, output, warp_mat, srcGray.size());
基于Opencv识别,矫正二维码(C++)的更多相关文章
- 基于opencv+python的二维码识别
花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...
- 【转】Delphi+Halcon实战一:两行代码识别QR二维码
Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...
- zxing 如何识别反转二维码
说起二维码扫描,估计很多人用的是 zxing 吧. 然而 zxing 虽然好用,但是却有一些坑. 这边分析一下自己实际项目遇到的一个坑. 什么坑呢? 下面举个栗子你就懂了. 这边生成二维码使用的是网络 ...
- Opencv+Zbar二维码识别(二维码校正)
二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处:http://blog.csdn.net/xiaanming/article/detail ...
- 在Android上使用ZXing识别条形码/二维码
越来越多的手机具备自动对焦的拍摄功能,这也意味着这些手机可以具备条码扫描的功能.......手机具备条码扫描的功能,可以优化购物流程,快速存储电子名片(二维码)等. 本文使用ZXing 1.6实现条码 ...
- 【转】Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果--不错
原文网址:http://blog.csdn.net/xiaanming/article/details/10163203 转载请注明出处:http://blog.csdn.net/xiaanming/ ...
- qrcode.js的识别解析二维码图片和生成二维码图片
qrcode只通过前端就能生成二维码和解析二维码图片, 首先要引入文件qrcode.js,下载地址为:http://static.runoob.com/download/qrcodejs-04f46c ...
- PHP基于phpqrcode类生成二维码的方法详解
前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是 ...
随机推荐
- ansible使用file模块管理受控机的目录与文件(ansible2.9.5)
一,ansible的file模块的用途 file 模块实现对文件的基本操作. 例如: 创建文件或目录 删除文件或目录 修改文件权限等 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...
- 【认知服务 Azure Cognitive Service】使用认知服务的密钥无法访问语音服务[ErrorCode=AuthenticationFailure] (2020-08时的遇见的问题,2020-09月已解决)
问题情形 根据微软认知服务的文档介绍,创建认知服务(Cognitive Service)后,可以调用微软的影像(计算机视觉,人脸),语言(LUIS, 文本分析,文本翻译),语音(文本转语音,语音转文本 ...
- 面试题 02.02. [链表][双指针]返回倒数第 k 个节点
面试题 02.02. 返回倒数第 k 个节点 方法一:使用外部空间 // 执行用时: 1 ms , 在所有 Java 提交中击败了 16.75% 的用户 // 内存消耗: 36.8 MB , 在所有 ...
- oracle sql developer 启动java.exe设置错误
1.找到oracle安装目录下的jdk,如:E:\app\Administrator\product\11.2.0\dbhome_1\jdk 2.找到oracle安装目录下的developer路径:E ...
- springcloud中使用dubbo开发rpc服务及调用
spring cloud中基于springboot开发的微服务,是基于http的rest接口,也可以开发基于dubbo的rpc接口. 一,创建goodsService模块 1, 在创建的goodsSe ...
- Linux机器之间SSH免密钥登录设置
SSH免密钥登录 私钥:密钥留在本机 公钥:密钥发给其他机 hadoop01 生成密钥: ssh-keygen -t rsa (密钥存放路径:/root/.ssh) id_rsa:私钥 id_rsa. ...
- Windows2008R2+ IIS7.5+php+mysql 搭建教程
Windows2008R2+ IIS7.5+php+mysql 搭建教程 1. IIS7.5安装安装角色时候因为 Fastcgi 的需要, aspnet 和 asp 都要选装. 我为了方便,所有的除 ...
- 基于 opencv 的图像处理入门教程
前言 虽然计算机视觉领域目前基本是以深度学习算法为主,但实际上很多时候对图片的很多处理方法,并不需要采用深度学习的网络模型,采用目前成熟的图像处理库即可实现,比如 OpenCV 和 PIL ,对图片进 ...
- Luogu P2173 [ZJOI2012]网络
题意 写的比较清楚,我就不解释了. \(\texttt{Data Range:}n\leq 10^4,m\leq 10^5,c\leq 10,k\leq 10^5\) 题解 注意到 \(c\) 的范围 ...
- 04 . Go+Vue开发一个线上外卖应用(用户名密码和图形验证码)
图形化验证码生成和验证 功能介绍 在使用用户名和密码登录功能时,需要填写验证码,验证码是以图形化的方式进行获取和展示的. 验证码使用原理 验证码的使用流程和原理为:在服务器端负责生成图形化验证码,并以 ...




