VC++ OpenCV+ZBar二维码识别

2023-11-18

利用OpenCV处理图像的优势,结合ZBar提高二维码识别结果。

接口定义:

#include <vector>
#include <algorithm>
#include <string>
#include <math.h>
#include <iostream>
#include<map>

#include <cv.h>
#include <highgui.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#ifdef _DEBUG
#pragma comment(lib, "opencv_world300d.lib")
#else
#pragma comment(lib, "opencv_world300.lib")
#endif

#include <zbar.h>
using namespace zbar;
#pragma comment(lib, "libzbar-0.lib")

using namespace cv;
using namespace std;

namespace QRCode{

    std::string GetQRInBinImg(Mat binImg);
    std::string ZbarDecoder(Mat img);

    //对二值图像进行识别,如果失败则开运算进行二次识别
    std::string GetQR(Mat img)
    {
	    Mat binImg;
	    Mat adaptiveImg;
	    double thre = threshold(img, binImg, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY_INV);//threshold 第一个参数即原图像必须为灰度图
	    std::string result;
	    result = GetQRInBinImg(binImg);
	    if(result.empty())//如果阈值otsuthreshold失败,则采用高斯自适应阈值化,可以识别出一定的控制阈值也识别不出来的二维码
	    {
		    cv::adaptiveThreshold(img, adaptiveImg, 255, ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 33, 0);//threshold第一个参数即原图像必须为灰度图,最佳33
		    result = GetQRInBinImg(adaptiveImg);
	    }

	    thre = thre/2;//ostu和自适应阈值都失败,将从ostu阈值的一般开始控制阈值不断增长
	    while (result.empty() && thre<255)
	    {
		    threshold(img, binImg, thre, 255, cv::THRESH_BINARY);
		    result = GetQRInBinImg(binImg);
		    thre += 5;//阈值步长设为5,步长越大,识别率越低,速度越快
	    }
	    return result;
    }

    //主函数
    std::string GetQRInBinImg(Mat binImg)
    {    
	    std::string result = ZbarDecoder(binImg);
	    if (result.empty())
	    {
		    Mat openImg;
		    Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
		    morphologyEx(binImg, openImg, MORPH_OPEN, element);
		    result = ZbarDecoder(openImg);
	    }
	    return result;
    }
 
    //zbar接口
    std::string ZbarDecoder(Mat img)
    {
	    float point[8];
	    string result;
	    std::string res;
	    ImageScanner scanner;
	    const void *raw = (&img)->data;
	    scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
	    Image image(img.cols, img.rows, "Y800", raw, img.cols * img.rows);
	    int n = scanner.scan(image);
	    Image::SymbolIterator symbol = image.symbol_begin();
	    res = image.symbol_begin()->get_data();
	    cout << res.c_str() << endl;
	    image.set_data(NULL, 0);
	    return res;
    }

}

测试用例:

cv::Mat src = cv::imread("1.bmp");
Mat imageGray;
cvtColor(src, imageGray, CV_RGB2GRAY);
string ret = QRCode::GetQR(imageGray);
if ( !ret.empty() )
{
	TRACE("图片识别结果...[%s]\n", ret.c_str());
}
else
{
	TRACE("未识别");
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC++ OpenCV+ZBar二维码识别 的相关文章

  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O

随机推荐

  • 查新报告怎么写?

    一 查新报告怎么写 二 查新报告怎么查 查新报告一般是在查新机构里查 这里给大家推荐一个权威的专业查新机构 掌桥科研 掌桥科研是一家中国的科技信息服务公司 总部位于北京市 公司的主营业务是为中国的科学研究机构 大学 企业等提供科研数据和技术
  • 个人银行管理系统6(C改Java)

    C语言版本 date h ifndef DATE H define DATE H class Date 日期类 private int year 年 int month 月 int day 日 int totalDays 该日期是从公元元年
  • vue项目中跳转到外部链接方法

    div 点我 div goPage url window location href url 直接跳转去外部的a链接
  • 关于Keil中Memory中观察不到数据变化的问题以及启动文件栈的初始化

    关于Keil中Memory中观察不到数据变化的问题 在KEIL中观察Memory数据变化 一定要记得只能在RAM地址或ROM之内观察 如下图所示 RAM的地址设置在地址为0x20000000开始的地方 大小为0x20000 因此只有在这个范
  • gorm+docker+mysql

    简介 ORM Object Relational Mapping 框架采用元数据来描述对象与关系映射的细节 元数据一般采用XML格式 并且存放在专门的对象一映射文件中 简单理解为一种框架的格式 gorm是Golang中一个非常出色的 旨在对
  • 38个MySQL数据库的小技巧

    1 如何快速掌握MySQL 培养兴趣 兴趣是最好的老师 不论学习什么知识 兴趣都可以极大地提高学习效率 当然学习MySQL 5 6也不例外 夯实基础 计算机领域的技术非常强调基础 刚开始学习可能还认识不到这一点 随着技术应用的深 入 只有有
  • java之MySQL数据库

    MySQL数据库 1 什么是数据库 答 数据库是以一定方式存储在一起 能予多个用户共享 具有尽可能小的冗余度 与应用程序彼此独立的数据集合 2 数据库的分类 具体含义 常见的数据库 答 关系型数据库和非关系型数据库 关系数据库 是建立在关系
  • springCloud - 第10篇 - 服务间调用追踪 (zipkin 的使用)

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 一 在微服务系统中 不同应用服务可能会有各种不同的相互调用 springcloud 集成了 zipkin 来实现对于不同服务调用的追踪和统计
  • LIBSVM 使用

    预备 NTU TW Chih Chung Chang and Chih Jen Lin LIBSVM LIBSVM Data Classification Regression and Multi label 正文 a 编译libsvm u
  • 【机器学习】决策树 No.3

    1 决策树之信息论基础 决策树思想来源非常朴素 程序设计中的条件分支结构 if else 最早的决策树就是利用这类结构分割数据的一种分类学习方法 例 银行贷款例子 使用决策树划分是否贷款 此处特征为两个 房子 工作 香农 信息论创始人 19
  • 一文带你了解ES6迭代器(iterator)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 迭代器 iterator 是什么 二 工作原理 总结 一 迭代器 iterator 是什么 迭代器 iterator 是一种接口 为各种不同的数据结构提供统一的
  • SkipList(跳表)

    跳表简介 跳表是基于有序链表实现的搜索结构 是一种动态的搜索结构 即支持动态插入和删除操作 且跳表查找和删除的平均时间复杂度是Olog n 因此跳表是一种时间复杂度相对较小的搜索结构 我们知道对一个数据集合的查找 最差的时间复杂度是O n
  • Switch / Xbox / PS / PSV / PSP 游戏指南

    1 Switch Xbox PS PSV PSP 对比分析 table 1 PSV2000 1000 比较分析 PSV2000 相对 PSV1000 具体变更点 薄了20 轻了15 屏幕改为液晶屏 PS键 开始键和选择键变成球形更方便按 内
  • 2,一个人体姿态识别的项目实现

    学习opencv的例子 1 认识 2 start 直接干货 例子1 例子2 例子3 例子4 例子5 固定阈值 自适应阈值 文档说明 参考链接 http codec wang opencv start 02 basic element ima
  • git仓库创建及上传

    如何创建一个git仓库并上传代码 1 在此之前我们需要安装git和注册gitee账号 1 打开git官网下载安装程序 然后按照指令进行安装即可 2 搜索gitee进行注册和绑定邮箱即可 上传代码时需要登录gitee账号 安装成功之后告诉本地
  • Android apk 反编译解析

    学习android开发 有必要对android的反编译有所了解 当然学习android反编译并不是为了破解别人的软件 完全是一种学习的方法 了解别人写程序的思想是一件很有趣的事情 工具下载地址 http code google com p
  • androidstudio开发!花三分钟看完这篇文章你就懂了!技术详细介绍

    阿里面试 自我介绍 首先要介绍自己的项目经验和个人的擅长点 因为面试官主要考察你的表达能力和语言精简能力 简历的编写其实这里可能需要注意几点 1 标题的直接按照姓名 几年工作经验 应聘岗位格式来填写 例如 黄铭 四年工作经验 Android
  • STP与RSTP区别

    STP 不能快速迁移 即使是在点对点链路或边缘端口 边缘端口指的是该端口直接与用户终端相连 而没有连接到其它设备或共享网段上 也必须等待2 倍的ForwardDelay 的时间延迟 端口才能迁移到转发状态 RSTP Rapid Spanni
  • Python 异步: 异步上下文管理器(17)

    动动发财的小手 点个赞吧 上下文管理器是一种 Python 构造 它提供了一个类似 try finally 的环境 具有一致的接口和方便的语法 例如通过 with 表达 它通常与资源一起使用 确保在我们完成资源后始终关闭或释放资源 无论资源
  • VC++ OpenCV+ZBar二维码识别

    利用OpenCV处理图像的优势 结合ZBar提高二维码识别结果 接口定义 include