1.本文利用二维码的边缘信息,对其进行定位,经检验在3-4m以内有良好的定位效果

2.主要步骤: 原图像大小调整,提高运算效率;转化为灰度图;高斯平滑滤波;

求得水平和垂直方向灰度图像的梯度差,使用Sobel算子;开运算,消除亮度较高的细小区域,先腐蚀后膨胀;

均值滤波,消除高频噪声;二值化;膨胀,根据核的大小,有可能需要6次膨胀操作;

通过findContours找到条形码区域的矩形边界;根据长宽比和矩形面积大小筛选出二维码框子

主要代码:

#include <iostream>
#include<vector>
#include"algorithm"
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iomanip>
using namespace std;
using namespace cv;int main(int argc,char *argv[])
{Mat image,imageGray,imageGuussian;Mat imageSobelX,imageSobelY,imageSobelOut;image=imread("/home/ubuntu/图片/bu.png",1);int width = image.cols;int height = image.rows;cout<<width<< "good"<<height<<endl;//1. 原图像大小调整,提高运算效率resize(image,image,Size(500 ,300));imshow("1.原图像",image);imageGray=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.开运算,消除亮度较高的细小区域,先腐蚀后膨胀Mat  element1=getStructuringElement(0,Size(3,3));morphologyEx(imageSobelOut,imageSobelOut,MORPH_CLOSE,element1);imshow("5.开运算",imageSobelOut);//6.均值滤波,消除高频噪声blur(imageSobelOut,imageSobelOut,Size(3,3));imshow("6.均值滤波",imageSobelOut);//7.二值化Mat imageSobleOutThreshold;threshold(imageSobelOut,imageSobleOutThreshold,180,255,CV_THRESH_BINARY);imshow("7.二值化",imageSobleOutThreshold);//8. 膨胀,根据核的大小,有可能需要6次膨胀操作Mat  element=getStructuringElement(0,Size(7,7));dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);dilate(imageSobleOutThreshold,imageSobleOutThreshold,element);imshow("8.膨胀",imageSobleOutThreshold);//9.通过findContours找到条形码区域的矩形边界vector< vector<Point> > contours;vector<Vec4i> hiera;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]);float c=(float)rect.width/rect.height;//矩形的长宽比,(float)强制转化// printf("%.1f%\n",c*100);//10.根据长宽比和矩形面积大小筛选出二维码框子if( 0.9<c && c<1.2 &&rect.area()>4000  ){rectangle(image,rect,Scalar(255),2);//cout<<"width:"<<rect.width<<"height:"<<rect.height<<endl;//cout<<"c:"<<setprecision(2)<<c<<endl;//setprecision(2)精度为2}}imshow("9.找出二维码矩形区域",image);waitKey();
}

效果图:

近距离照片:

中距离照片:

远距离照片:

不足和改进:

利用HSV颜色分割的方法对黄色二维码外框效果更好,下次对代码进行改进。

Zbar+ROS+opencv二维码识别与定位研究(一)相关推荐

  1. opencv二维码识别解码

    目的: 使用opencv库识别QR二维码,框出图片中的二维码,并使用开源库Zxing解码,在这过程中学习理解opencv库相应的函数. 环境: 1. window7系统 2. QT create 1. ...

  2. 基于Android的二维码识别系统的研究与实现(eclipse开发)

    目 录 1 Android系统开发背景与意义 1 1.1 Android系统平台的出现 1 1.2 Android系统的发展 1 1.3 Android系统架构的介绍 1 1.4 Android开放系 ...

  3. 【opencv学习之四十六】OpenCV4.2 QR二维码识别及定位

    首先系统得安装opencv4以上的库,代码实验了一下,相比zxing和zbar,更简洁一些,并且提供了二维码定位: 代码如下: #include <iostream> #include & ...

  4. OpenCV 二维码定位与识别

    因为二维码本身含有信息,因此可以作为产品的信息载体,如:产品特征.在工业领域常用在产品入库.分拣和包装上.但常常会因为二维码图像污点.光照不均匀以及二维码图像倾斜等原因,使得二维码的识别正确率低,针对 ...

  5. OpenCV4二维码识别测试

    OpenCV4引入了二维码识别,函数为cv::QRCodeDetector,用起来相对简单,本文附c++版本OpenCV二维码识别的程序. 实测效果: 原图: 效果图: 识别结果为:123456789 ...

  6. Jetson nano 摄像头二维码识别 Opencv zbar QT

    环境以及前言 环境 jetson nano Linux ubuntu 18.4 QT版本 QT5.98 摄像头 Csi摄像头 Opencv Jetson nano 自带的-.- 应该是4.1?不太清楚 ...

  7. 基于ZBar,OpenCV和Python的二维码识别

    0 前言 今天分享一个之前做过的二维码识别,参考:https://www.pyimagesearch.com/2018/05/21/an-opencv-barcode-and-qr-code-scan ...

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

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

  9. Python基于pyzbar、opencv、pyqt5库,实现二维码识别 gui 应用程序开发

    二维码组成结构基本介绍 二维码识别背景介绍 视觉的方法可以用来估计位置和姿态.最容易想到的是在目标上布置多个容易识别的特征,这样使用opencv相机标定和.相机畸变矫正.轮廓提取.solvepnp来获 ...

最新文章

  1. Swift类与OC类方法相互调用的
  2. java 运算符_java 运算符
  3. 设定Windows计划任务定期执行PowerShell脚本
  4. 黑马在线教育项目---15-16、datatables插件
  5. 实心等腰直角三角形。
  6. (八)JAVA springcloud ssm b2b2c多用户商城系统源码:配置中心服务化和高可用
  7. mysql2008无法登陆_SQL2008不能登录实例
  8. 这样查看告警邮件要慢一点……
  9. mysql 密码文件改成密文_数据库密码弄成密文
  10. C++自学笔记(3)
  11. 如何压缩pdf文件的大小?
  12. MySQL表数据导入导出
  13. (2.3)【遥控型木马-网络神偷】
  14. 计算机网络编程(转载)
  15. 一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
  16. 商业银行的起源与经营模式-分业经营与混业经营
  17. LSD(线段检测测试文件)
  18. 毕业论文word排版技巧
  19. ARM嵌入式开发板推荐
  20. 不可替代的测试人:一文解释探索性测试是什么

热门文章

  1. BAT等互联网公司薪资分享
  2. 组合数据类型练习,英文词频统计实例上
  3. 用HTML+CSS做一个漂亮简单的个人网页(第二篇)
  4. Windows Server 2012 和 System Center 2012 SP1,Virtual Machine Manager 中启用的软件定义的网络...
  5. 小姜的perl学习笔记
  6. Linux下视频流媒体服务器搭建详解理论
  7. Dwz点击左侧菜单动态添加Tab标签图标
  8. 全球15个免费卫星遥感数据源都在这儿,地信人必看!
  9. 卫星遥感技术应用与农业干旱监测的研究进展
  10. 人似秋鸿来有信,事如春梦了无痕