在线时间 78 小时 最后登录 2014-5-26 注册时间 2010-6-19 听众数 2 收听数 0 能力 0 分 体力 1839 点 威望 0 点 阅读权限 60 积分 664 相册 1 日志 17 记录 4 帖子 195 主题 4 精华 0 分享 2 好友 12
TA的每日心情 奋斗 2014-5-26 02:05
签到天数: 48 天
[LV.5]常住居民I
自我介绍 最大的特点就是没有特点
群组 : 数学建模培训课堂1
群组 : Matlab讨论组
群组 : 数学建摸协会
DIY系列之——某校图书证条形码制作& B& ^# T, s% D7 k
4 Q# x' ^1 k5 g. q+ B 小谷同学 2011/9/25" ^9 ]/ J+ K4 d+ s6 [
" \6 |: r* S, B) d# T2 G: w 摘要7 k- x" p7 M7 x0 u. \' A* T9 k& ?
3 o g+ U. X6 b 关键词: 条形码
$ D- ~ j1 S/ u& W
7 _2 C }! L2 k" g+ W; n 由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。 i( }& U/ H$ i
& y' j4 ^1 j5 |* \$ p
目录8 Q2 J, D" a6 q
% x+ a( | D% r4 P; p 1.某校图书证编码规则+ G" o S( T% ?
t3 y2 y1 r& q* B( y1 ~/ ]
2.条形码制作的过程
+ t: q" [* J% }* x
3 L7 C7 M+ j1 d( {# w: u, x 3.打印与测试, |+ i% @4 ?2 W5 a
5 Z3 Z- p/ @; R! [8 `5 x 4.扩展应用
" @" Z7 y: V" @ 1 r5 s" @1 i& h
5.关于本例的一些思考9 G# y& T+ P' J F% ?9 f9 G
3 z- c2 ~+ T# H p. N 6.免责声明与使用注意事项
! H1 _3 R/ `( ^; z5 A" `
3 q8 l. k9 N5 ^* V8 y8 u& Z! k 7.参考文献
" A/ [5 g5 Q+ n3 x5 v " X5 {6 N/ g) Z% d( `0 K
8.附录
' L5 U* @$ G8 d: Z; A2 }
/ I/ @% M! i2 K) a, P) G
: L& F- k2 u8 | 4 _- T, A# Q0 g) F
/ V! a9 Q. v/ Z. e4 D
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
5 j! M3 B' P2 c* K- H# t
2 z( R8 R) p, Q/ T 在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
3 \5 _/ k/ l& X$ n
$ C% Y7 V0 W' _( `% m8 w6 R 1.某校图书证编码规则
' ?9 h8 v w2 x" c$ N8 v/ e' T8 A
3 |7 C5 D+ T- ^/ g; c 由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
! A" r! v' m1 r 3 ~: v1 g: I. K! q: ~( `1 Z. b
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。* w: l. @9 J, d4 l$ ]
. S. ]5 J5 I6 e" v' g; X ②图书证的白色条码都是一样的,分为以下三部分:
' v0 A2 M$ b4 t" q/ P
9 a& I6 f! t, g8 ~' I5 V+ P 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
( A# [1 Y+ v: g- W* N. L9 {
) k8 r/ n% x- m/ Z4 t9 z ③图书证的黑色条码是携带学号信息的关键,分为以下三部分:0 s9 e7 J8 m2 } c8 b
8 I; S- o+ E+ W9 k7 X1 M& e7 j
1)起始部分:00110;
+ L" H8 `: \% Y9 y4 o8 \
- V6 y* j1 d I: T# d) F 2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
! r/ O5 N& X% }) Z" T9 ^ 8 n) E2 g7 T* s6 o3 T5 I
表一 某校图书证号每个数字对应的代码
, }: `: n' ?& v+ @& e, U
+ Q4 h/ U7 W; L* G9 _ ~/ W* j 数字 代码 代码数字来源 数字 代码 代码数字来源
! D3 o9 g2 m; S6 c( k 1 10001 1:0001 6 01100 6:0110 4 Q9 _7 T' J, m/ N ?& q1 Y6 M2 I3 j
2 01001 2:0010 7 00011 8:1000 ' V$ c8 G" ~) H# w
3 11000 3:0011 8 10010 9:1001
* w# Y/ @0 {* |+ Q( Z" j- A 4 00101 4:0100 9 01010 10:1010
4 a: X( z6 ?7 L' ~5 ^# X v 5 10100 5:0101 0 00110 12:1100
9 R( u S' j5 @9 n) j7 Z" f7 c' O
- {* N6 G4 }3 c, }% U: q6 \ 说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。: |2 l9 b" Q' B" T3 ^# U9 N N2 g( q
5 \6 n7 u+ q: ?/ Z( y$ ?
3)终止部分:00110,与起始部分以及数字0的代码都一致。' K& z: c& c- T; O. k1 o
8 ]5 C2 f$ Q9 ^) N3 T
2.条形码的制作过程
7 l6 ^. f) w2 z1 V 7 L1 |9 ~* `" ], S9 V
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
, n* m/ W$ p/ M& N. ~0 e
+ _' C, k* h& D( c8 [/ u" n 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
! s# a! @7 H( |8 w! {
/ t/ e, E. f: ^& s0 X0 ?% U 条形码效果如图所示(程序代码见附件所示)。7 O% v% s$ g8 [; G: h
2 m7 F% _0 K* u+ q
图一 所得条形码效果图# n. J# i, H. k5 b: S5 {% \$ x
& B9 ~& h( k* e" ?: U) R: g: y
3.打印与测试6 ?1 P W/ o4 |* Q% i
% f: }9 N+ S7 C* a/ v4 t5 [" g) \/ v 有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。0 e0 n; u1 T" Z$ H+ l* e" V
# E: U/ O l1 d4 _, j' L
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。' q6 V- T6 K1 b1 x0 s5 B+ e; Z
5 ^. X0 p% B* z( D/ X
为了方便进行测试,本文打印出不同大小的条形码。
' }2 c* M- A7 o' y1 j % @& `& I) i7 e4 j
测试一:将其用透明胶带粘在硬纸板上。# q& |) J$ x0 T7 Q/ |- q c
# D4 f9 l* W* F( t, R7 I9 H 结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:# w: p+ {$ t/ f$ G
3 b# x, w* p) N! i; n
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
0 `; E9 p; \" ?
. m: V N" }1 }. R. u 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
( t, J5 s& B! T, ^6 t6 C. P' R 3 N$ w6 \( V" k0 H
效果如图二所示。/ g3 i# i4 l( Q2 K: _( p- R
9 w/ N5 A, r6 F; q4 R 图二 打印效果图
% J! N; k- }+ {1 D8 D, Y& z0 A { 测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
% J0 v3 p, X# t: G% z
2 F$ f: }' T5 N, H# _% P 4.扩展应用
& F, a7 t! ^8 J5 d. w- d% f% q t2 O& }+ y% x: H% F$ I
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。# W7 t! u2 y: Z% X1 ~3 V
! d% p( B5 I# T! T! p5 V
图三 可供彩色打印的图书证& |0 U g: V. q/ E
0 `- P9 K% R, u3 ^) a4 e
过后,我们会给出相应的网页版、C++版、VB版等等。, M& K9 x% g$ x
; s0 B- z7 A2 G 5.关于本例的一些思考
3 ?- S3 c2 [! M% d
6 x% N6 ]# V) O4 M, ?3 b( u 由相关文献,可知条码技术具有以下优点:. N0 @# z" G W, Y9 l
# J E% n E1 r$ _9 K. o- F
1)、输入速度快; ) F; U; W( U* N% r$ o; A
' ]( ^% _$ X- t: |' K& A
2)、可靠性高;
& @* V$ e* F$ N3 d0 T 0 D4 y7 G' r: I) l
3)、采集信息量大;
" Q$ U, z' U1 j: l4 G2 T A! E7 J
+ b+ }; n9 | z2 c2 q# K! { 4)、灵活实用;0 a. D: G' r; F
1 ?) j/ c7 l4 A% I- I
5)、条码标签易于制作# e& O+ ^3 V: ?2 J) K# q
! z* u/ ^6 S4 a8 k
6)、识别设备操作容易,不需要特殊培训;5 T, r* m2 I \
: \$ W( d: H. Q
7)、设备也相对便宜。% k6 h/ m( M' l4 S0 E& g
H' ]% ^; M$ ?' E: N 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。- Z4 Q4 w2 q$ h H! R- R+ `
- f! q( t# v z 由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
6 w5 | }" M3 r2 A$ R6 P
1 u! V9 R* P. X 图四:常见的二维码9 X1 j2 W, W& L" M
3 F; m5 ~( ?3 Z2 m' |
6.免责声明与注意事项% o# \# ?7 f, r' v' ?
; l5 f3 d1 N1 L+ k J e8 g5 t7 v
版权所有,翻版必究。
+ b8 r! o- U; G: l, b
3 N/ i5 \3 t) O. y' t1 M2 j 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
v" t* T: {; h / N1 f% O1 G7 k2 L# o% m
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 5 g. E' Y! J' S4 f2 f
% w I& c, h0 }
7.
# X0 v% i1 F" s& N- L 参考文献; P8 G) F; I+ }: a' f/ N$ ]3 J
2 \( M4 w, ?/ D ~7 ` [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]
j6 q/ g, [6 b( h, G
/ B1 X( O$ @0 c8 v [2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]- O2 I% Q5 p% ~, \1 h: Z
4 i/ }6 u) H$ b% j& e6 m' x7 y
8.+ M) _( p, {* x0 r7 b
附录2 }4 |! P9 Q& @! U" ]
* i; z/ j) i# J/ I 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
. W' o; s* O3 v# `$ M. l $ U, P) ^ H5 J& h0 R; R
%barcode.m
4 ^4 k- b+ L! ~' y - `0 g3 d, B- [; @- G
%生成学号a对应的条形码
* B% e' f( n3 |6 w+ z
1 p8 U% e( A0 |) S1 h %2011/09/25 13:24 BY小谷同学4 o: N$ M! L, M0 F
* t$ r5 W$ Y# K9 V, u
a='1234567890123';%学号,自行更改- w5 r3 z, t. z
( x9 U1 k) U7 m7 Q
Black_num=[1,0,0,0,1;0,1,0,0,1;1,1,0,0,0;0,0,1,0,1;1,0,1,0,0;
3 l. s" K7 c& L0 t- b% ~7 H; J7 F
) _0 ? ]% B8 g q# Y% T# l 0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码3 J5 j) ?0 X4 d* c2 H
- }" T. N# H, a' O, o4 O1 ~
White_num=[0,1,0,0,1];%插入符的编码/ j: m. O. J4 f7 {9 B( V; T
9 }# y' x6 }5 ]8 o' B* d
%Black_SE='00110';! S7 `# _: P( n! ?8 ~0 g
; T! _+ d0 j; G: j- ]$ f0 E
%White_SE='10001';White_M='01001';
+ t, y; C- t, y" s% t% V; Y. R ) X5 {5 B5 F( z2 z
barheight=30;%定义条形码的高度8 L$ G8 U% [ y/ p j0 e
, F2 i: `" d7 N# P barwidth=1;%定义条形码的像素宽度4 P3 i/ j H% n5 C
9 d5 b6 a9 _* \1 z
$ w3 _! s' i7 G. M
%可以对特定长度的输入进行控制,本文规定长度为13
+ k7 ]# m5 u1 k( Z
" O: {( D- x; w+ S+ O4 ~ if length(a)~=13
' o8 |! Z# [+ S# p4 K: Y# M. M , J; f8 T5 y3 R* n/ a, g& Z
0 w7 l1 Z( u1 N+ J! | error('图书证必须有13个数字');
2 K4 V5 K( s2 m ' ^5 I! c0 c7 m
end
9 R9 C; p! B' e+ R% \# G. @
2 G4 l/ Z2 A7 L/ M/ _) P
4 \6 S( m5 k, v; m7 N9 A barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];' c' F, f8 o6 u
8 a/ D7 J* a' q, f %为方便,直接人工得出起始与终止部分的条形码
) [' d' w0 g' p
5 R( n' q5 `$ g8 R' U$ Z2 |1 d' S$ E %也可以由程序生成.# @& U% x* |2 K, m' \9 U
y; H9 X. x' L' v$ f1 Q- N Y
total=length(a)*(7+7);/ X: n R' X1 n z
" O; t: K* a6 s9 z %条形码的总像素宽
$ }2 @; t% i- i3 W 8 f! l4 C' X# d! `3 Z1 A. x- l) C
%也可以不用求,因MATLAB提供的均是动态数组" g3 ^- a+ k5 y
. O# s( g" s- h& H+ j
s=1;%计数,记录9 z0 L' @4 z6 W( G* V7 v
* z0 O0 S. L- l" l# m' Z4 K
' d' L: f' Y3 v2 `6 P6 ~1 z C' ? %由于利用for语句容易出现不可预料的错误% Q* A. @& i: w) t1 T
) y, r: D6 L: T0 T6 ?+ w
%大部分是数组的行标与列标的调用问题,于是采用while循环5 J$ q9 c+ C, ~5 y4 O1 e
+ C# K5 f6 R0 c9 B7 K' { %嵌套循环,得出数据部分
* {7 ?; i6 ^1 E# R9 M 5 J5 X6 c6 d8 `/ n( e8 j
m=1;" |8 T1 V( s* T) J( o0 k
5 i# w0 b; v: ] while m<14 % S7 W4 l$ U1 {; P$ ]) i
K2 W+ t7 x& d! q, u # q# b4 @* n' \. `4 G9 _5 G* n
if a(m)=='0';) C3 J6 p; y! @& c X9 O) v: |
* ^, U$ @2 H) W! h4 K: g% v1 Z 5 B4 Q% `1 y7 K2 t$ z8 C7 {
t=10;
' X6 W% d0 t. ^0 B! B
4 A1 ?( T |/ J1 M* e
8 _; N m8 b# K9 P9 L+ t! A %若为数字零,应该调用的下标是10$ Y& U3 j* Y3 Z. L
& I+ {) V k+ z
7 S, Z' `. n6 ]# n- b else
2 [& b7 H) Z8 _$ p' |. B ( R; l5 D4 K0 o& P; |& ~
$ _) f6 s. F- _( t
t=double(a(m)-48);
' ^" j, J" e" \$ {5 }
6 D9 l- f8 J4 a$ _7 n %由于输入是ascii字符,转换为整数需要减去30H,即48
% o# U% q0 _! S# ^. y1 w2 W # a$ w& b6 h& L+ P8 N9 }
: F( w5 W! |: h) O& g' \5 l# y end
# n W1 P) I- Z , i, O0 v5 }2 M& Y0 n- ]! I0 E
3 u# p' R0 a7 A+ v& {, Y" S n=1;%同样的while循环
! v. D# w `/ t& _$ d$ ^ 9 `# E+ s! b; X" o; G& \/ M- Z! \
- l. v9 ~7 V( T: t
while n<6! V9 w/ r D" Z5 _8 l# Y
6 N- ~" _9 r% |# l5 _; m5 C) ]. H+ x/ |
. ^ v; W: N+ |. v if Black_num(t,n)==02 v4 }+ c) u: c. Y: ?
6 {: I+ q5 q5 G1 b6 n" S+ l5 p
$ B9 X& {; q% }' g% \
barcode_M(s)=0;5 |- B% i9 v5 s" {2 a- D
# y3 N8 A( y' L& @1 K1 t * h+ z+ D1 O- o3 X# _4 F" \( b
s=s+1;
8 Q$ }7 A( T& ]6 O. L& w! R ) F$ R: G7 e: G4 \
6 n9 a% z0 \- U& e else3 n" j. }* {, `6 r% K5 m7 w
2 M; ^$ s* e; {& E: k9 n4 t - o$ Z) U5 T; y0 ?1 n6 n
barcode_M([s,s+1])=[0,0];5 S1 F6 s) j2 D0 g) U: L" Y3 g7 n
7 Q0 L) x9 @+ p6 h5 C
+ G' K) @, f& P8 X
s=s+2;
# x8 @9 U6 `- q' Z9 @2 a
# a5 U8 t5 \. l7 Y ' ^, X9 d5 u( _( }4 @0 G9 r$ D
end
. X; y s- ~/ e
9 ?& \3 q( O3 @8 ~ h1 s % x b; Q- z I( e2 n) c9 d
if White_num(n)==0
3 Q) T& \; \* w) l* {2 `
) N% K- y3 D3 W9 l% ~# G
0 d' b$ Z1 Q7 i+ [ U barcode_M(s)=1;. b4 ?+ q$ u+ \) x3 E1 f; X
7 w1 p7 M3 H B) {( K/ O3 P8 D
# F1 G4 r- }* S s=s+1;
4 x4 P$ q2 Z/ t0 C ( E) `" |1 o3 p( q) p9 O- ^
& R7 q. R9 @7 f) W3 }: D else5 ^& _! g/ |. v. ]2 b
/ n5 R) q# l% H m
1 X1 \% N5 y5 w2 A: C
barcode_M([s,s+1])=[1,1];
' c% v; d) ?) z( ?7 t& [# w: Z) L0 d & {0 t8 E$ ]; W- B5 k9 p
, r3 v% L' p( a7 e) [/ S s=s+2;% O& F* A# F% d" F
! `; A( ^0 Q- f+ e0 \9 y/ x
5 P1 N% F0 q9 V% X end
, |4 d: T5 ?+ v2 x; Q9 \9 X" g: ? - B# r U: J7 n) W. {4 i
1 `- g9 M' c/ j6 C u R0 | Z n=n+1;/ k; n# H; ?4 h% d
. W# v1 {$ Z, L& |
1 v+ |/ z+ y$ A( ?7 v' L end
: T: R2 f1 u! T d) u' c% l7 D
1 T+ ~! a8 J0 ]; w. d k m=m+1;
! h6 c9 W0 Q( g# `
( h5 r2 c+ Q5 j4 C: v$ Y# r end- E( X3 \9 @6 j" {% u' m
: h; }: g* W ]. @" ?& W/ Q* p
# e# R" W# ~' O* \0 D5 j bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];0 `6 I: N2 F' Q) m
: Z3 h% @; _6 a: J5 d3 E ~1 b, o %将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵8 [+ `9 S/ j1 b7 D1 `) _
" z- ]8 o) W+ }9 Y8 Z; A2 D7 L9 K5 j( H
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
5 {/ ?: z3 P( b9 s
& H! ~) D' H( N imshow(bcode)%显示所得到得条形码, \( T/ b; i; ^1 j! i
7 Z* |/ ?4 Q8 e
%然后可以自行存贮得到的条形码
2 J- W4 y2 E2 o: k! S : T0 Q+ D- \ ~; D- p* y
%然后用PS等工具得出具有自己特色图书证啦% Y( r5 D j; D2 ]
- c1 N; N3 y0 e: P e ) ^: m+ H4 p4 E
zan