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

本文为大家分享了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,重新运行正确:

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

您可能感兴趣的文章:

  • zbar解码二维码和条形码示例
  • python利用elaphe制作二维条形码实现代码
(0)

相关推荐

  • python利用elaphe制作二维条形码实现代码

    手机上的二维码识别程序已经做的很好了,"我查查"用起来很不错的 我搜集了几个二维条码生成网站: http://www.morovia.com/free-online-barcode-generator/qrcode-maker.php http://qrencode.sinaapp.com/ http://www.mayacode.com/ 作为一个程序猿,我们也要懂得如何制作二维条形码 python的elaphe模块帮我们解决了问题 复制代码 代码如下: from elaphe im

  • zbar解码二维码和条形码示例

    复制代码 代码如下: #!/usr/bin/env python# coding: u8import osimport zbarimport Imageimport urllibimport uuiddef qrRead(url): uuid1 = uuid.uuid1()filename=str(uuid1)+".jpg"print uuid1 urllib.urlretrieve(url, filename) # create a readerscanner = zbar.Imag

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

    本文为大家分享了Opencv轻松检测出图片中条形码的步骤,供大家参考,具体内容如下 1. 原图像大小调整,提高运算效率 2. 转化为灰度图 3. 高斯平滑滤波 4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子 5.均值滤波,消除高频噪声 6.二值化 7.闭运算,填充条形码间隙 8. 腐蚀,去除孤立的点 9. 膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作 10.通过findContours找到条形码区域的矩形边界 实现: #include "core/core.hpp

  • python基于OpenCV模板匹配识别图片中的数字

    前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出"读取失败". 操作环境: OpenCV - 4.1.0 Python 3.8.1 程序目标 单个数字模板:(这些单个模板是我自己直接从图片上截取下来的) 要处理的图片: 终端输出: 文本输出: 思路讲解 代码讲解 首先定义两个会用到的函数 第一个是显示图片的函数,这样的话在显示图片的时候就比较方便了 def cv_show(name, img): cv2.imsh

  • Python+OpenCV人脸检测原理及示例详解

    关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

  • Python+Opencv文本检测的实现

    目录 EAST 深度学习文本检测器 项目结构 实施说明 使用 OpenCV 实现我们的文本检测器 OpenCV 文本检测结果 视频文字检测结果 在本教程中,您将学习如何使用 OpenCV 使用 EAST 文本检测器检测图像中的文本. EAST 文本检测器要求我们在我们的系统上运行 OpenCV 3.4.2 或 OpenCV 4 . 论文原文 代码地址 原文 在今天教程的第一部分中,我将讨论为什么在自然场景图像中检测文本会如此具有挑战性. 从那里我将简要讨论 EAST 文本检测器,我们为什么使用它

  • 使用OpenCV实现检测和追踪车辆

    本文实例为大家分享了OpenCV实现检测和追踪车辆的具体代码,供大家参考,具体内容如下 完整源码GitHub 使用高斯混合模型(BackgroundSubtractorMOG2)对背景建模,提取出前景 使用中值滤波去掉椒盐噪声,再闭运算和开运算填充空洞 使用cvBlob库追踪车辆,我稍微修改了cvBlob源码来通过编译 由于要对背景建模,这个方法要求背景是静止的 另外不同车辆白色区域不能连通,否则会认为是同一物体 void processVideo(char* videoFilename) {

  • openCV显著性检测的使用

    目录 1. 概念 2 静态显著性检测 3 代码 1. 概念 显著性检测,就是使用图像处理技术和计算机视觉算法来定位图片中最“显著”的区域.显著区域就是指图片中引人注目的区域或比较重要的区域,例如人眼在观看一幅图片时会首先关注的区域.例如下图,我们人眼一眼看过去首先注意到的不是草坪,而是躺在草坪上的内马尔,内马尔所在的区域就是显著性区域.这种自动定位图像或场景重要区域的过程称为显着性检测.显著性检测在目标检测.机器人领域有很多应用. 在OpenCV的saliency模块中有三种显著性检测算法: S

  • Python+OpenCV手势检测与识别Mediapipe基础篇

    目录 前言 项目效果图 认识Mediapipe 项目环境 代码 核心代码 视频帧率计算 完整代码 项目输出 结语 前言 本篇文章适合刚入门OpenCV的同学们.文章将介绍如何使用Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现手势检测与识别:本系列后续还会继续更新Mediapipe手势的各种衍生项目,还请多多关注! 项目效果图 视频捕捉帧数稳定在(25-30) 认识Mediapipe 项目的实现,核心是强大的Mediapipe ,它是google的一个开源项目: 功能

  • python+opencv轮廓检测代码解析

    首先大家可以对OpenCV有个初步的了解,可以参考:简单了解OpenCV 轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. import cv2 #读入图片 img = cv2.imread("1.png") # 必须先转化成灰度图 gray = cv2

  • Ubuntu18.04上安装Qt5.10的步骤实践

    目录 一.安装Qt 二.配置环境 Qt是一个跨平台的C++图形用户界面库,我们平时所说所使用的Qt,准确的来说是它的GUI编程部分.Qt提供给应用程序开发者建立图形用户界面所需要的功能,并且Qt很容易扩展.基本上,Qt和X Window上的Motif.Openwin.GTK等图形界面库和Windows平台上的MFC.OWL.VCl以及ATl是相同类型的东西. 一.安装Qt 第一步: 官网http://download.qt.io/archive/qt/ 下载安装包, 或者国内网址下载 https

  • Android轻松画出触摸轨迹

    本文实例介绍了Android如何画出触摸轨迹的方法,分享给大家供大家参考,具体内容如下 效果图: 实现代码: package com.android.gameview5; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import an

随机推荐