图像处理条形码识别_图像识别条形码识别原理 - CSDN
精华内容
参与话题
  • 使用数码相机、手机、电脑摄像头等通用摄入设备采集的条码图像普遍存在有高光区、阴影...本文以摄像头拍摄的有散焦模糊等噪声影响的QR图像为例,研究了在一定复杂度限制的条码图像处理技术,提出了完整的预处理算法。
  • 基于数字图像处理条形码识别方法 一种条形码识别方法 适合学习数字图像处理的同学看
  • 数字图像处理--条形码识别

    热门讨论 2020-07-30 23:32:48
    数字图像处理 包涵条形码识别全过程 自己的代码 可以帮助熟悉条形码和bmp文件
  • Opencv:10个步骤检测出图片中条形码

    万次阅读 2016-08-02 17:10:43
    10个步骤找到图片中条形码: 1. 原图像大小调整,提高运算效率 2. 转化为灰度图 3. 高斯平滑滤波 4.求得水平和垂直方向灰度图像的梯度差,使用Sobel算子 5.均值滤波,消除高频噪声 6.二值化 7.闭运算,填充条形码间隙...

    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,重新运行正确:


    展开全文
  • 条形码图像识别技术

    万次阅读 2009-11-04 15:36:00
    论文:《一维条形码识别系统的设计与实现》钟书成 成都信息工程学院软件工程系 1 中值滤波去噪 中值滤波是一种非线形信号处理方法,在这里由于条码图片是列的形式,所以采用改进的5个点采样窗口,取一列上的5个点...

     论文:

    《一维条形码识别系统的设计与实现》钟书成 成都信息工程学院软件工程系

     

     

     

     

     

    1 中值滤波去噪

           中值滤波是一种非线形信号处理方法,在这里由于条码图片是列的形式,所以采用改进的5个点采样窗口,取一列上的5个点。扫描整幅图片,对窗口内的像素点按像素值大小排序,最后取中间值代替窗口内所有像素点的原始像素值。

     2 二值化处理

           这其中有三个步骤,首先,对图片的灰度值进行统计,其次再求阈值,最后根据求得的阈值,将图片转换为像素值只有01的黑白图片,以方便进一步分析。

           阈值的选取,采用的是大律法。其原理为,取某个灰度值,以它为分界将图像分为灰度值大小两类,分别计算这两类中的像素点数及灰度平均值。然后计算它们的类间方差,取方差最大值对应的灰度为阈值。

     

    3 边缘检测

           这里的边缘检测,不是检测图片的边缘,而是查找一块比较适合条码识别的区域,并将这块区域的上下边界回传给它的主调函数。

    l  采用的方法是依次扫描图片的每一行,求取每一行中的黑点个数

    l  统计有黑点的行的数量

    l  求出图片中所有的黑点数

    l  求出平均每行的黑点数(总黑点数除以有黑点的行数)

    l  判断一个行是否适合于识别,判定的规范是:如果一行和它的下一行比较相差的黑点个数在5个以内,而且这一行的黑点个数比每行的平均数的75%多,则认为这一行可以用于识别。

    l  找到条形码用于识别的上下边缘,通过以上方法,扫描图片,得到每行是否适合用于识别(用01标记)。寻找最佳的识别范围则是通过扫描图片的每一行,查找一定范围内的可以用于识别的行数大于某个值时,这个范围即可以作为最佳的识别区域。如果没有找到,则认为图片严重受损,不能用于识别。 

     

    4 条形码识别

           条形码识别过程包括:垂直投影、计算宽度、码字识别等。

     

     

     

     

    l 垂直投影:同水平投影一样,先求每一列的黑点个数(在已经找到的上下边界范围内),总黑点数,统计共有多少有黑点的列,求出每列平均有多少个黑点。判定是否为条的规范是:如果这一列的黑点数大于平均数的75%,则认为这列像素是属于条的范围,同时将这列置1,否则置为0

    l  求各个条空的宽度:在垂直投影的基础上根据条空的边沿的变化来求。

    l 识别码字,根据编码原理的逆过程。

     

    缺点:

    在图像处理中大量使用到复杂的循环处理,影响了程序的执行效率。

    其次在图像特别模糊或背景色干扰太多的时候,识别效果不好。

    未实现倾斜校正,所以系统的通用性不好,当图片的倾斜角度太大的时候,系统无法识别。

     

     

     

     

    展开全文
  • 条形码识别(1)——基础知识

    万次阅读 2018-12-03 02:40:14
    条形码识别(1)——基础知识标签: 机器视觉 条形码识别 ...可惜时间不多,要是本科期间有现在学习的心思就好了……综合考虑了一下难易程度和实用性,最终选择了“条形码识别”这个目标,一方面有图像处理的知识,

    条形码识别(1)——基础知识

    标签: 机器视觉 条形码识别 Python


    1.序

    马上就要放寒假了,老师那边貌似也没有什么任务,这一个礼拜不能闲着,思索着做一点东西练练手,看书和实践结合起来才是最有效率的。平时记下来的点子挺多:RPG游戏、爬虫、数字和字母识别等等。可惜时间不多,要是本科期间有现在学习的心思就好了……综合考虑了一下难易程度和实用性,最终选择了“条形码识别”这个目标,一方面有图像处理的知识,可以用在毕设上面;另一方面有一定的实用价值,而且可以长期的做下去。

    其实一开始是想偷个懒的,准备下载个第三方库(比如Zbar)调用一下API能够识别条形码就行了,但是后来一想这么做根本就不能学到有用的新知识,遂作罢。为了学习python,所以采用python来编写程序。

    我准备按照分析法综合法相结合的方法执行条形码识别的任务,具体过程如下:

    1. 条形码图片处于理想状态下的识别与校验
    2. 从一张图片中剪裁出条形码区域
    3. 将检测出的条形码进行适当的处理,使其尽量的接近理想状态
    4. 优化整个过程,添加纠错等功能

    其中理想状态是指使用条形码生成器生成出来的条形码的状态:

    • 图片无污损无畸变
    • 图片只有条形码,没有其他任何多余的信息
    • 条形码的两边分别属于水平和竖直状态
    • 条形码从左到右为正向

    如图所示:

    其实也是摸索着前进,分享出来是希望能够有人一起讨论讨论。

    你有一个苹果,我有一个苹果,我们交换的话每个人还是只有一个苹果;你有一个思想,我有一个思想,我们交换的话每个人就有了两个思想。

    是以为序。

    2.EAN13条形码结构

    维基百科:条形码
    条形码或称条码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到了广泛的应用。

    条形码有多种,在我国广泛流传的是EAN13条形码(以下简称条形码),所以主要研究该种条形码的识别。

    条形码位数说明:

    • 条形码一共有13位
    • 前2位或者前3位称为前缀,表示国家、地区或者某种特定的商品类型
      • 中国区条形码开头:690~699
      • 图书类条形码开头:978~979
    • 前缀后的4位或者5位称为厂商代码,表示产品制造商
    • 厂商代码后5位称为商品代码,表示具体的商品项目
    • 最后1位是校验码,根据前12位计算而出,可以用来防伪以及识别校验

    条形码编码说明

    • 条形码一共有8个区域:左侧空白区->起始符->左侧数据符->中间分隔符->右侧数据符->校验符->终止符->右侧空白区

    • 字符为0~9

    • 除空白区外的区域和字符都采用二进制编码表示,1表示bar(黑条),0表示space(白条)

    • 起始符,终止符编码为101,分隔符编码为01010

    • 0~9每种字符有3种编码方式,AB为左侧数据奇偶编码,C为右侧数据偶编码

    • 左侧数据的奇偶性由前置符决定

    • 0~9每个字符由2个bar和2个space组合而成,合计长度为7
    • 起始符到终止符一共有95个长度(95=3+7*6+5+7*6+3)
    • 起始符到终止符一共有59个bar和space(59=3+6*4+5+6*4+3)

    3.检测条形码的基本流程

    Created with Raphaël 2.2.0开始载入图片剪裁出条形码区域校正条形码图像图像预处理(灰度化、滤波,二值化)扫描条形码,获得bar和space的宽度根据bar和space的宽度译码校验检测结果是否正确输出条形码结束纠错纠错成功提示识别失败yesnoyesno

    4.总结

    • 条形码有规定的标准,条形码检测就是根据标准逆向读出其所代表的信息
    • 条形码检测的难点是剪裁出条形码区域并校正至理想状态
    • 译码的依据是字符及其二进制表示的表
    • 前置码并没有用bar&space表示

    5.思考

    • 为什么左侧字符要有奇偶性?
      思考:左侧字符的奇偶性由前置码决定,所以奇偶性常见的应用就是检测扫描方向是否相反和判断出前置码是多少。但是假如固定左侧奇编码,右侧偶编码那么也能判断扫描方向是否相反;假如把前置码放到数据区也用bar&space表示也更精确。
    展开全文
  • 识别快递单号 这是我在CSDN 的第一篇博文,其实也就拿来记点东西而已,本来平时嫌麻烦,有什么东西都是...我从这博客的三篇博文中很好的了解了识别条形码的相关知识——moverzp的博客 百度百科:条形码 条形码(barco

    识别快递单号

    • 这是我在CSDN 的第一篇博文,其实也就拿来记点东西而已,本来平时嫌麻烦,有什么东西都是记载QQ空间的,但QQ空间没Markdown写起代码来麻烦,于是乎转战CSDN

    这次跟老师做项目,这项目大概是流水线上识别快递上的快递单号。首先我尝试了解条形码的基本知识
    我从这博客的三篇博文中很好的了解了识别条形码的相关知识——moverzp的博客

    百度百科:条形码
    条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。

    条形码有多种,在我国广泛流传的是EAN13条形码(以下简称条形码),所以主要研究该种条形码的识别。

    条形码位数说明:

    • 条形码一共有13位
    • 前2位或者前3位称为前缀,表示国家、地区或者某种特定的商品类型
    • 中国区条形码开头:690~699
    • 图书类条形码开头:978~979
    • 前缀后的4位或者5位称为厂商代码,表示产品制造商
    • 厂商代码后5位称为商品代码,表示具体的商品项目
    • 最后1位是校验码,根据前12位计算而出,可以用来防伪以及识别校验

    条形码编码说明

    条形码一共有8个区域:左侧空白区->起始符->左侧数据符->中间分隔符->右侧数据符->校验符->终止符->右侧空白区
    这里写图片描述

    • 字符为0~9
    • 除空白区外的区域和字符都采用二进制编码表示,1表示bar(黑条),0表示space(白条)
    • 起始符,终止符编码为101,分隔符编码为01010
    • 0~9每种字符有3种编码方式,AB为左侧数据奇偶编码,C为右侧数据偶编码
      这里写图片描述

    • 左侧数据的奇偶性由前置符决定(就是说,第一个支付是几就按下面的排列开始)

    这里写图片描述

    还有这么一种理解编码方法

    以宽度为编码,去掉起始码,终止码,中间分隔码,不管白条还是黑条都算一个编码,最窄一节为1(最窄的为单位宽度),两个单位宽度就是2,三单位长度为3,四单位宽度为4
    四条(不管黑条还是白条都算条)代表一个数字

    四条长度 数字
    3211 0
    2221 1
    2122 2
    1411 3
    1132 4
    1231 5
    1114 6
    1312 7
    1213 8
    3112 9

    两种编码的图示

    这里写图片描述

    这就代表为 数字 1


    校验

    EAN13条形码一共有13位,最后1位是校验位,该位是通过前12位按照一定的步骤计算出来的。
    如果按照一定的步骤处理识别出的前12位数据,如果计算结果和识别出的结果相等,识别正确;
    如果不相等,则重新识别或纠错再校验或提示识别失败。

    校验码计算方法

    以下图所示的条形码举例说明:

    这里写图片描述
    条形码的位数起始位为最右一位,即校验位,检验码计算方法如下:

    偶位数数值相加乘3((0+2+0+8+1+9)*3=60)
    不含校验位的奇位数相加(7+4+7+9+3+6=36)
    将前两步的结果相加(60+36=96)
    用10减去上一步结果的个位数数值(10-6=4)
    上一步结果的个位数即为校验码(4)

    源码

    #创建:2016/01/26
    #文件:BarCodeIdentification.py
    #作者:moverzp
    #功能:识别条形码
    import sys
    import cv2
    
    DECODING_TABLE = {
        '0001101': 0, '0100111': 0, '1110010': 0,
        '0011001': 1, '0110011': 1, '1100110': 1,
        '0010011': 2, '0011011': 2, '1101100': 2,
        '0111101': 3, '0100001': 3, '1000010': 3,
        '0100011': 4, '0011101': 4, '1011100': 4,
        '0110001': 5, '0111001': 5, '1001110': 5,
        '0101111': 6, '0000101': 6, '1010000': 6,
        '0111011': 7, '0010001': 7, '1000100': 7,
        '0110111': 8, '0001001': 8, '1001000': 8,
        '0001011': 9, '0010111': 9, '1110100': 9,    
        }
    
    EDGE_TABLE = {
        2:{2:6,3:0,4:4,5:3},
        3:{2:9,3:'33',4:'34',5:5},
        4:{2:9,3:'43',4:'44',5:5},
        5:{2:6,3:0,4:4,5:3},
        }
    
    INDEX_IN_WIDTH = (0, 4, 8, 12, 16, 20, 24, 33, 37, 41, 45, 49, 53)
    def get_bar_space_width(img):
        row = img.shape[0] *1/2
        currentPix = -1
        lastPix = -1
        pos = 0
        width = []
        for i in range(img.shape[1]):#遍历一整行
            currentPix = img[row][i]
            if currentPix != lastPix:
                if lastPix == -1:
                    lastPix = currentPix
                    pos = i
                else:
                    width.append( i - pos )
                    pos = i
                    lastPix = currentPix
        return width
    
    def divide(t, l):
        if float(t) / l < 0.357:
            return 2
        elif float(t) / l < 0.500:
            return 3
        elif float(t) / l < 0.643:
            return 4
        else:
            return 5
    
    def cal_similar_edge(data):
        similarEdge = []
        #先判断起始符
        limit = float(data[1] + data[2] + data[3] ) / 3 * 1.5
        if data[1] >= limit or data[2] >= limit or data[3] >= limit:
            return -1#宽度提取失败
        index = 4
        while index < 54:
            #跳过分隔符区间
            if index==28 or index==29 or index==30 or index==31 or index==32:
                index +=1
                continue
            #字符检测
            T1 = data[index] + data[index+1]
            T2 = data[index+1] + data[index+2]
            L = data[index] + data[index+1] + data[index+2] + data[index+3]
            similarEdge.append( divide(T1, L) )
            similarEdge.append( divide(T2, L) )
            index += 4
    
        return similarEdge
    
    def decode_similar_edge(edge):
        barCode = [6]#第一个字符一定是6,中国区
        for i in range (0, 24, 2):#每个字符两个相似边,共12个字符
            barCode.append( EDGE_TABLE[edge[i]][edge[i+1]] )
        return barCode
    
    def decode_sharp(barCode, barSpaceWidth):
        for i in range(0, 13):
            if barCode[i] == '44':
                index = INDEX_IN_WIDTH[i]
                c3 = barSpaceWidth[index+2]
                c4 = barSpaceWidth[index+3]
                if c3 > c4:
                    barCode[i] = 1
                else:
                    barCode[i] = 7            
            elif barCode[i] == '33':
                index = INDEX_IN_WIDTH[i]
                c1 = barSpaceWidth[index]
                c2 = barSpaceWidth[index+1]
                if c1 > c2:
                    barCode[i] = 2
                else:
                    barCode[i] = 8
            elif barCode[i] == '34':
                index = INDEX_IN_WIDTH[i]
                c1 = barSpaceWidth[index]
                c2 = barSpaceWidth[index+1]
                if c1 > c2:
                    barCode[i] = 7
                else:
                    barCode[i] = 1            
            elif barCode[i] == '43':
                index = INDEX_IN_WIDTH[i]
                c2 = barSpaceWidth[index+1]
                c3 = barSpaceWidth[index+2]
                if c2 > c3:
                    barCode[i] = 2
                else:
                    barCode[i] = 8
    
    def check_bar_code(barCode):
        evens = barCode[11]+barCode[9]+barCode[7]+barCode[5]+barCode[3]+barCode[1]
        odds = barCode[10]+barCode[8]+barCode[6]+barCode[4]+barCode[2]+barCode[0]
        sum = evens * 3 + odds
        if barCode[12] == (10 - sum % 10) % 10:
            return True
        else:
            return False
    #载入图像
    img = cv2.imread('res\google6.jpg')
    grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换成单通道图像
    ret, grayImg = cv2.threshold(grayImg, 200, 255, cv2.THRESH_BINARY)#二值化
    grayImg = cv2.medianBlur(grayImg, 3)#中值滤波
    #提取条空宽度
    barSpaceWidth = get_bar_space_width(grayImg)
    print 'bar & space\'s numbers:', len(barSpaceWidth)#只有60是正确的
    print barSpaceWidth
    #计算相似边数值
    similarEdge = cal_similar_edge(barSpaceWidth)
    if similarEdge == -1:
        print 'barSpaceWidth error!'
        sys.exit()
    print 'similarEdge\'s numbers:', len(similarEdge)
    print similarEdge
    #相似边译码
    barCode = decode_similar_edge(similarEdge)
    #针对‘#’译码
    decode_sharp(barCode, barSpaceWidth)
    #校验
    valid = check_bar_code(barCode)
    valid = 1
    print 'barcode:\n', barCode if valid else 'Check barcode error!'
    
    height = img.shape[0]
    width = img.shape[1]
    cv2.line(grayImg, (0, height/2), (width, height/2),(0, 255, 0), 2)#画出扫描的行
    
    #显示图像
    cv2.imshow("origin", img)
    cv2.imshow("result", grayImg)
    
    key = cv2.waitKey(0)
    if key == 27:
        cv2.destroyAllWindows()
    

    第二种编码的程序

    #-*- coding:utf-8 -*-
    from PIL import Image
    
    def clean(img):
        A = img.load()
        print A
        ss = ''
        for x in xrange(img.size[0]):  
            ss += str(A[x, img.size[1]/2])
        print ss
        ls = []
        while len(ss) > 0: 
            start = ss[0]
            j = 1
            while j < len(ss) and ss[j] == start :
                j += 1
            ls.append(j)
            ss = ss[j:]
        print ls
        return ls
        #print ls
    def GetUPC_A(t):
        #print t
        t = t[4:-4]
        print len(t)
        for i in xrange(len(t)):
            t[i] = (t[i] + 1) / 4
        t = t[:24] + t[29:]
        s = ''
        for i in xrange(len(t)):
          s += str(t[i]) 
        upca = ''
        for i in range(0, len(s) / 4):
            n = i * 4
            upca += dic[s[n:n + 4]]     
        print upca
    
    
    dic = {'3211':'0', '2221':'1', '2122':'2', '1411':'3', '1132':'4', '1231':'5', '1114':'6', '1312':'7', '1213':'8', '3112':'9'}
    img = Image.open('7.png') 
    GetUPC_A(clean(img))

    可惜这次遇到的是快递单上的条形码,非标准的EAN13条形码,暂时还不清楚这条形码的编码方式,所以换一个思路来识别快递单号,直接识别快递单上的数字快递单号
    这里我用OCR引擎来识别,用的是Tesseract-OCR引擎

    Tesseract-OCR引擎简介

    OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程。Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。
    数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。

    (由Google管理,所以下载地址“被墙”了,这里就不贴了)

    还有一个模块就是 pytesseract 这包是对Google Tesseract的一层python封装需要配合 PIL 模块使用

    所以此次识别快递单号,用到三个

    1. Tesseract-OCR ——(直接下载一个exe文件一路”next”即可安装完成)
    2. pytesseract模块——(直接 pip install pytesseract 安装即可)
    3. PIL模块——(由于我的是win7_64bit的系统,原PIL不支持,所以用pillow模块,直接pip install pillow即可)

    源代码

    #-*- coding:utf-8 -*-
    from PIL import Image
    import pytesseract
    import time
    
    start = time.clock()#开始计时
    #---------主要代码------------
    im = Image.open('66.png')
    code = pytesseract.image_to_string(im)
    print u'验证码:' + str(code)
    #---------------------------------
    end = time.clock()#结束计时
    
    print u'运行时间:' + str(end-start)

    有坑

    在有 Git Bash调试时遇到了

    Traceback (most recent call last):
      File "111.py", line 10, in <module>
        print u'验证码:' + str(code)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
    

    这一看就有事编码的坑了,我用的是python2.7 估计生3就没没坑了
    但目前还是要解决这问题,对于这编码的问题有两种解决方法:

    1.一个解决的方案在程序中加入以下代码:

    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')

    2.是在python的Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:

    # encoding=utf8
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')

    此时重启python解释器,执行sys.getdefaultencoding(),发现编码已经被设置为utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。


    待续…….

    展开全文
  • 代码实现简单环境下的条形码与二维码的定位与识别: 原图: #include<iostream> #include<opencv2\opencv.hpp> #include<zbar.h> using namespace std; using namespace cv; using ...
  •  本设计研究EAN13条形码识别的译码技术,在基于机器视觉技术上,构建了一套条形码在线检测识别系统,系统将由以下几个部分构成:条形码图像定位与采集、计算机图像预处理、条形码图像中值滤波去噪、条码解析与识读...
  • MATLAB 条形码识别

    热门讨论 2020-07-30 23:32:45
    这里还要提一点,摄像头的图像格式不一定是rgb,但程序要求处理图像的格式为rgb, 这时就需要格式转换。 本程序我默认摄像头图像格式ycbcr,然后用ycbcr2rgb()函数把图像转换为rgb格式。 如果你的摄像头图像格式...
  • 本资源用matlab实现,可以方面提取图像条形码,整个代码注释详细,并同时给出了gui界面实现,代码无需配置,直接可以运行
  • 通常,条形码识别处理区域中像素的计数以确定条形码符号中特定条的宽度和位置。因此,如果分辨率不高,此过程会受到影响。 通常,分辨率至少要达到200dpi,并且分辨率越高越好。大多数开发人员想通过最小化分辨率...
  • matlab编写的识别条码程序,内含条码工具箱,可直接运行,适合物联网专业,食品工程专业参考
  • 该项目实现了对EAN13,Code39,Code93,Code128的条形码识别,包含了指定编码方式和不指定两种重载方式,代码结构清晰,易于新手理解,易于读者根据需求截取部分代码。旨在互相学习,高手请勿喷,谢谢。
  • STM32F4 探索者 图像处理 ATK-QR二维码、条形码识别实验. 电赛学习 机器视觉 必备
  • 1.1 应用MATLAB识别条形码总体设计 本设计为基于MATLAB的条形码识别系统,带有一个GUI界面。 1.1.1 程序总体设计思路 在上节中我们简单的介绍了MATLAB的发展以及优点。在以后的章节中将阐述如何应用MATLAB编程实现...
  • 图像处理就业(转)

    千次阅读 2019-06-26 13:39:59
    首先你不仅要掌握(一维)信号处理的基本知识,也要掌握图像处理(二维或者高维信号处理)的知识。其次,图像处理是计算机视觉和视频处理的基础,掌握好了图像处理的基本知识,就业时就可以向这些方向发展。目前的...
  • 产品标识技术,使用摄像头检测一张图片的条形码包含有两个步骤,第一是定位条形码的位置,定位之后剪切出条形码,并且识别条形码对应的字符串,然后就可以调用网络,数据库等手段快速进行后续处理. 条形码识别要考虑到...
  • 根据您的场景、预算和时间线,在选择条形码读取SDK时需要考虑各种因素。您将使用什么类型的条形码条形码印在任何曲面或反光表面上吗?...它可以帮助您做出选择哪个条形码识别SDK的决定。 免费下载该电子书 1. ...
  • 在这里就介绍一个比较小的条码识别库,它就是pyzbar,对于一般的条码,它是能识别出来的,如果比较新的格式可能识别不了。可以使用下面的命令来安装它: pip install -i ...
1 2 3 4 5 ... 20
收藏数 5,209
精华内容 2,083
关键字:

图像处理条形码识别