%function code = barcode(pic) %条形码识别
close all
check_left = [13,25,19,61,35,49,47,59,55,11;... %左边数据编码,奇
39,51,27,33,29,57, 5,17, 9,23]; %左边数据编码,偶
check_right = [114,102,108,66,92,78,80,68,72,116]; %右边数据编码
first_num = [31,20,18,17,12,6,3,10,9,5]; %第一位数据编码
bar = imread('008.bmp'); %读输入条形码图片
bar_Gray = rgb2gray(bar); %将RGB图片转换灰度图
%imshow(bar_Gray)
% for i=1:m %对图像进行二值化处理
% for j=1:n
% if bar_Gray(i,j)>150 %选择适当的阈值进行二值化处理
% bar_10(i,j) = 1;
% else
% bar_10(i,j) = 0;
% end
% end
% end
[a_hist x] = imhist(bar_Gray);
hist_max = [];
if a_hist(1)>a_hist(2)
hist_max = [hist_max 1];
end
x = max(x);
for i=2:x
if a_hist(i)>a_hist(i-1) && a_hist(i)>a_hist(i+1)
hist_max = [hist_max i];
end
end
if a_hist(x)<a_hist(x+1)
hist_max = [hist_max x+1];
end
[m,n] = size(hist_max);
k = 0;
max_1 = 0;
max_2 = 0;
for i=1:n
if k<a_hist(hist_max(i))
k = a_hist(hist_max(i));
max_1 = hist_max(i);
end
end
temp = a_hist(max_1);
a_hist(max_1) = 0;
k = 0;
for i=1:n
if k<a_hist(hist_max(i))
k = a_hist(hist_max(i));
max_2 = hist_max(i);
end
end
a_hist(max_1) = temp;
if max_1>max_2
k = max_1;
max_1 = max_2;
max_2 = k;
end
T = max_1;
k = a_hist(max_1);
for i=max_1:max_2
if k>a_hist(i)
k = a_hist(i);
T = i;
end
end
[m,n] = size(bar_Gray); %求灰度图的大小
for i=1:m %对图像进行二值化处理
for j=1:n
if bar_Gray(i,j)>T %选择适当的阈值进行二值化处理
bar_10(i,j) = 1;
else
bar_10(i,j) = 0;
end
end
end
%imshow(bar_10);
l = 0; %检测59根条形码
for i=1:m
k = 1;
l = l+1;
for j=1:n-1
if bar_10(i,j)~=bar_10(i,j+1) %比较同一行相邻两点的颜色是否一致
%bar_x(l,k) = i;
bar_y(l,k) = j; %记录转折点的纵坐标
k = k+1; %准备记录下一个数据点
end
if k>61 %点数大于60,该行应该删掉
l = l-1;
break
end
end
if k<61 %点数小于60,该行应该删掉
l = l-1;
end
end
[m,n] = size(bar_y);
if m<=1 %查看条形码是否有效
code = '0';
fprintf(1,'GameOver!\n');
return
end
for i=1:m %计算每根条形码的宽度
for j=1:n-1
bar_num(i,j) = bar_y(i,j+1) - bar_y(i,j);
if bar_num(i,j)<0
bar_num(i,j) = 0;
end
end
end
bar_sum = sum(bar_num)/m; %求每根条形码宽度的平均值
k = 0;
for i=1:59 %计算59根条形码的总宽度
k = k + bar_sum(i);
end
k = k/95; %计算单位条形码的宽度
for i=1:59 %计算每根条形码所占位数
bar_int(i) = round(bar_sum(i)/k);
end
k = 1;
for i=1:59 %将条形码转换成二进制数
if rem(i,2)
for j=1:bar_int(i) %黑色条用1表示
bar_01(k) = 1;
k = k+1;
end
else
for j=1:bar_int(i) %白色条用0表示
bar_01(k) = 0;
k = k+1;
end
end
end
if ((bar_01(1)&&~bar_01(2)&&bar_01(3))... %判断起始符是否正确
&&(~bar_01(46)&&bar_01(47)&&~bar_01(48)&&bar_01(49)&&~bar_01(50))... %判断中间分隔符是否正确
&&(bar_01(95)&&~bar_01(94)&&bar_01(93))) %判断终止符是否正确
l = 1;
for i=1:6 %将左侧42位二进制数转换为十进制数
bar_left(l) = 0;
for k=1:7
bar_left(l) = bar_left(l)+bar_01(7*(i-1)+k+3)*(2^(7-k));
end
l = l+1;
end
l = 1;
for i=1:6 %将右侧42位二进制数转换为十进制数
bar_right(l) = 0;
for k=1:7
bar_right(l) = bar_right(l)+bar_01(7*(i+6)+k+1)*(2^(7-k));
k = k-1;
end
l = l+1;
end
end
num_bar = '';
num_first = 0;
first = 2;
for i=1:6 %从左边数据编码表中查出条形码编码数字
for j=0:1
for k=0:9
if bar_left(i)==check_left(j+1,k+1)
num_bar = strcat(num_bar , num2str(k));
switch first %记录左边数据的奇偶顺序
case 2
first = j;
break;
case 1
num_first = num_first + j*(2^(6-i));
break;
case 0
num_first = num_first + ~j*(2^(6-i));
break;
otherwise
break;
end
end
end
end
end
for i=1:6 %从右边数据编码表中查出条形码编码数字
for j=0:9
if bar_right(i)==check_right(j+1)
num_bar = strcat(num_bar , num2str(j));
end
end
end
for i=0:9 %从第一位数据编码表中查出第一位数字
if num_first==first_num(i+1)
num_bar = strcat(num2str(i) , num_bar);
break;
end
end
if numel(num_bar)~=13
fprintf(1,'Please Turn It Around!\n');
return
end
check_code = 0;
for i=1:12 %计算校验码
if rem(i,2)
check_code = check_code + str2num(num_bar(i));
else
check_code = check_code + str2num(num_bar(i))*3;
end
end
check_code = rem(check_code,10);
if check_code>0
check_code = 10 - check_code;
end
if check_code==str2num(num_bar(13)) %判断校验码是否正确
code = num_bar
else
fprintf(1,'Please Turn It Around!\n');
return
end
阿里matlab建模师
- 粉丝: 4732
- 资源: 2878
最新资源
- 智慧社区管理系统 JAVA毕业设计 源码+数据库+论文+启动教程(SpringBoot+Vue.JS).zip
- 基于手肘法的k-means聚类
- matlab与winform的混合编程文件MWArray.dll,包括32位和64位两个版本,欢迎下载使用!
- Multiavatar(开源随机头像生成器).zip
- 全国气象站经纬度位置shp数据.zip
- 基于S7-200 PLC和组态王组态育苗大棚温室控制 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
- 站点分布-附件2.国家级地面气象观测站站点基本信息全表(2016)
- 威纶通与施耐德ATV12变频器modbus通讯,包括触摸屏程序,变频器参数设置,通讯线接线定义,通讯说明,说明书
- 光年(Light Year Admin)网站后台管理系统模板.zip
- 107_基于51单片机和PROTEUS的正反转可控的步进电机.rar
- 正余弦优化算法(SCA)文章复现(a参数非线性化+算法简化提高效率)-PSCA、ESCA、SA 复现内容包括:文章改进SCA算法实现、23个基准测试函数、文中相关因子分析、与SCA对比等
- 图像分类-基于pytorch的农作物病虫害检测
- 西门子200smart与3台欧姆龙e5cc温控器和3台台达MS300变频器通讯程序 器件:西门子s7 200 smart PLC,扩展模块SB CM01,3台台达MS300变频器,3台欧姆龙E5cc
- 基于多时间尺度滚动优化的多能源微网双层调度模型 关键词:多能源微网 多时间尺度 滚动优化 微网双层模型 调度 参考文档:Collaborative Autonomous Optimization
- Windows远程RDPWrap[10.0.19041.2673]配置文件.ini
- PHP开源匿名留言系统网站源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈