OpenCV每日函数之BarcodeDetector类条码检测器
作者:坐望云起 发布时间:2023-03-28 02:22:39
标签:OpenCV,条码,检测,识别
一、概述
OpenCV在V4.5.3版本的contrib包中提供了一个barcode::BarcodeDetector类,用于条形码的识别。
二、类参考
1、函数原型
构造方法
cv::barcode::BarcodeDetector::BarcodeDetector(const std::string & prototxt_path = "",
const std::string & model_path = ""
)
decode方法
bool cv::barcode::BarcodeDetector::decode(InputArray img,
InputArray points,
std::vector< std::string > & decoded_info,
std::vector< BarcodeType > & decoded_type
)
detect方法
bool cv::barcode::BarcodeDetector::detect(InputArray img,
OutputArray points
)
detectAndDecode方法
bool cv::barcode::BarcodeDetector::detectAndDecode(InputArray img,
std::vector< std::string > & decoded_info,
std::vector< BarcodeType > & decoded_type,
OutputArray points = noArray()
)
2、参数详解
img | 包含条形码的灰度或彩色 (BGR) 图像。 |
decoded_info | UTF8 编码的字符串输出向量或字符串的空向量(如果代码无法解码)。 |
decoded_type | BarcodeType 的向量,指定这些条形码的类型 |
points | 找到的条形码矩形的顶点的可选输出向量。 如果找不到,则为空。 |
支持的条形码类型如下。
enum cv::barcode::BarcodeType {
cv::barcode::NONE,
cv::barcode::EAN_8,
cv::barcode::EAN_13,
cv::barcode::UPC_A,
cv::barcode::UPC_E,
cv::barcode::UPC_EAN_EXTENSION
}
三、OpenCV源码
1、源码路径
opencv_contrib\modules\barcode\src\barcode.cpp
2、源码代码
bool BarcodeDetector::detect(InputArray img, OutputArray points) const
{
Mat inarr;
if (!checkBarInputImage(img, inarr))
{
points.release();
return false;
}
Detect bardet;
bardet.init(inarr);
bardet.localization();
if (!bardet.computeTransformationPoints())
{ return false; }
vector<vector<Point2f>> pnts2f = bardet.getTransformationPoints();
vector<Point2f> trans_points;
for (auto &i : pnts2f)
{
for (const auto &j : i)
{
trans_points.push_back(j);
}
}
updatePointsResult(points, trans_points);
return true;
}
bool BarcodeDetector::decode(InputArray img, InputArray points, vector<std::string> &decoded_info,
vector<BarcodeType> &decoded_type) const
{
Mat inarr;
if (!checkBarInputImage(img, inarr))
{
return false;
}
CV_Assert(points.size().width > 0);
CV_Assert((points.size().width % 4) == 0);
vector<vector<Point2f>> src_points;
Mat bar_points = points.getMat();
bar_points = bar_points.reshape(2, 1);
for (int i = 0; i < bar_points.size().width; i += 4)
{
vector<Point2f> tempMat = bar_points.colRange(i, i + 4);
if (contourArea(tempMat) > 0.0)
{
src_points.push_back(tempMat);
}
}
CV_Assert(!src_points.empty());
vector<Mat> bar_imgs = p->initDecode(inarr, src_points);
BarDecode bardec;
bardec.init(bar_imgs);
bardec.decodeMultiplyProcess();
const vector<Result> info = bardec.getDecodeInformation();
decoded_info.clear();
decoded_type.clear();
bool ok = false;
for (const auto &res : info)
{
if (res.format != NONE)
{
ok = true;
}
decoded_info.emplace_back(res.result);
decoded_type.emplace_back(res.format);
}
return ok;
}
bool
BarcodeDetector::detectAndDecode(InputArray img, vector<std::string> &decoded_info, vector<BarcodeType> &decoded_type,
OutputArray points_) const
{
Mat inarr;
if (!checkBarInputImage(img, inarr))
{
points_.release();
return false;
}
vector<Point2f> points;
bool ok = this->detect(img, points);
if (!ok)
{
points_.release();
return false;
}
updatePointsResult(points_, points);
decoded_info.clear();
decoded_type.clear();
ok = this->decode(inarr, points, decoded_info, decoded_type);
return ok;
}
四、效果图像示例
参考代码,opencvsharp版本的需要打开barcode并重新编译,所以使用c++代码进行示例。
cv::Mat mata = cv::imread("barcode.png");
cv::barcode::BarcodeDetector barcode;
std::vector<string> info;
std::vector<cv::barcode::BarcodeType> type;
Mat points;
barcode.detectAndDecode(mata, info, type, points);
识别结果,可以看到第一个和第三个识别结果正确,不知道是否是放在一起的原因,下面把另外两个裁剪出来识别看看。
最后一个没有识别出来
把最后一个单 * 剪出来在测试下也没有识别出来,不过UPCE类型的应该支持才对,暂时不进行深究。
来源:https://blog.csdn.net/bashendixie5/article/details/125294547
0
投稿
猜你喜欢
- 以下是作者在学习Python中django框架时的学习笔记,并把测试的代码做了详细分析,最后还附上了学习心得,值得大家学习。URL配置(UR
- mixins混合 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混合对象可以包含任意组件选项。当组件使用混合对象时
- Matlab常用的输出命令1、disp方法(1)方法(2)方法(3)需要注意:直接加数字不会显示数字,num2str()使数值转换为字符串类
- 本文实例讲述了python通过get,post方式发送http请求和接收http响应的方法。分享给大家供大家参考。具体如下:测试用CGI,名
- 前言众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数&rdq
- 内容摘要:现在博客很流行,相信应该上网时间稍微长点的朋友都会在这或者在那的有一个自己的博客。对于一些有一定能力的朋友,可能更喜欢自己去下载一
- 以前在一个图书类网站看到这样一个功能:客户可以按条件搜索书目的信息,服务器会将符合条件的信息筛选出来保存为一个Excel文件供客户下载。今天
- 结合mysql数据库查询,实现分页效果@user.route("/user_list",methods=['PO
- 著名的老掉牙的IE6.0在我这里已经有六年工龄了,前几天朋友拿到个IE8.0新的Beta版本,我的Sever2003装不上,大为扫兴。Chr
- 单线程+多任务异步协程协程在函数(特殊函数)定义的时候,使用async修饰,函数调用后,内部语句不会立即执行,而是会返回一个协程对象任务对象
- 在服务器部署时,往往都是在后台运行。当程序发生特定的错误时,我希望能够在日志中查询。因此这里熟悉以下 logging 模块的用法。loggi
- 临时表产生:A: SELECT INTO和B:CREATE TABLE + INSERT INTO1. A 要比B 快很多。但是A会锁定te
- 查看自己cuda版本,我的cuda是11版本了,所以可以安装11版本以下的任何版本。进入pytorch官网官网网址:https://pyto
- 一、使用全局变量保存单例这是最简单的实现方法function Person(){ this.createTime=new Da
- 新版本的selenium已经明确警告将不支持PhantomJS,建议使用headless的Chrome或FireFox。两者使用方式非常类似
- 这里所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框、单行文本、多行文本、数值等。在经常需要更换这类表单的场合,需要有一个表
- 在对dataframe进行分析的时候会遇到需要分组计数,计数的column中属性有重复,但又需要仅对不重复的项计数(即重复N次出现的项只计1
- SqlServer帮助中对扩展属性的描述是: The Extended Properties property sets or retrie
- Scrapy是什么?先看官网上的说明,http://scrapy-chs.readthedocs.io/zh_CN/latest/intro
- pyfinance简介datasets.py :金融数据下载(基于request进行数据爬虫,有些数据由于外网受限已经无法下载);gener