代码实现简单环境下的条形码与二维码的定位与识别:

原图:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<zbar.h>using namespace std;
using namespace cv;
using namespace zbar;//寻找最大的轮廓
static vector<cv::Point> FindBiggestContour(Mat src)
{int imax = 0; //代表最大轮廓的序号int imaxcontour = -1; //代表最大轮廓的大小std::vector<std::vector<cv::Point>>contours;findContours(src, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);for (int i = 0; i<contours.size(); i++){int itmp = contourArea(contours[i]);//这里采用的是轮廓大小if (imaxcontour < itmp){imax = i;imaxcontour = itmp;}}return contours[imax];
}//获取二维码
void detect_decode_qrcode()
{Mat img = imread("barcode_qrcode.jpg");if (img.empty()){cout << "reading images fails" << endl;}//灰度化Mat img_gray, img_bin;cvtColor(img, img_gray, COLOR_BGR2GRAY);threshold(img_gray, img_bin, 100, 255, THRESH_OTSU | THRESH_BINARY_INV);  //THRESH_BINARY_INV  二值化取反                        vector<vector<Point>> contours, contours2; //找轮廓  找到的轮廓按照树的方式排列vector<Vec4i> hierarchy;findContours(img_bin, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);int c = 0, ic = 0, area = 0;int parentIdx = -1;for (int i = 0; i < contours.size(); i++){                                          //遍历所有的大轮廓                                  if (hierarchy[i][2] != -1 && ic == 0)  //如果 这个大轮廓没有父轮廓 hierarchy[i][2] != -1 说明他是存在子轮廓的{parentIdx = i;ic++;}else if (hierarchy[i][2] != -1){ic++;}//最外面的清0else if (hierarchy[i][2] == -1){ic = 0;parentIdx = -1;}//找到定位点信息if (ic == 2){contours2.push_back(contours[parentIdx]);ic = 0;parentIdx = -1;}}//二维码中间是应该有三个特征轮廓的,如果等于3 那么就认为它是有二维码的if (contours2.size() != 3){printf("finding 3 rects fails \n");}//把二维码最外面的轮廓构造成一个新的点集Rect new_rect;vector<Point> all_points;for (int i = 0; i < contours2.size(); i++){for (int j = 0; j < contours2[i].size(); j++)all_points.push_back(contours2[i][j]);}new_rect = boundingRect(all_points);  //根据二维码构成得点集,找到一个最小的外包所有点集 的矩形//  Rect rect(230, 5, 280, 290);//左上坐标(x,y)和矩形的长(x)宽(y)//  cv::rectangle(src, rect, Scalar(255, 0, 0),1, LINE_8,0);rectangle(img, new_rect, Scalar(0, 0, 255), 8, 0);Mat result_img = img_gray(new_rect);   //将找到的矩形 放进灰度图中,这样图片就可以根据矩形切割出来了ImageScanner scanner;scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);int width = result_img.step;  //因为这一小部分是截取出来的int height = result_img.rows;uchar *raw = (uchar *)result_img.data;Image imageZbar(width, height, "Y800", raw, width * height);scanner.scan(imageZbar);Image::SymbolIterator symbol = imageZbar.symbol_begin();if (imageZbar.symbol_begin() == imageZbar.symbol_end()){cout << "查询二维码失败,请检查图片!" << endl;}for (; symbol != imageZbar.symbol_end(); ++symbol){cout << "类型:" << endl << symbol->get_type_name() << endl << endl;cout << "二维码:" << endl << symbol->get_data() << endl << endl;}imageZbar.set_data(NULL, 0);//imshow("mat",img);imshow("mat1", result_img);
}//获取条形码
void detect_decode_barcode()
{Mat src = imread("barcode_qrcode.jpg");if (src.empty()){cout << "reading images fails" << endl;}Mat sobel;Mat canny;Mat canny_output;//1、//灰度化Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY); //2、二值化//Canny(gray, canny, 100, 255);Mat bin;threshold(gray, bin, 0, 255, THRESH_OTSU | THRESH_BINARY_INV);//3、形态学滤波Mat element = getStructuringElement(MORPH_ELLIPSE, Size(12, 2));morphologyEx(bin, bin, MORPH_DILATE, element); //形态学滤波  找到条形码 大白//morphologyEx(canny, canny, MORPH_ERODE, element);//4、寻找最大的轮廓Rect boundRect = boundingRect(Mat(FindBiggestContour(bin)));Mat result_img = gray(boundRect);imshow("mat2", result_img);ImageScanner scanner;scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);int width = result_img.step;int height = result_img.rows;uchar *raw = (uchar *)result_img.data;Image imageZbar(width, height, "Y800", raw, width * height);scanner.scan(imageZbar); //扫描条码      Image::SymbolIterator symbol = imageZbar.symbol_begin();if (imageZbar.symbol_begin() == imageZbar.symbol_end()){cout << "查询条码失败,请检查图片!" << endl;}for (; symbol != imageZbar.symbol_end(); ++symbol){cout << "类型:" << endl << symbol->get_type_name() << endl << endl;cout << "条码:" << endl << symbol->get_data() << endl << endl;}imageZbar.set_data(NULL, 0);
}
//主函数
int main()
{detect_decode_qrcode(); detect_decode_barcode();waitKey(0);return 0;
}

检测结果图:

调用Zbar库函数,识别分割出来的二维码与条形码

【图像处理】条形码与二维码的定位与识别相关推荐

  1. python二维码特征定位与识别

    python二维码特征定位与识别 1. 项目背景 2.引入相关库 3. 图像预处理 4. 识别位置探测图像 1. 项目背景 在使用手机等移动设备对发票中的二维码进行扫描识别的时候,经常会出现这样的情况 ...

  2. OpenCV4.x图像处理实例-条形码和二维码(QR码)检测

    条形码和二维码(QR码)检测 文章目录 条形码和二维码(QR码)检测 1.实例介绍 2.静态图像检测解码 3.视频流检测解码 1.实例介绍 条形码和二维码在日常生活中广泛应用.本次实例将详细介绍如何从 ...

  3. 条形码、二维码扫一扫和生成二维码采用ZXing3.0开源库在android studio中实现

    在开始之前先给各位上个运行效果图 二维码QRcode全称Quick Response Code 通过在一个矩形区域内使用黑白像素来进行编码 高纠错性.高可用性.高识别性 四周面有3个大的方框和一个小的 ...

  4. 2021SC@SDUSC-Zxing(十一):二维码的定位(Detector)及位置校正有关算法介绍

    2021SC@SDUSC 文章目录 一.对前面博客内容的总结 二.对后面博客思路的介绍 三.Detector 一.Detector所在目录介绍 二.定位流程 三.相关算法 查找定位点算法 二维码校正算 ...

  5. 条形码、二维码、RFID优缺点,卫星定位,传感器分类及应用场景

    条形码.二维码.RFID,以及三者优缺点 条形码的身影各个商品的背后随处可见,在我们的生活中应用十分普遍,由黑白相间的条纹组成的图形,其中黑色部分称为"条"白色的称为"空 ...

  6. Opencv+ZBar识别条形码、二维码

    文章目录 Opencv识别条形码.二维码 1.ZBar环境配置 2.一维码(条形码)识别 3. 二维码的识别 4. Opencv识别二维码 结束 Opencv识别条形码.二维码 最近的一次作业,恰好之 ...

  7. 【MaixPY 教程】用mixly玩转k210——条形码、二维码、AprilTag识别

    [MaixPY 教程]用mixly玩转k210--条形码.二维码.AprilTag识别 [MaixPy系列教程:] [MaixPy教程]用maixHub训练模型进行开源硬件识别 [MaixPy 教程] ...

  8. 基于opencv3.0和zbar下条形码和二维码的识别与解码

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  9. C#利用ZXing.Net生成条形码,二维码和带Logo的二维码

    本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...

最新文章

  1. C#的反射机制调用方法
  2. 使用百度webuploader上传组件直接上传到七牛云表单上传
  3. [云炬创业基础笔记] 第四章测试2
  4. 荣耀v30pro搭载鸿蒙吗,荣耀麒麟30pro+,可以搭载鸿蒙的顶级荣耀,你买了吗?...
  5. c语言注释部分两侧的分界符号分别是,c语言中界定注释的符号分别是什么?
  6. linux 判断网卡是否异常_如何判断linux网卡故障?
  7. 春节档影片的成本各是多少?
  8. mysql xml生成工具_mybatis-generator 代码自动生成工具
  9. 大数据分析平台对企业的重要性
  10. $(#).html(ftl) js 动态引入宏定义,FTL惯用标签及语法
  11. Qt echarts 教程(1):qt echarts的基本使用方法
  12. R_leaflet包_最易上手地图教程(二)
  13. 如何定住表格的第一列和第一行
  14. Kali 里边没有声声音 解决办法 有帮助的话给兄弟点个赞 感激不尽
  15. 视频添加背景音乐ffmpeg(十八)
  16. oracle虚拟用户和密码,创建 Virtual Private Catalog(虚拟用户目录)(Oracle 11g)
  17. Python-从txt中获取所有带有书名号的内容,并去除重复内容
  18. 计算机考研340分什么概念,考研340分什么概念_中国考研网官网入口
  19. scratch3.0-穿越城市的巴士
  20. atom 编辑器html,Atom编辑器配置

热门文章

  1. 阿里118道面试题合集(送答案):天猫+蚂蚁金服+阿里巴巴
  2. 记一次网络故障排除:nat虚拟机不能ping外网 浏览器可以上网
  3. 使用EXCEL计算日期差时间差
  4. GHOST WIN8 32位软件自选安装专业优化版 201307 V4.0
  5. C# webbrowser文本框的键盘和鼠标模拟输入和模拟鼠标点击
  6. JavaFx界面功能隐藏和禁用
  7. pppd详解_pppd拨号脚本说明文档
  8. pppd详解_Linux 使用pppd和ppp程序进行3G/4G拨号
  9. 春季早晚温差大,提醒您注意及时加减衣服——附“感冒食疗方”若干,供收藏。
  10. Linux keypad 设备树,GitHub - bilibilifmk/rpi_mt: 树莓派移动终端 全键盘及2.4寸tft材质屏幕...