基于OpenCV实现二维码发现与定位

在如今流行扫描的年代,应用程序实现二维码扫描检测与识别已经是应用程序的标配、特别是在移动端、如果你的应用程序不能自动发现检测二维码,自动定位二维码你都不好意思跟别人打招呼,二维码识别与解析基于ZXing包即可。难点就在于如何从画面中快速而准确的找到二维码区域,寻找到二维码三个匹配模式点。

一:二维码的结构与基本原理

标准的二维码结构如下:

特别要关注的是图中三个黑色正方形区域,它们就是用来定位一个二维码的最重要的三个区域,我们二维码扫描与检测首先要做的就是要发现这三个区域,如果找到这个三个区域,我们就成功的发现一个二维码了,就可以对它定位与识别了。二维码其它各个部分的说明如下:

三个角上的正方形区域从左到右,从上到下黑白比例为1:1:3:1:1。

不管角度如何变化,这个是最显著的特征,通过这个特征我们就可以实现二维码扫描检测与定位。

二:算法各部与输出

1. 首先把输入图像转换为灰度图像

2. 通过OTSU转换为二值图像

3. 对二值图像使用轮廓发现得到轮廓

4. 根据二维码三个区域的特征,对轮廓进行面积与比例过滤得到最终结果显示如下:

三:程序运行演示与代码实现

下面的图片左侧为原图、右侧为二维码定位结果

程序各个步骤完整源代码如下

#include <opencv2/opencv.hpp>
#include <math.h>
#include <iostream>using namespace cv;
using namespace std;void scanAndDetectQRCode(Mat & image, int index);
bool isXCorner(Mat &image);
bool isYCorner(Mat &image);
Mat transformCorner(Mat &image, RotatedRect &rect);
int main(int argc, char** argv) {/*for (int i = 1; i < 25; i++) {Mat qrcode_image = imread(format("D:/gloomyfish/qrcode/%d.jpg", i));scanAndDetectQRCode(qrcode_image, i);}return 0;*/Mat src = imread("D:/gloomyfish/qrcode_99.jpg");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE);imshow("input image", src);Mat gray, binary;cvtColor(src, gray, COLOR_BGR2GRAY);imwrite("D:/gloomyfish/outimage/qrcode_gray.jpg", gray);threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);imwrite("D:/gloomyfish/outimage/qrcode_binary.jpg", binary);// detect rectangle nowvector<vector<Point>> contours;vector<Vec4i> hireachy;Moments monents;findContours(binary.clone(), contours, hireachy, RETR_LIST, CHAIN_APPROX_SIMPLE, Point());Mat result = Mat::zeros(src.size(), CV_8UC3);for (size_t t = 0; t < contours.size(); t++) {double area = contourArea(contours[t]);if (area < 100) continue;RotatedRect rect = minAreaRect(contours[t]);// 根据矩形特征进行几何分析float w = rect.size.width;float h = rect.size.height;float rate = min(w, h) / max(w, h);if (rate > 0.85 && w < src.cols/4 && h<src.rows/4) {printf("angle : %.2f\n", rect.angle);Mat qr_roi = transformCorner(src, rect);if (isXCorner(qr_roi) && isYCorner(qr_roi)) {drawContours(src, contours, static_cast<int>(t), Scalar(0, 0, 255), 2, 8);imwrite(format("D:/gloomyfish/outimage/contour_%d.jpg", static_cast<int>(t)), qr_roi);drawContours(result, contours, static_cast<int>(t), Scalar(255, 0, 0), 2, 8);}}}imshow("result", src);imwrite("D:/gloomyfish/outimage/qrcode_patters.jpg", src);waitKey(0);return 0;
}

欢迎继续关注本博客,加入OpenCV学习群

基于OpenCV实现二维码发现与定位相关推荐

  1. OpenCV实现二维码发现与定位

    关键点在于如何从图像中快速而准确的找到二维码区域,寻找到二维码三个匹配模式点(定位块). 一:二维码的组成 要关注的是图中三个黑色正方形区域,它们就是用来定位一个二维码的最重要的三个区域,首先要做的就 ...

  2. 基于OpenCV的二维码和条形码识别

    你好啊 今天我们来学习利用OpenCV识别二维码和条形码,首先我们需要准备一个二维码,我准备个两个 接下来我们需要下载几个包,numpy,opencv,和pyzbar(这个工具包可以识别二维码,条形码 ...

  3. 使用 OpenCV + 微信二维码引擎实现二维码识别

    Part1背景 今年自疫情以来,我都没有写过文章.一方面是疫情导致居家办公比较烦躁,另一方面最近有点懒了.但是工作还是要继续,趁这几天优化了一下最近的项目,我整理了一下如何使用 OpenCV 和微信二 ...

  4. 基于zxing的二维码扫描

    前言 现在的应用中二维码扫描已经成为一个应用必不可少的功能,现在大部分Android二维码扫描都是基于zxing和Zbar,这文章就来介绍一下基于zxing的二维码扫描.先看下效果图 虽然现在的关于二 ...

  5. 基于zxing生成二维码

    目录 1.二维码的原理 2.基于zxing生成二维码 3.逻辑及其应用 完整代码:https://github.com/122537067/zxingQRcodeLogoColor 效果图: 1.二维 ...

  6. JAVA实现基于ZXing的二维码自动生成与图片合成

    JAVA实现基于ZXing的二维码自动生成与图片合成 近日做项目需要生成带有信息的二维码,并嵌入到一张图片中.实现思路采用Zxing生成二维码,java图形库进行图片的嵌入. 生成二维码 ZXing是 ...

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

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码: (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维 ...

  8. 基于zxing的二维码扫描(软件界面)

    原文地址:https://www.jianshu.com/p/ee2ee7677831 前言 现在的应用中二维码扫描已经成为一个应用必不可少的功能,现在大部分Android二维码扫描都是基于zxing ...

  9. 通过Java使用opencv识别二维码

    OpenCV的全称是Open Source Computer Vision Library,它是一个跨平台的计算机视觉库,由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费 ...

最新文章

  1. 电脑系统哪个最好用_什么除湿机好用_家用除湿机哪个牌子最好用-装修攻略
  2. Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法
  3. SSD固态存储大观(二)
  4. Spreadsheet Tracking
  5. mac java版本 不一致_mac实现不同版本的jdk切换
  6. git钩子放服务器_如何使用Git 钩子来自动化开发和部署任务
  7. 云之讯api接口php,1. 接口对接
  8. 「leetcode」栈与队列:总结篇!
  9. 简述计算机的四代发展阶段 以及电子器件,2014计算机作业1答案
  10. python学习笔记1
  11. 手机html像素,手机分辨率和网页中的PX是一回事吗?
  12. 实战用Python+Pygame+Kivy(Buildozer)+Ubuntu开发安卓android手机端apk游戏及踩坑分享
  13. AutoCAD二次开发:ObjectArx下的两种命令注册方式
  14. qemu里pci设备的热插拔
  15. SDRAM,DDR1,DDR2,DDR3,DDR4的区别及其特点
  16. 【元胞自动机】保守策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型matlab源码
  17. 解决win7无法默认选择的Everdit程序打开文件
  18. linux redis自动运行,linux设置自启动redis
  19. 【电机驱动与运动控制】考试论述题
  20. 用python帮你看房子

热门文章

  1. 重庆美食地图(绝对霸道)
  2. 人机协作机器人发展趋势_人机协作引领机器人产业新趋势
  3. 职场人做会议记录的法宝——讯飞智能录音笔SR101
  4. 【SAP Basis】SAP用户账号管理
  5. hibernate: 用Disjunction和Conjunction构造复杂的查询条件
  6. 如何防止网站内容被采集
  7. vivox27怎么去掉信息红点_还记得五彩斑斓的黑?vivo X27 Pro获红点奖
  8. 虚拟机增加一块新硬盘
  9. 强化学习1 高斯赛德尔迭代
  10. “金三银四“,敢不敢“试”?