博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一维二维码的提取、识别和产生
阅读量:7026 次
发布时间:2019-06-28

本文共 1872 字,大约阅读时间需要 6 分钟。

一维二维码的提取、识别和产生
 
零、相关说明:
    在“jsxyhelu.cnblogs.com/机器视觉”栏目主要介绍和图像处理和机器视觉相关的的成套的解决方案、思路和软件集。希望能够为大家在实际工作中解决具体问题提供一些帮助。
一、背景资料:
      
现在一维码、二维码广泛使用于工业各方面。很多和图像处理相关的需求也有所涉及。这里也看过一些论文,里面有一些方法还是art-of-air的,也有一些具备一定参考价值。这里只是谈一谈一般情况下的提取和识别。对于特殊情况,肯定要特殊对待,其实本身是一个增强的处理。在条码的处理和产生部分,主要借助了zxing
      
       
那么,问题可以分为三个
      1.1如何从图片中获取条码区域并且提取条码(由于缺乏二维码图片所有这里只分析一维码,以后有了二维码实际拍摄的图片再补上);
      1.2如何识别条码;
      1.3如何参数条码
二、主要内容:
     
2.1如何
从图片中获取条码区域并且提取条码
      条码(也就是一维码)在设计的时候就被设计成纵向冗余的。提取就可以借助这一特性。
      比如这样的图像,经过canny->dilate->erode就可以得到这样的结果
    Mat cannyClone
= Mat
:
:zeros(Size(gray.cols,gray.rows),gray.type());
    Canny(gray,canny,
100,
255);
    Mat element 
= getStructuringElement(MORPH_ELLIPSE,Size(
7,
3));
    morphologyEx(canny,canny,CV_MOP_DILATE,element);
    morphologyEx(canny,canny,CV_MOP_ERODE ,element);
    imwrite(
"canny.jpg",canny);
      特征已经比较明显了,紧接着选取所有轮廓中最大的,并且将这个最大轮廓的外界长方形整个的扣出来,一般情况下就能够得到正确的结果:
findContours(canny,contours,CV_RETR_TREE,CV_CHAIN_APPROX_NONE);
    
for (
int i
=
0;i
<contours.size();i
++)
    {
        
int itmp 
=  contourArea(contours[i]);
        
if (imaxcontour 
< itmp )
        {
            imax 
= i;
            imaxcontour 
= itmp;
        }
    }
    
//找到轮廓的处理
    Rect boundRect;
//最小外接矩形
    drawContours(cannyClone,contours,imax,Scalar(
255),
-
1);
    boundRect 
= boundingRect(Mat(contours[imax]));
    Mat srcRoi 
= src(boundRect);
    imwrite(
"barcode.jpg",srcRoi);
 
2.2如何识别条码;
     借助zxing的相关方法,这里的解法是一维/二维通用的
 
            string opFilePath 
= System.Environment.CurrentDirectory 
+ 
"\\result.jpg";
            MultiFormatReader mutiReader 
= 
new com.google.zxing.MultiFormatReader();
            Bitmap img 
= (Bitmap)Bitmap.FromFile(opFilePath);
            
if (img 
== null)
                
return;
            LuminanceSource ls 
= 
new RGBLuminanceSource(img, img.Width, img.Height);
            BinaryBitmap bb 
= 
new BinaryBitmap(
new com.google.zxing.common.HybridBinarizer(ls));
            Result r 
= mutiReader.decode(bb);
            tb.Text 
= r.Text;
2.2如何产生条码;
      同样是借助zxing的相关方法,这个具体看代码和相关资料。
       
三、遗留问题:
     
由于zxing没有从源代码上吸收,所以无法保证算法的强壮性和可移植性,许多时候最终平台的选择还要考虑到zxing的本身的问题;
      同时,对于一些可能比较复杂的情况,可能这里的比较简单的获取方法还有问题,还需要具体问题具体对待。
 
 
 

转载地址:http://hjoxl.baihongyu.com/

你可能感兴趣的文章
让Windows 7更新完不再重新启动系统的方法
查看>>
我的友情链接
查看>>
linux安装Jenkins
查看>>
浅析-博客Ping服务
查看>>
gitlab升级(Omnibus packages)
查看>>
关于读书 工作 考研的困惑和思考
查看>>
学习Java ing--->this
查看>>
转贴-Linux shell脚本编写基础
查看>>
apache如何添加虚拟主机和在虚拟主机中实现用户验证
查看>>
tomcat安装服务和内存参数设置
查看>>
pyenv的安装
查看>>
MYSQL列转行操作
查看>>
Getting started with MVC(6)
查看>>
云计算之linux基础一
查看>>
使用主题预处理函数处理逻辑
查看>>
Direct2D (22) : 复合几何对象之 ID2D1TransformedGeometry
查看>>
转职--汽车诊断-CAN
查看>>
LAMP rpm包安装
查看>>
Squid 代理服务器配置实例
查看>>
【Java每日一题】20161229
查看>>