zoukankan      html  css  js  c++  java
  • 一维二维码的提取、识别和产生

    一维二维码的提取、识别和产生
     
    零、相关说明:
        在“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的本身的问题;
          同时,对于一些可能比较复杂的情况,可能这里的比较简单的获取方法还有问题,还需要具体问题具体对待。
     
     
     





  • 相关阅读:
    获得spring代理对象的原对象
    自动注入bean,简化持久化
    java Instrument修改字节码实现aop功能
    c# 笔记
    js 字符串与json互转
    js Deferred的使用
    chrome 插件开发 通讯机制
    ajax 采用XMLHttpRequest post、get 发送数据
    [转]c fscanf 按行读取文件_(Testbench用法总结)1. Testbench中文本数据的存储读取操作对比...
    转:VIVADO使用技巧:设置DCI与内部参考电压
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/4650158.html
Copyright © 2011-2022 走看看