10个步骤Opencv轻松检测出图片中条形码

 更新时间:2018年01月22日 16:12:53   作者:-牧野-  
这篇文章主要为大家详细介绍了Opencv轻松检测出图片中条形码的10个步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了Opencv轻松检测出图片中条形码的步骤,供大家参考,具体内容如下

1. 原图像大小调整,提高运算效率


2. 转化为灰度图


3. 高斯平滑滤波


4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子


5.均值滤波,消除高频噪声


6.二值化


7.闭运算,填充条形码间隙


8. 腐蚀,去除孤立的点


9. 膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作


10.通过findContours找到条形码区域的矩形边界


实现:

#include "core/core.hpp" 
#include "highgui/highgui.hpp" 
#include "imgproc/imgproc.hpp" 
 
using namespace cv; 
 
int main(int argc,char *argv[]) 
{ 
  Mat image,imageGray,imageGuussian; 
  Mat imageSobelX,imageSobelY,imageSobelOut; 
  image=imread(argv[1]); 
 
  //1. 原图像大小调整,提高运算效率 
  resize(image,image,Size(500,300)); 
  imshow("1.原图像",image); 
 
  //2. 转化为灰度图 
  cvtColor(image,imageGray,CV_RGB2GRAY); 
  imshow("2.灰度图",imageGray); 
 
  //3. 高斯平滑滤波 
  GaussianBlur(imageGray,imageGuussian,Size(3,3),0); 
  imshow("3.高斯平衡滤波",imageGuussian); 
 
  //4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子 
  Mat imageX16S,imageY16S; 
  Sobel(imageGuussian,imageX16S,CV_16S,1,0,3,1,0,4); 
  Sobel(imageGuussian,imageY16S,CV_16S,0,1,3,1,0,4); 
  convertScaleAbs(imageX16S,imageSobelX,1,0); 
  convertScaleAbs(imageY16S,imageSobelY,1,0); 
  imageSobelOut=imageSobelX-imageSobelY; 
  imshow("4.X方向梯度",imageSobelX); 
  imshow("4.Y方向梯度",imageSobelY); 
  imshow("4.XY方向梯度差",imageSobelOut);  
 
  //5.均值滤波,消除高频噪声 
  blur(imageSobelOut,imageSobelOut,Size(3,3)); 
  imshow("5.均值滤波",imageSobelOut);  
 
  //6.二值化 
  Mat imageSobleOutThreshold; 
  threshold(imageSobelOut,imageSobleOutThreshold,180,255,CV_THRESH_BINARY);   
  imshow("6.二值化",imageSobleOutThreshold); 
 
  //7.闭运算,填充条形码间隙 
  Mat element=getStructuringElement(0,Size(7,7)); 
  morphologyEx(imageSobleOutThreshold,imageSobleOutThreshold,MORPH_CLOSE,element);   
  imshow("7.闭运算",imageSobleOutThreshold); 
 
  //8. 腐蚀,去除孤立的点 
  erode(imageSobleOutThreshold,imageSobleOutThreshold,element); 
  imshow("8.腐蚀",imageSobleOutThreshold); 
 
  //9. 膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作 
  dilate(imageSobleOutThreshold,imageSobleOutThreshold,element); 
  dilate(imageSobleOutThreshold,imageSobleOutThreshold,element); 
  dilate(imageSobleOutThreshold,imageSobleOutThreshold,element); 
  imshow("9.膨胀",imageSobleOutThreshold);    
  vector<vector<Point>> contours; 
  vector<Vec4i> hiera; 
 
  //10.通过findContours找到条形码区域的矩形边界 
  findContours(imageSobleOutThreshold,contours,hiera,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); 
  for(int i=0;i<contours.size();i++) 
  { 
    Rect rect=boundingRect((Mat)contours[i]); 
    rectangle(image,rect,Scalar(255),2);   
  }   
  imshow("10.找出二维码矩形区域",image); 
 
  waitKey(); 
} 

使用另一幅图片的效果如下:


底部的二维码左侧边界定位错位,检测发现在二值化的时候左侧第二个条码部分被归零了,导致在之后的腐蚀操作中被腐蚀掉了。调整阈值分界值180到160,重新运行正确:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    以下是对C语言中printf(),sprintf(),scanf(),sscanf()的用法以及区别进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • Qt网络编程之TCP通信及常见问题

    Qt网络编程之TCP通信及常见问题

    这篇文章主要为大家详细介绍了Qt网络编程之TCP通信及常见问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 深入了解C++中map用法

    深入了解C++中map用法

    下面小编就为大家带来一篇深入了解C++中map用法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随想过来看看吧
    2016-06-06
  • C/C++利用栈和队列实现停车场管理系统

    C/C++利用栈和队列实现停车场管理系统

    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要的小伙伴可以参考一下
    2022-06-06
  • C++标准模板库vector的常用操作

    C++标准模板库vector的常用操作

    今天小编就为大家分享一篇关于C++标准模板库vector的常用操作,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 关于C语言指针赋值的问题详解

    关于C语言指针赋值的问题详解

    本篇文章是对C语言指针赋值的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 简明的C++函数指针学习教程

    简明的C++函数指针学习教程

    这篇文章主要介绍了C++函数指针的学习教程,讲到了函数指针的定义及把指针作为函数参数进行传递的用法,需要的朋友可以参考下
    2016-04-04
  • C++中关于[]静态数组和new分配的动态数组的区别分析

    C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下
    2014-08-08
  • ReSharper 的安装使用详细教程

    ReSharper 的安装使用详细教程

    resharper安装教程是关于vs2012一个非常好用的插件的安装教程,建议大家尝试安装,今天通过本教程帮助大家学习ReSharper 的安装使用详细教程,感兴趣的朋友一起看看吧
    2021-06-06
  • C++ primer超详细讲解关联容器

    C++ primer超详细讲解关联容器

    两个主要的关联容器为map和set,map中元素是一些关键字—值对,关键字起索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字,set支持高效的关键字查询操作——检查一个给定关键字是否在set中
    2022-07-07

最新评论