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

2023-09-12 14:25:57

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);
}

输出图片:

更多推荐

【码银送书第七期】七本考研书籍

八九月的朋友圈刮起了一股晒通知书潮,频频有大佬晒出“研究生入学通知书”,看着让人既羡慕又焦虑。果然应了那句老话——比你优秀的人,还比你努力。心里痒痒,想考研的技术人儿~别再犹豫了。小编咨询了一大波上岸的大佬,这份备考书单给大家参考。专业课(此处特指408,全称计算机专业基础综合)知识点超级多,题目灵活,数据结构、计算机

考研408 | 【计算机组成原理】 数据的表示和运算

进位计数制十进制计数法:推广:r进制计数法任意进制-->十进制:二进制<-->八进制、十六进制:各种进制的常见书写方式:十进制-->任意进制:十进制-->二进制(拼凑法):真值和机器数:总结:BCD码总结:无符号整数的表示和运算无符号整数在计算机中的应用:无符号整数的表示:无符号整数的加法运算:无符号整数的减法运算:总

uniapp运行到IOS真机提示 错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配

参考文章:请查看是否设备未加入到证书列表或者确认证书类型是否匹配ios开发描述文件必须绑定调试设备,只有授权的设备才可以直接安装基座,所以在申请开发描述文件之前,先添加调试的IOS设备。前往网站https://developer.apple.com,在Devices中,添加手机设备UUID第一步:登录第二步:检查设备列

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOSTSCSI设备的模拟是由QEMU和HOST共同实现的,QEMU模拟VHOSTSCSI设备配置空间等,而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。在QEMU中VHOSTSCSI设备继承关系如下:其它设备以及对应class_init函数和realize具现化实现与VIRTIO-SCSI一致,

Learn Prompt-为什么用 ChatGPT API?

引用人工智能先驱吴恩达先生说过的话:“一个系统需要的远不止一个提示(prompt)或者一个对LLM(大性语言模型)的调用。”API的优点:集成更深:通过API,您可以将ChatGPT集成到自己的系统和工作流中,实现更深层次的定制和控制。个性化的响应:您可以根据特定需求和场景调整模型的响应,例如,通过改变温度(tempe

华策影视AIGC工程师招聘; 百度大模型创业松;主流大语言模型的技术原理细节;AIGC Prompt的七个缺陷 | ShowMeAI日报

👀日报&周刊合集|🎡生产力工具与行业应用大全|🧡点赞关注评论拜托啦!🎯华策影视AIGC工程师招聘,AIGC在「文娱领域」的真正落地逛即刻时发现关注的AI博主@杨昌发布了自己公司的招聘信息,而且附上了团队氛围和工作感受等分享。华策影视是影视行业龙头企业,成立了AIGC应用研究院,重视AI且不算卷。岗位base上海

Learn Prompt-ChatGPT 精选案例:学习各国语言

过去,我们学语言需要花费很多时间来学习各种材料,再联系老师修改口语、作文等,十分费时费力。有了ChatGPT之后,我们就相当于有一个免费的,实时反馈的语言学习助手,大大节省了我们的时间。下面我将以英文的雅思学习为例子,结合口语和写作,介绍如何利用ChatGPT来学习语言。口语​插件安装​正式开始之前,我们要先完成插件的

安防监控系统/视频云存储/视频监控平台EasyCVR无法级联上级平台,该如何解决?

安防视频监控系统EasyCVR平台能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控管理平台EasyCVR支持多种播放协议,包括:HLS、HTTP-F

【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...

全文下载链接:http://tecdat.cn/?p=23544在本文中,长短期记忆网络——通常称为“LSTM”——是一种特殊的RNN递归神经网络,能够学习长期依赖关系(点击文末“阅读原文”获取完整代码数据)。本文使用降雨量数据(查看文末了解数据免费获取方式)进行分析。视频:LSTM神经网络架构和工作原理及其在Pyth

Zynq UltraScale+ XCZU3EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录1、前言免责声明2、我这里已有的MIPI编解码方案3、本MIPICSI2模块性能及其优越性4、详细设计方案设计原理框图IMX214摄像头及其配置D-PHY模块CSI-2-RX模块Bayer转RGB模块伽马矫正模块VDMA图像缓存VideoScaler图像缓存DP输出5、vivado工程详解PL端FPGA硬件设计PS

云原生服务无状态(Stateless)特性的实现

文章目录为何要使用无状态服务?无状态服务的实现方法1.会话状态外部化2.负载均衡3.自动伸缩4.容器编排5.数据存储6.安全性示例:使用SpringBoot实现无状态服务结论🎉欢迎来到云计算技术应用专栏~云原生服务无状态(Stateless)特性的实现☆*o(≧▽≦)o*☆嗨~我是IT·陈寒🍹✨博客主页:IT·陈寒

热文推荐