本工程是利用OpenCV4.5.4进行图像预处理,将条形码找到并送进ZBar进行识别
目前能实现对干扰少的多条形码图片进行是被,后期希望能够利用摄像头在有干扰的情况下对条形码进行识别

工程代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include <zbar.h>
using namespace std;
using namespace cv;
using namespace zbar;
int main()
{ImageScanner scanner;//后期将会改用摄像头识别//VideoCapture cap(0);//if (!cap.isOpened())  //检查是否打开摄像头//  return -1;while (1){Mat image_s, image_gray, image_gradX, image_gradY, image_grad;image_s = imread("多条形码.jpg", 1);//读取照片//cap >> image_s;//将相机中的照片保存到新的imshow("source", image_s);//显示图片cvtColor(image_s, image_gray, COLOR_BGR2GRAY);//转换为灰度图imshow("gray", image_gray);//分别计算图像在xy方向的导数Scharr(image_gray, image_gradX, CV_8U, 1, 0);Scharr(image_gray, image_gradY, CV_8U, 0, 1);//因为我们的条形码在X方向上,所以减掉y方向的导数subtract(image_gradX, image_gradY, image_grad);imshow("grad", image_grad);Mat image_threshold;//对图像进行二值化并进行形态学处理threshold(image_grad, image_threshold, 100, 255, THRESH_BINARY);//二值化Mat  element = getStructuringElement(1, Size(9, 9));//创建形态学的结构元素//膨胀两次,使条形码的二值化图像相连通dilate(image_threshold, image_threshold, element);dilate(image_threshold, image_threshold, element);//腐蚀两次erode(image_threshold, image_threshold, element);erode(image_threshold, image_threshold, element);//去除孤立的点morphologyEx(imageSobleOutThreshold, imageSobleOutThreshold, MORPH_CLOSE, element);vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(imageSobleOutThreshold, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);//寻找轮廓for (int i = 0; i < contours.size(); i++){double TempArea = fabs(contourArea(contours[i]));//计算轮廓的面积if (TempArea > 1000)//轮廓面积大于1000认为是条形码{Rect rect = boundingRect(contours[i]);//计算点集的矩形边界rectangle(image_s, rect, Scalar(255), 2);//画出矩形Mat image_roi = image_gray(rect);//根据轮廓画出Roi区域Mat image_scan;image_roi.copyTo(image_scan);//将Roi区域的图像复制到新的变量中//将OpenCV的图像转换为ZBar的图像int width = image_scan.cols;int height = image_scan.rows;uchar* image_zbar = (uchar*)image_scan.data;Image imageZbar(width, height, "Y800", image_zbar, width * height);scanner.scan(imageZbar); //扫描条码  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("end", image_s);//显示框选了条形码的矩形cout << "--------------------" << endl;if (waitKey(10) == 'q');}return 0;
}

运行效果



在编写过程中遇到的最大的问题就是在利用Opencv画出Roi区域后转换为ZBar的图像类型进行识别总是会识别出同一排的其他二维码。
出现这种问题的原因是因为在划定Roi区域的时候并不会划定一块新的区域来储存图像,而是指向原来的图像,相当于将原图送到了ZBar进行识别,解决方法是利用copyTo()将划定的Roi区域储存在新的图像变量中。
详细解释:
openCV_C++笔记 : ROI感兴趣区域与Rect类
关于opencv中ROI区域的理解

使用OpenCV+ZBar实现多条形码识别相关推荐

  1. 使用OpenCV+Zbar一维码(条形码)识别

    1. 工具 opencv4.5.1 + Zbar库. opencv4集成了二维码检测,但没条形码检测,这里用常规zbar库进行识别. zbar库的下载与安装: 首先配置zbar库: Zbar安装包下载 ...

  2. Opencv+Zbar二维码识别(标准条形码/二维码识别)

    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...

  3. Opencv+Zbar二维码识别(二维码校正)

    二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...

  4. Opencv+Zbar二维码识别(一维码校正)

    一维码由一组规则排列的黑色线条.白色线条以及对应的字符组成.对倾斜的(没有严重形变)一维码的角度校正,可以根据其黑白相间.排列规则的特点,计算傅里叶频谱,通过傅里叶频谱中直线的倾斜角度计算空间域图像一 ...

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

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

  6. Windows10-64bit,vs2015,借助OpenCV、Zbar、Tesseract(编译环境32bit)进行数字、条形码识别。

    此次博客介绍了如何在vs2015上配置opencv.zbar.tesseract,也是为了给即将进行条形码识别工作的工程师所准备. 本次提供的代码是在32bit的编译环境下完成的. 主要内容包括:所需 ...

  7. OpenCV+Zbar二维码及条形码识别

    OpenCV搭配Zbar进行二维码及条形码识别 先上代码 #include<Windows.h> #include <iostream> #include<zbar.h& ...

  8. python实现二维码识别软件_OpenCV和Zbar两个Python模块实现二维码和条形码识别

    在我们的日常生活中,处处可见条形码和二维码. 在以前,我们去逛书店时,或者你现在随手拿起你身边的一本书,你肯定能看到书本的封页后面印有一排黑色线条组成的标签,也就是条形码:你去你们学校的自助机上借书还 ...

  9. OpenCV条形码识别

    OpenCV条形码识别 条形码识别 目标 基本 EAN 13 条码检测器 初始化 探测 解码 结果 原始图片 detectAndDecode的结果 条形码识别 目标 在这一章当中, 我们将熟悉Open ...

最新文章

  1. python链接mysql 判断是否成功_【初学python】使用python连接mysql数据查询结果并显示...
  2. 【转】C#对象的深拷贝与浅拷贝
  3. 意外分配– JIT编译抖动
  4. 【渝粤教育】国家开放大学2018年春季 0674-22T财务管理 参考试题
  5. CERL 2.0 预告:Erlang Style Concurrency + 状态机
  6. [lct] Luogu P4219 大融合
  7. java容器doc_关于Java容器类学习心得体会.doc
  8. Java8新特性总结 - 序
  9. 大一matlab知识整理,MATLAB基础课程 第二章 MATLAB绘图知识(5)
  10. 登录页跳转时保存用户信息-遇坑记
  11. JSP内置 对象(下)
  12. [python] linspace():获取等间隔数组
  13. socket的tcp连接中的监听套接字和已连接套接字
  14. Keil_V5 使用小技巧
  15. 【论文笔记】:Region Proposal by Guided Anchoring
  16. h5的横线_使用HTML5 Canvas绘制直线或折线等线条的方法讲解
  17. 一步一步实现中后台管理平台模板-08-登录页和用户信息保存
  18. 【数据库系统工程师】第13章 云计算与大数据处理
  19. 【密码学】DES加解密原理及其Java实现算法
  20. 从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池

热门文章

  1. 5y计算机应用选择题答案,2016年电大网考计算机应用基础统考试题模拟真题及答案 含小抄复习资料推荐.docx...
  2. 华为云GaussDB首席架构师冯柯:摘取皇冠上的明珠,华为云数据库的创新与探索
  3. 12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
  4. Win 7+CentOS 7双系统安装血泪史T_T
  5. 2020年OJ习题【map】
  6. 一念起,万水千山;一念灭,沧海桑田。
  7. 家用计算机的普及英语作文,优秀高二英语作文:计算机
  8. 阿里巴巴稳定性保障体系
  9. 姚晨为何可以新浪微博排名第一
  10. 1351:面朝大海 春暖花开 [ 数据加强版 ]