博客已转移至个人网站(http://www.p-chao.com)
条形码完整度检测算法开发笔记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
完成条码初步读取,下一步进行条码的解码