开发者社区> 贾志刚> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 基于OpenCV实现二维码发现与定位 在如今流行扫描的年代,应用程序实现二维码扫描检测与识别已经是应用程序的标配、特别是在移动端、如果你的应用程序不能自动发现检测二维码,自动定位二维码你都不好意思跟别人打招呼,二维码识别与解析基于ZXing包即可。
+关注继续查看

基于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 now
    vector<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学习群

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
网站启用 https ,申请免费的SSL证书的方法
现在网站没有不启用 https 的,SSL证书是网站启用https加密访问的关键要素,为了加强网络安全防护,现在大部分网站都会部署有效的ssl安全证书,以实现服务器身份验证和数据加密传输功能。网站使用的SSL证书一般是需要付费购买的,不同品牌不同类型的SSL证书购买价格往往会有所差异,一年费用从几百到上万元不等。如果您想申请便宜的ssl证书,则可以来看看下面这几款性价比高的SSL证书推荐。
19 0
Opencv+ZBar识别条形码、二维码
Opencv+ZBar识别条形码、二维码
19 0
实战-全局唯一邀请码功能实现
实战-全局唯一邀请码功能实现
377 0
分享几个免费申请SSL证书的网站
SSL证书(SSL Certificates)为网站和移动应用(APP)提供HTTPS保护,对流量加密,防止数据被窃取。
1119 0
如何申请阿里云免费SSL证书(可用于https网站)并下载下来
前提条件:你要有阿里云的账号,并且要有一个域名。注意:阿里云系统也在不断更新,界面以后可能会有稍许变化,但是原理是相通的。 具体步骤: 1.登录到阿里云后台,并选择 “SSL证书(应用安全)” 菜单 2.点击购买证书按钮 3.选择免费型DV SSL,Symantec,点击立即购买按钮。
7628 0
二维码
二维码 Zxing (一个二维码开源框架) barcodescanner (使用的App有:薄荷) BGAQRCode-Android (扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式...
896 0
Qt之二维码扫描
简述 二维码(QR Code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的。是所有信息数据的一把钥匙。应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、wifi共享等。 二维条码常用的码制: Data Matrix、MaxiCode、Aztec
3173 0
实现网站二维码扫描登录
  实现网站二维码扫描登录 分类: 架构设计2014-03-31 10:33 14613人阅读 评论(6) 收藏 举报 在尝试使用网页版微信时,发现微信的登录方式比较酷。区别与常用的用户名和密码的登录方式,网页微信登录只需要轻轻一扫,即可方便的实现登录功能。
994 0
[20111214]oradebug快速定位有问题的sql语句
[20111214]oradebug快速定位有问题的sql语句oradebug自己平时很少使用,但是使用它定位有问题的sql还是非常快捷的,记录如下:例子:1.
717 0
+关注
贾志刚
2004毕业于山东大学齐鲁软件学院,软件工程专业。主要专注于图像处理算法学习与研究,计算机视觉技术开发应用,深度学习在计算机视觉领域应用。两本书籍《Java数字图像处理-编程技巧与应用实践》、《OpenCV On Android编程实践》作者
252
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载