zbar+opencv检测图片中的二维码或条形码
zbar本身自带检测二维码条形码功能,这里使用opencv只是做一些简单的读取图片,灰度图片以及显示条形码和二维码时用到一些绘制
// barcode-qrcodescanner.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <zbar.h>
#pragma comment( lib,"winmm.lib" )
using namespace std; typedef struct
{
string type;
string data;
vector <cv::Point> location;
} decodedObject; // 识别条形码或二维码
void decode(cv::Mat &im, vector<decodedObject>&decodedObjects)
{ // 创建zbar 扫描检测对象
zbar::ImageScanner scanner; // 配置扫描器
scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, ); // 图片转为灰度图
cv::Mat imGray;
cv::cvtColor(im, imGray, cv::COLOR_BGR2GRAY); // 将图片数据转换为zbar图片对象
zbar::Image image(im.cols, im.rows, "Y800", (uchar *)imGray.data, im.cols * im.rows); // 扫描检测
int n = scanner.scan(image); // 打印检测结果
for (zbar::Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol)
{
decodedObject obj; obj.type = symbol->get_type_name();
obj.data = symbol->get_data(); // 检测到的对象类型和数据
cout << "Type : " << obj.type << endl;
cout << "Data : " << obj.data << endl << endl; // 对象所处的位置
for (int i = ; i < symbol->get_location_size(); i++)
{
obj.location.push_back(cv::Point(symbol->get_location_x(i), symbol->get_location_y(i)));
} decodedObjects.push_back(obj);
}
} // 显示条形码和二维码在图片中的区域
void display(cv::Mat &im, vector<decodedObject>&decodedObjects)
{
for (int i = ; i < decodedObjects.size(); i++)
{
vector<cv::Point> points = decodedObjects[i].location;
vector<cv::Point> hull; if (points.size() > )
convexHull(points, hull);
else
hull = points; int n = hull.size(); for (int j = ; j < n; j++)
{
cv::line(im, hull[j], hull[(j + ) % n], cv::Scalar(, , ), );
} } // 显示结果
cv::imshow("Results", im);
cv::waitKey(); } int main(int argc, char* argv[])
{ // opencv读取图片
cv::Mat im = cv::imread("zbar-test.jpg"); vector<decodedObject> decodedObjects; // 查找二维码或条形码
decode(im, decodedObjects); // 显示位置
display(im, decodedObjects); return EXIT_SUCCESS;
}
这里用到zbar所以需要去下载一个zbar库,因为我用的是vs2017并且项目配置的是x64位。这里有个配置好的需要的下载
zbar+opencv检测图片中的二维码或条形码的更多相关文章
- 基于opencv 识别、定位二维码 (c++版)
前言 因工作需要,需要定位图片中的二维码:我遂查阅了相关资料,也学习了opencv开源库.通过一番努力,终于很好的实现了二维码定位.本文将讲解如何使用opencv定位二维码. 定位二维码不仅仅是为了识 ...
- 基于Opencv识别,矫正二维码(C++)
参考链接 [ 基于opencv 识别.定位二维码 (c++版) ](https://www.cnblogs.com/yuanchenhui/p/opencv_qr.html) OpenCV4.0.0二 ...
- javascript利用canvas解析图片中的二维码
本方法两种应用方式:一种使用canvas解析本站图片中的二维码,canvas有同源策略限制,只能处理本站图片.另一种处理文件选择中的图片二维码. 第一种使用场景可以换成像微信中一样,长按图片识别二维码 ...
- 【Demo】 生成二维码 和 条形码
条形码 和 二维码 对比 一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准. 在水平和垂直方向的二维空间存储信息的条形码, 称为 ...
- android 项目学习随笔二十一(IM、语音识别、机器人、统计、扫描二维码、条形码)
语音识别:科大讯飞语音云 http://www.xfyun.cn/ 语音机器人模拟 public class TalkBean { public String text; public boolean ...
- Android二维码开源项目zxing用例简化和生成二维码、条形码
上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...
- iOS - 原生的CIFilter生成二维码和条形码
使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...
- iOS8 生成二维码与条形码
iOS8 生成二维码与条形码 效果图: 源码: // // ViewController.m // CodeCreator // // Created by YouXianMing on 15/3/1 ...
- iOS二维码、条形码生成(可指定大小、颜色)
一.前言: iOS7.0之后可以利用系统原生 API 生成二维码, iOS8.0之后可以生成条形码, 系统默认生成的颜色是黑色. 在这里, 利用以下方法可以生成指定大小.指定颜色的二维码和条形码, 还 ...
随机推荐
- 深入Oracle的left join中on和where的区别详解
-- from http://blog.itpub.net/30175262/viewspace-1472060/ 今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期 ...
- 如何删除Word自动编号后文字和编号之间的空白距离
一.出现的现象:使用word进行自动编号之后,编号和其后的文字出现如下图所示的空白 二.如何解决问题 选中列表内容右键->调整列表缩进->选择“编号之后(W)"为不特别标注-&g ...
- 基于 WebSocket 的聊天和大文件上传(有进度提示)完美实现
大家好,好久没有写文章了,当然不是不想写,主要是工作太忙,公司有没有网络环境,不让上网,所以写的就少了.今天是2019年的最后一天,明天就要开始新的一年,当然也希望自己有一个新的开始.在2019年的最 ...
- $Noip2016/Luogu2822$ 组合数问题
$Luogu$ 看这题题解的时候看到一个好可爱的表情(●'◡'●)ノ♥ $Sol$ 首先注意到这题的模数是$k$.然而$k$并不一定是质数,所以不能用$C_n^m=\frac{n!}{m!(n-m)! ...
- 集合排序Comparable和Comparator有什么区别?
Comparable和Comparator兄弟俩长得是真像.但是,需要注意下,使用中它们还是有不少区别的.下面,就一探究竟吧. 一.Comparator 做过集合排序的童鞋应该知道,可以使用Colle ...
- 侠说java8-行为参数化(开山篇)
啥是行为参数化 行为参数化的本质是不执行复杂的代码块,让逻辑清晰可用. 相信使用过js的你肯定知道,js是可以传递函数的,而在 java中也有类似的特性,那就是匿名函数. 理解:行为参数化是一种方法, ...
- ASP.Net Core 3.0 中使用JWT认证
JWT认证简单介绍 关于Jwt的介绍网上很多,此处不在赘述,我们主要看看jwt的结构. JWT主要由三部分组成,如下: HEADER.PAYLOAD.SIGNATURE HEADER包 ...
- Django之models高级进阶技术详解
目录 一.常用字段 1.AutoField 2.IntegerField 3.CharField 4.自定义及使用char 5.DateField 6.DateTimeField 二.字段合集 三.字 ...
- Http GetPost网络请求
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System ...
- Promise里的代码为什么比setTimeout先执行
当浏览器或者Node拿到一段代码时首先做的就是传递给JavaScript引擎,并且要求它去执行. 然而,执行 JavaScript 并非一锤子买卖,宿主环境当遇到一些事件时,会继续把一段代码传递给 J ...