现在的位置: 首页 > 综合 > 正文

条形码完整度检测算法开发笔记01(08.31)

2018年11月06日 ⁄ 综合 ⁄ 共 1065字 ⁄ 字号 评论关闭

条形码完整度检测算法开发笔记01(08.31)

大体思路如下:

先用自适阈值化图像(要求光照基本均匀,无高亮反射斑,背景变化不剧烈),然后提取联通分量,用滤波法提取出一些特征点(或者焦点检测算子提取),这些特征点基本属于条码矩形上下交点,然后用霍夫变换的方法检测直线(角度不好时需要两条,如果是曲面上的也可以通过霍夫变换检测该曲线),这条直线垂直于条形码条纹,根据这条直线读出条形码内容,然后在每个Y上都读取一次,能读出一致内容就OK,否则就有缺陷,然后找出缺陷位置

这里重新定义了缺损、不完整等概念,完整并非完全一样,而是能识别及完整(事实上由于环境光、背景噪声、拍摄重复性的关系,即使是同一个条码也常常得不出一样的二值图像,所以按照工业需求能识别即可)

以后在此基础上深入研究环境光照和复杂背景

当前进度:

1.首先读入图像

2.然后阈值化

3.提取联通分量,得到条形码所在区域

4.画几条直线,扫描这几条直线,完成条形码解码

在如下文所示的代码中获取读取条码信息,暂时未进行解码,参见下文

5.再通过滤波法,检测条状的角点

6.通过霍夫变换找到垂直于条形码黑条的直线

7.由6所得直线的方向,通过逐行扫描的方法,对每一行进行解码

8.对比7与4的解码结果,判别完整性

9.对缺损进行分析,复原条形码

当前进度:

%Read data from disk
f = imread('barcode.jpg');
figure('Name','Source Image');imshow(f);
g = im2bw(f);
figure('Name','BW Image');imshow(g);
%Get aimed area
[L,num] = bwlabel(g,4);
maxarea = 0;
maxindex =0;
for i = 1:num
    temp = length( find(L==i) );
    if(temp > maxarea)
        maxarea = temp;
        maxindex = i;
    end
end
img = (L == maxindex);
figure('Name','Aimed Image');imshow(img);
%Read the bar code      
ar = fix( size(img,1)/2 );
j = 0;
for i = 1:( size(img,2) - 1 )
    if( img(ar,i) ~= img(ar,i+1) )
        j = j+1;
        chg(j) = i;
    end
end
for i = 1:(j-1)
    gap(i) = chg(i+1) - chg(i);
end

clear f g temp ar L chg i j maxarea maxindex num

完成条码初步读取,下一步进行条码的解码

抱歉!评论已关闭.