条形码完整度检测算法开发笔记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
完成条码初步读取,下一步进行条码的解码