二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图:

这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~。

这里介绍一种二维码校正方法,通过定位二维码的4个顶点,利用仿射变换校正。基本思路:滤波->二值化->膨胀(腐蚀)操作->形态学边界->寻找直线->定位交点->仿射变换校正->Zbar识别。

滤波、二值化:

腐蚀操作:

形态学边界:

寻找直线:

角点定位:

仿射变换校正:

Zbar识别:

Code实现:

  1. #include "zbar.h"
  2. #include "cv.h"
  3. #include "highgui.h"
  4. #include <iostream>
  5. using namespace std;
  6. using namespace zbar; //添加zbar名称空间
  7. using namespace cv;
  8. int main(int argc,char*argv[])
  9. {
  10. Mat imageSource=imread(argv[1],0);
  11. Mat image;
  12. imageSource.copyTo(image);
  13. GaussianBlur(image,image,Size(3,3),0); //滤波
  14. threshold(image,image,100,255,CV_THRESH_BINARY); //二值化
  15. imshow("二值化",image);
  16. Mat element=getStructuringElement(2,Size(7,7)); //膨胀腐蚀核
  17. //morphologyEx(image,image,MORPH_OPEN,element);
  18. for(int i=0;i<10;i++)
  19. {
  20. erode(image,image,element);
  21. i++;
  22. }
  23. imshow("腐蚀s",image);
  24. Mat image1;
  25. erode(image,image1,element);
  26. image1=image-image1;
  27. imshow("边界",image1);
  28. //寻找直线 边界定位也可以用findContours实现
  29. vector<Vec2f>lines;
  30. HoughLines(image1,lines,1,CV_PI/150,250,0,0);
  31. Mat DrawLine=Mat::zeros(image1.size(),CV_8UC1);
  32. for(int i=0;i<lines.size();i++)
  33. {
  34. float rho=lines[i][0];
  35. float theta=lines[i][1];
  36. Point pt1,pt2;
  37. double a=cos(theta),b=sin(theta);
  38. double x0=a*rho,y0=b*rho;
  39. pt1.x=cvRound(x0+1000*(-b));
  40. pt1.y=cvRound(y0+1000*a);
  41. pt2.x=cvRound(x0-1000*(-b));
  42. pt2.y=cvRound(y0-1000*a);
  43. line(DrawLine,pt1,pt2,Scalar(255),1,CV_AA);
  44. }
  45. imshow("直线",DrawLine);
  46. Point2f P1[4];
  47. Point2f P2[4];
  48. vector<Point2f>corners;
  49. goodFeaturesToTrack(DrawLine,corners,4,0.1,10,Mat()); //角点检测
  50. for(int i=0;i<corners.size();i++)
  51. {
  52. circle(DrawLine,corners[i],3,Scalar(255),3);
  53. P1[i]=corners[i];
  54. }
  55. imshow("交点",DrawLine);
  56. int width=P1[1].x-P1[0].x;
  57. int hight=P1[2].y-P1[0].y;
  58. P2[0]=P1[0];
  59. P2[1]=Point2f(P2[0].x+width,P2[0].y);
  60. P2[2]=Point2f(P2[0].x,P2[1].y+hight);
  61. P2[3]=Point2f(P2[1].x,P2[2].y);
  62. Mat elementTransf;
  63. elementTransf= getAffineTransform(P1,P2);
  64. warpAffine(imageSource,imageSource,elementTransf,imageSource.size(),1,0,Scalar(255));
  65. imshow("校正",imageSource);
  66. //Zbar二维码识别
  67. ImageScanner scanner;
  68. scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
  69. int width1 = imageSource.cols;
  70. int height1 = imageSource.rows;
  71. uchar *raw = (uchar *)imageSource.data;
  72. Image imageZbar(width1, height1, "Y800", raw, width * height1);
  73. scanner.scan(imageZbar); //扫描条码
  74. Image::SymbolIterator symbol = imageZbar.symbol_begin();
  75. if(imageZbar.symbol_begin()==imageZbar.symbol_end())
  76. {
  77. cout<<"查询条码失败,请检查图片!"<<endl;
  78. }
  79. for(;symbol != imageZbar.symbol_end();++symbol)
  80. {
  81. cout<<"类型:"<<endl<<symbol->get_type_name()<<endl<<endl;
  82. cout<<"条码:"<<endl<<symbol->get_data()<<endl<<endl;
  83. }
  84. namedWindow("Source Window",0);
  85. imshow("Source Window",imageSource);
  86. waitKey();
  87. imageZbar.set_data(NULL,0);
  88. return 0;
  89. }

Opencv+Zbar二维码识别(二维码校正)的更多相关文章

  1. Flutter扫码识别二维码内容

    前面一篇写了生成二维码图片,这篇来写使用相机扫描识别二维码 识别二维码需要用到插件 barcode_scan 首先在 pubspec.yaml 文件中添加以下依赖,添加依赖后在 pubspec.yam ...

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

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

  3. winform 扫码识别二维码

    因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能. 我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好) 现在将调用摄像头+识别二 ...

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

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

  5. 配置zbar识别二维码(转载)

    原文地址:http://blog.csdn.net/dcrmg/article/details/52108258  二维码解码器Zbar+VS2012开发环境配置 Zbar条码解码器是一个开源的二维码 ...

  6. 基于opencv+python的二维码识别

    花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...

  7. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

    tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...

  8. [opencv]二维码识别开发流程及问题复盘总结

    项目复盘总结 开发需求: 在桌面机器人(向下俯视)摄像头拍摄到的图像中做条形码识别与二维码识别. 条形码在图像固定位置,二维码做成卡片的形式在固定区域内随意摆放. 开发环境及相关库:ubuntu 18 ...

  9. [opencv]二维码识别率提升方案-resize调整

    这里采用循环resize的方式,对二维码图像进行放缩. 识别到name(二维码结果)不为空,则立即退出循环 //循环识别 for (int i = 1;name.empty(); i++){ resi ...

随机推荐

  1. Volume 1. Maths - Misc

    113 - Power of Cryptography import java.math.BigInteger; import java.util.Scanner; public class Main ...

  2. Vue如何使用vue-awesome-swiper实现轮播效果

    在Vue项目中如何实现轮播图的效果呢,在传统项目中第一个想到的一般都是swiper插件,代码简单好用.一开始我也是直接npm安装swiper然后照着之前的传统写法写,然而却没有效果,只会显示图片但没有 ...

  3. Texture 纹理贴图

    基础贴图Shader:只有纹理 1. 在属性中声明纹理贴图: _MainTex ("Texture", 2D) = "white" {} 2. 在Pass中声明 ...

  4. About SQL Server 2016 CPT2

    SQL Server 2016 CTP2已经发布,可以从以下主页进行下载. http://www.microsoft.com/en-us/server-cloud/products/sql-serve ...

  5. Linux学习总结(22)——CentOS7.2安装Nginx

    一.使用Yum安装(推荐) 使用Yum安装是推荐的方式,整体的流程非常的简单,也不容易出错,如果不需要什么特殊配置,建议使用Yum尽进行安装. 1.安装epel-release源并进行安装 1 2 3 ...

  6. JavaEE JDBC 读写LOB大对象

    JDBC 读写LOB大对象 @author ixenos LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其他数据, 在SQL中,二进制(字节型)大对象称为BLOB,字符型大 ...

  7. [luoguP1015] 回文数(模拟 + 高精度?)

    传送门 类似高精的操作... 代码 #include <cstdio> #include <cstring> #include <iostream> #define ...

  8. [luoguP3572] [POI2014]PTA-Little Bird(DP + 单调队列)

    传送门 DP方程 f[i] = f[j] + (a[j] <= a[i]) ( i - k < j < i ) 要使 f[i] 最小,需要等号后面的值最小,可以用单调队列来维护. 至 ...

  9. poj 1456

    #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 10010 #define in ...

  10. KMP算法 C#实现 字符串查找简单实现

    KMP算法 的C#实现,初级版本 static void Main(string[] args) { #region 随机字符 StringBuilder sb = new StringBuilder ...