OpenCV(三十八):二维码检测

1.二维码识别原理

功能图形:

  1. 位置探测图形:通常,二维码中有三个位置探测图形,呈现L型或大角度十字架形状,分布在二维码的三个角上,用于帮助扫描设备定位二维码的位置和方向。

  2. 位置探测图形分隔符:帮助扫描设备区分位置探测图形和二维码的数据区域。

  3. 计算模式:通常是一个小的正方形图案,用于校准扫描设备以捕捉和解码二维码的图像。

  4. 对齐标记:通常是一系列小的正方形图案,用于帮助扫描设备在不同的距离和角度下更好地对准和解码二维码。

编码区格式:

  1. 格式信息:格式信息用于指定二维码的编码格式和纠错级别。

  2. 版本信息:版本信息指定了二维码的大小和数据容量。。

  3. 数据和纠错码:编码区还包含实际的数据和纠错码。

2.二维码定位函数与识别函数

二维码定位函数 detect()

复制代码
bool detect(InputArray img, OutputArray points) const;
  • img: 待检测是否含有QR二维码的灰度图像或者彩色图像。
  • points: 包含QR二维码的最小区域四边形的四个顶点坐标,即二维码的四个顶点坐标。

二维码识别函数decode()

std::string decode(InputArray img, InputArray points, OutputArray straight_code = noArray()) const;

  • img:含有QR二维码的图像。
  • points:包含QR二维码的最小区域四边形的四个顶点坐标。
  • straight qrcode:经过校正和二值化的OR二维码。

示例代码:

复制代码
void qrcode(Mat image){
    Mat gray,qrcode_bin;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    QRCodeDetector qrCodeDetector;
    vector<Point> points;
    string information;
    bool isQRcode;
    isQRcode=qrCodeDetector.detect(gray,points);//识别二维码
    if(isQRcode){
        //解码二维码
        information=qrCodeDetector.decode(gray,points,qrcode_bin);
    }else{
        LOGD("无法识别二维码");
    }
    //绘制二维码的边框
    for(int i=0;i<points.size();i++){
        if(i==points.size()-1) {
            line(image, points[i], points[0], Scalar(0, 0, 255, 255), 2, 8);
            break;
        }
        line(image,points[i],points[i+1],Scalar(0,0,255,255),2,8);
    }
    //将解码内容输出到图片上
    putText(image,information.c_str(),Point(20,30),2,1,Scalar(0,0,255,255),8);
    //显示图像
    imwrite("/sdcard/DCIM/image.png",image);
    imwrite("/sdcard/DCIM/qrcode_bin.png",qrcode_bin);
}

输出图片:

经过校正和二值化的OR二维码:

3.二维码直接定位与识别函数detectAndDecode()

std::string cv::QRCodeDetector::detectAndDecode ( InputArray img,

OutputArray points = noArray(),

OutputArray straight qrcode = noArray()

)

  • img:含有QR二维码的图像
  • points: 包含QR二维码的最小区域四边形的四个顶点坐标
  • straight_qrcode:经过校正和二值化的OR二维码

示例代码:

复制代码
//利用函数直接定位二维码并解码
void qrcode2(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    QRCodeDetector qrCodeDetector;
    vector<Point> points;
    string information;
    information=qrCodeDetector.detectAndDecode(gray,points);
    //将解码内容输出到图片上
    putText(image,information.c_str(),Point(20,30),2,1,Scalar(0,0,255,255),8);
    //显示图像
    imwrite("/sdcard/DCIM/image2.png",image);
}

输出图片:

相关推荐
EMA20 分钟前
MaxKB 技术解析文档
人工智能
湘美书院--湘美谈教育20 分钟前
湘美谈教育AI赋能系列经验集锦:学好唐诗宋词的点滴心得体会
大数据·人工智能·深度学习·神经网络·机器学习
触底反弹25 分钟前
拷个 .exe 到新电脑就跑不起来?你缺的不是文件,是对链接的理解
c++·windows·操作系统
迦蓝叶26 分钟前
【开源自荐】JAiRouter:一个轻量级 AI 模型服务网关的开源实践
java·人工智能·spring·开源·llm-gateway·mass
Java知识技术分享34 分钟前
opencode安装ui-ux-pro-max和frontend-ui-ux技能
人工智能·ui·个人开发·ai编程·ux
苏映视官方账号40 分钟前
精品案例丨方寸之间,“微” 毫毕现 —— 圆刀机高精度检测工艺优化实例
人工智能·数码相机·视觉检测·制造
Cloud_Shy61842 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
Sammyyyyy42 分钟前
月之暗面 Kimi Code 0.4.0 发布,终端 AI 编码助手全面采用 TypeScript,实现毫秒级启动
前端·javascript·人工智能·ai·typescript·servbay
装不满的克莱因瓶42 分钟前
掌握生成对抗网络(GAN)的优化目标与评估指标——从博弈函数到生成质量衡量体系
人工智能·python·深度学习·算法·机器学习
whyfail1 小时前
小米 MiMo Code 开源:能免费用 2.5 模型的 AI 编程 Agent
人工智能