在线时间 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系列之——某校图书证条形码制作
/ O S. k2 ?4 L4 B1 e ; R# d5 x5 q6 }( g. n. |( ]! Z
小谷同学 2011/9/25
5 X& w0 O1 ]3 Z, o' |4 r' l
1 G( z7 m1 }! }6 |' o8 F 摘要7 M$ o& v% d. {# T3 \8 y
- a" Z: k! W) Z0 }3 E2 P7 v
关键词: 条形码3 k+ C* `, Z* ~. _' i# X
3 x% }4 C" t& o! R
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。9 ]2 ^7 L" \# z/ v
" T2 `/ s: Q3 X% ~
目录3 j( l' l1 Q/ M2 E
/ {0 W; P. f2 p$ T1 P 1.某校图书证编码规则
" L! L8 C0 k! \
9 V7 l# Z6 q- Y1 c 2.条形码制作的过程; K) b5 K) e% ]1 M) q: I
# D: _3 Q0 Q6 U% D 3.打印与测试
/ O) o( Z1 q3 K4 f 3 x. y5 K# u# V" Q, s* x9 Y% ^
4.扩展应用3 n5 o* _8 T5 h; I$ y
0 k# [5 L2 U# D1 P$ `- i 5.关于本例的一些思考' O$ w( S$ g6 e7 @7 i9 p8 J
" k8 Q: [2 S) u& C& _, N7 y 6.免责声明与使用注意事项
9 ]2 p1 C7 I' W" s4 S3 D0 ]
7 j% n0 | ?3 U2 z( |5 P+ ~: A% o 7.参考文献7 s) {, b* `4 ?: k/ a
+ x1 _& g; V3 }9 P) h
8.附录
2 G* S$ s8 _6 N6 L" g" W* g ) b, Z3 j7 m5 }- |
7 e: O+ n, H- J5 T0 q4 S3 ]
& Q) k% Q) i$ B; _4 U3 {
. R2 V+ @8 v" l% f 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
' N; q, I& A! R6 L
9 k- [+ M6 X# m3 \4 v 在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
% J0 ]) P6 o1 y' t
, Q. S! K1 b& X* v# r5 P' Z 1.某校图书证编码规则( a3 I, h4 g5 j: ~1 E" \* `
- v: z( o$ x, w6 }0 n% J8 y8 ]) @
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
7 o1 G; {+ r- e' Z0 f( y7 c H7 C7 ]
; s% a3 v7 _, _ }# L) B5 l ①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
* Z# p0 d, q6 c+ C ( m# Z. ^; E8 ^0 N- z/ ~
②图书证的白色条码都是一样的,分为以下三部分:3 Q9 Z+ B0 S" P% H6 |
+ ^* w8 m: U% x; h
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。+ S0 `( W+ g5 s! Y/ _+ O0 l
8 h! O3 c' A$ |: _ z% ]
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:# p) M) z, T# L' ?4 ?# j% g0 `
, q* P& B& d8 I3 Q; Q3 A
1)起始部分:00110;
, z3 K. e6 {/ [& N) [& ]1 [2 P
8 b6 w: s Q: e2 N8 ]% M 2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; : M$ z2 r h& b: q- L2 z
7 s( j0 g7 N' w# D7 S
表一 某校图书证号每个数字对应的代码3 ?. M% C9 @5 o# N- w$ d
" L5 V( m. k! X/ R; A9 ^. Z 数字 代码 代码数字来源 数字 代码 代码数字来源 : \2 n a- L7 |1 ^; L0 w4 m: |( D
1 10001 1:0001 6 01100 6:0110 & o; h4 H. C! U& w
2 01001 2:0010 7 00011 8:1000
2 g/ T; I# N5 I7 y" k% z( ` 3 11000 3:0011 8 10010 9:1001
7 h% Y5 Q4 o( z9 j5 M 4 00101 4:0100 9 01010 10:1010 6 e. S7 ?0 s: ^- K
5 10100 5:0101 0 00110 12:1100 # j% x8 H8 G. W. B/ f: t) s8 }
4 _( U0 n% h6 }1 x+ O
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
2 z: Q- L( R X7 p0 [' W
% {. D3 J6 L7 S" U' k' D1 J 3)终止部分:00110,与起始部分以及数字0的代码都一致。- @/ t: f! V" s- D4 k( A
( R4 [5 E$ A& m" n9 ^6 e0 P
2.条形码的制作过程7 B4 z" X$ f. K( Q+ o- d
& q# N' u7 k0 m: ]# W 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。# A4 {* `$ [% a0 L( z+ @
4 T! z7 C5 t4 T! L, v1 G! Q
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。% Y$ e' a. i4 Z' O$ X( P" _/ h
2 H* }$ k* z0 F' o' W; M' | 条形码效果如图所示(程序代码见附件所示)。$ t) `# h& u/ i
( r! o& O# {8 W4 K, W5 n
图一 所得条形码效果图0 N/ S7 z1 a0 v7 i/ B
* [$ r6 V: o5 O E, u
3.打印与测试3 l1 k" U, G5 R* h. d
0 X. t$ P& v* {5 y: z% a6 v# x
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。# S r: Y+ n0 @0 ^1 W5 \
& C! i- h5 t! ]1 A. U1 C) V 因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。* ?: P8 B$ b, m* e. F
, W1 f8 l. l+ n$ ~2 d4 Q. w9 g 为了方便进行测试,本文打印出不同大小的条形码。( P3 }6 A7 [/ j B
4 Y( b+ Q* l: b4 J; g4 d9 }
测试一:将其用透明胶带粘在硬纸板上。
4 f5 A) P8 R) k5 ~8 Q * O9 X8 A2 F1 p
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
: [% ~7 h- K; ^# Q* V P
# E% T: i4 a V# \( S0 x, O 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。( v+ |8 e( U- t3 y0 K: W& q- ~
4 H9 t+ p- K$ {: T; U, A6 n! V3 c3 U 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
# h+ S q; `; l y 6 N R0 Z6 g/ @' q+ S1 s) E1 c
效果如图二所示。
# |7 o1 Q; r! {5 p: W: w
4 b6 Q3 u1 K; z9 S% y1 M 图二 打印效果图
6 H8 W% A% W; B) u6 m6 h/ J# m 测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。2 f$ w* ?/ ~, J( @1 X5 k
# s" u: c2 k- z- V6 t* V 4.扩展应用9 o* A- x+ l2 B" W5 k
0 L0 U- L; u7 h2 y) z3 X! H" i 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
1 V% F( U! R3 j* s: H. _$ v
: Q3 G! F) d, t8 Q
图三 可供彩色打印的图书证6 n8 k" D& p7 G) C+ b
8 I6 C, d6 ?4 u; e% Y. m1 ?
过后,我们会给出相应的网页版、C++版、VB版等等。
1 T9 m' s5 @/ s6 ~8 S % k1 p6 p) e6 \2 o+ K
5.关于本例的一些思考
* S3 n3 x, |2 Q. p' b
; i) f$ V( ~2 `4 B8 {$ U: B 由相关文献,可知条码技术具有以下优点:# t; X0 O/ S% P. L" x
6 A) ]( @: v# S1 D
1)、输入速度快;
8 r7 K b2 ]' p- r* ]7 \
; G' I, ]& ]1 j& [ 2)、可靠性高;# ]2 A2 v$ E- `" B6 |
+ b! W( e& i& M- C 3)、采集信息量大;" P% j$ |3 e; H- K* D9 U
* E% C1 ]& z9 u; Q
4)、灵活实用;& l& M% y+ _ J! `) }& o
, z. L, J% L; S2 N& ~/ v6 k/ e
5)、条码标签易于制作9 F3 ]% U+ R9 a
8 L; s8 u& k7 _, D ]7 g
6)、识别设备操作容易,不需要特殊培训;
5 Z3 j- T. `0 B- I
# i) x- b; U% R; @) Y- B. q 7)、设备也相对便宜。! @$ v. x- U3 w h A! j( j" b7 F
/ ^. U; v( N$ i6 x2 g$ ?0 N
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。1 r* A, [$ ~4 M0 I* e ^
- Y$ Z8 _3 o* x6 k* N; t J; C 由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。- T2 V. N6 w, P4 |: M2 z
! n$ A8 J4 l" Q, A) } ~! M+ o 图四:常见的二维码
1 ]8 F K. c$ a6 @
! b! ~9 z" }- X6 g, ~ 6.免责声明与注意事项
1 y4 w- m; k9 B Y8 \ 7 H/ \2 w- B% G) P+ t, j- N
版权所有,翻版必究。
& Z3 F2 }5 e' [) }4 _- r6 t
+ K1 j; Q5 s) `7 G) f) s0 j 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
n* o+ \/ D- v* q
1 k+ ~/ V& ~; j& I% i1 T 任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 $ g8 G* V4 I/ s; B2 [
: V; Y o$ e8 ]$ Q3 I
7.
) o3 ]) u5 m' Y$ C$ J 参考文献, R7 c- m8 P9 N. w4 ^
: t* ?& x0 }- E7 p: b ]6 q [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]* k' f! R5 a1 K3 U, Z! G% i
) D! a5 ^: k+ p5 S6 m* r! R [2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]4 n7 _" u. w- @7 _& G7 \" n4 H
7 ^, V, m4 G4 }9 p. { 8.
/ Z- H4 Y' y. q4 E 附录' T% t! R0 `2 A, n
8 Q8 G4 o+ g& V# r7 |: b7 l 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
: O. d- M- l4 r7 }8 T. w: Q9 w , T$ K% w% m, h$ W
%barcode.m6 e8 g4 \+ r: i& u2 J8 ]) ?
, E0 ?& H- U$ A( h% X1 B %生成学号a对应的条形码4 g9 |9 q4 [1 d! {" z
* V7 C+ Y, z8 M. S2 J2 k' y9 Z% j %2011/09/25 13:24 BY小谷同学
5 O3 f( t# R3 O6 w
0 u! J2 X7 l! x. J$ z9 W( K a='1234567890123';%学号,自行更改3 B, H) S1 G% p; f, X
( }) _4 g# ~/ o) T$ W! f
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;
; V) U; ?% V* V3 y/ o0 q( ^
& ` D6 X8 E" ~+ s" o* z 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];%数字编码% N, @4 ~; g7 s, x v7 t
0 b' F, U L+ g
White_num=[0,1,0,0,1];%插入符的编码5 o5 Y: _2 j2 v! z( ]: B% ?
9 ]4 o; s! O4 V h, |
%Black_SE='00110';
( B! ^! ~' y2 @3 ^) E5 @
$ \- q6 J0 o- ^8 E5 p3 Y! h %White_SE='10001';White_M='01001';' v3 m; Q; i! l, e9 _/ S
" G& S: {/ u0 [5 c" R$ H
barheight=30;%定义条形码的高度! {. D G* \0 G2 w
, n# G9 Z; Z: M8 G) T( u2 H
barwidth=1;%定义条形码的像素宽度
1 ^9 I3 N- ?) k% b& p& a 1 U$ d7 I4 m. Z/ }* j
; V n a; N8 p! T: ~+ d5 l
%可以对特定长度的输入进行控制,本文规定长度为13# Y% Q, h# d3 t% y( g6 X0 E
4 f8 ^ X' L" l7 I: j0 t
if length(a)~=13
! t4 b7 q8 z! I% O' L4 _' ` # Z- x8 Q9 u# d0 c& Z' S u
' @( |) R3 |" a' t% T. E1 @4 H error('图书证必须有13个数字');) o) u+ A" o8 s
& ]! Z) ~; D9 f$ R: H+ ] end
; m, C: @" b& k2 T
1 j# ~0 p% u. f
6 U% c( |2 r- v# B% C barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
$ o1 D0 b* ?" ]* A 3 `* r3 b8 H" x
%为方便,直接人工得出起始与终止部分的条形码9 P. E5 U B8 H
1 {& C2 [1 |' U# E( M. e5 k9 M
%也可以由程序生成.
W& ]2 p) J! m2 a- H y1 t8 A5 L+ Z8 q' d0 F
total=length(a)*(7+7); N8 \/ r5 J! u; J! v
" Q2 T; S% g. J' d9 x; k1 |' c( C
%条形码的总像素宽
* m0 ^! A7 L. D+ f: M ; Z [" Y8 F- h/ h. g' Q- D. o
%也可以不用求,因MATLAB提供的均是动态数组
$ G8 C" E2 m2 g
) Y) W0 o, j* R' V( _9 j4 r* I s=1;%计数,记录
/ V. n9 p, D( b0 K6 c
0 e ^% L I2 t, E 8 U; ]+ L v% \1 n$ G% R
%由于利用for语句容易出现不可预料的错误
) \ l% d1 P2 n0 N' Y 1 Z- r" i" ]$ K! x4 e7 j
%大部分是数组的行标与列标的调用问题,于是采用while循环+ q* [2 k7 @8 Z; @2 |7 M, }
" T, \/ N9 w9 S% S' |
%嵌套循环,得出数据部分" n4 J c4 @9 ^* J* _
( P# u& m& _; {: i m=1;
% T' O* e% p3 c/ E: t2 P' A5 P9 T& s 7 E: j$ _+ y7 _- Q
while m<14
6 A* n" a0 u( k( z3 L # l7 N2 R q3 U- @& o4 d
3 e7 A/ p' j5 ?- j" e if a(m)=='0';
+ t6 d/ ~0 w- @ 2 y! \. M. |: ?3 q: w2 b
. ~) l5 l0 W1 \
t=10;! ~6 D/ d: a; u/ @" x
i2 }+ ^- N8 {0 ]4 n* X2 I
& Q0 B D5 ]8 Q4 u/ K %若为数字零,应该调用的下标是10: o0 ~% x4 v; d; n) ]1 {# X
9 X" B8 T- B4 o- C4 m
0 J- ]( Q6 d2 x) S
else
5 u! f" y+ O2 X( N9 T 6 \' t4 V3 k( Q9 i$ N0 l) i
# n, E; p7 x8 O* ]
t=double(a(m)-48);
p4 V( t2 ` Z+ q/ O% A8 { ' r! A% h. h+ x% P9 Y
%由于输入是ascii字符,转换为整数需要减去30H,即48, k/ o- l! E+ g( Z2 x
2 ~( w& x7 @5 E j: V9 t3 y/ e
: D* g0 G, i, M4 h: u6 R end7 w3 t. B( u, ~7 E) D0 e
4 Q; d0 }( \) d% R
/ d" {6 `. e7 c0 A' Z
n=1;%同样的while循环
- T( W: R( C" Q7 o) S1 I ; v/ I$ N+ { R: }' r
4 y4 P# a- d8 \+ J' { while n<6- p$ X5 U7 Y0 D) x- }5 K
" ?6 ~+ E7 Q5 m) G 2 Y. c, E! M" a9 O3 o6 F
if Black_num(t,n)==05 a2 Y7 s. H7 F( I6 L
% A, I Q& v; `& v9 O
4 q. C4 h+ B3 H% p* r8 I barcode_M(s)=0;
: z ]+ n% g n. W( ^ 9 c# y; N7 g5 c+ C
$ N4 T3 P6 @ Z0 q, C& P6 z' l
s=s+1;8 k6 g& v5 E2 u8 \1 g( r7 a1 \6 i( }
! s: R& c* G) K0 k
/ R. k$ }2 W3 `7 | else
- r% X5 H7 P; s; a1 ?* x) j ; h0 t/ Y; J! q2 u- M- l
( m2 |- M w$ o" p
barcode_M([s,s+1])=[0,0];7 c2 [, r4 c' ?. v8 ?, D
7 f% z& {9 J1 N& t& C( @
* I7 A' N; v: }( \: M s=s+2;
7 x, B! N# s8 Z8 U, } ' d8 O8 P1 u8 u3 V
' O* C. c0 F) S* h( c end6 B4 Z" {# _3 i& _
+ Q' E& V. z4 B6 @ }1 @& S D
, A* h$ n, u6 W) w" O if White_num(n)==0
% m& b* p& X/ @ ( A6 u: L/ R: ]! \! {1 ~/ G
: ?9 x; y2 C' d6 s4 B$ T7 _0 u
barcode_M(s)=1;
* W4 p, g8 a& L+ b D( x
+ T. ~4 }) E5 m$ `' F; n, z 7 U0 o7 i/ e- _) ^0 h
s=s+1;; \( N. r: S5 [6 E0 g
9 k8 V0 W7 ^, c6 h- A
. Z& O% f. B* \& k4 ?% }( ]) P else
$ }; Z) T2 ]% O0 Q: m0 V 7 o: Z# X# i; w Q
- r) I3 U8 R( z, f" a barcode_M([s,s+1])=[1,1];
V- J7 W: Z( ?; j5 q/ A 9 G4 z6 D/ l# Q. z) E( M
& Y' q. K9 v: t& k {
s=s+2;
i; ^9 s. ?( Q& Y3 z5 p , h7 a5 f7 _( z) q$ S7 s) K
" j) N, o- j6 Z end) g/ D8 {$ b% _ s" Y0 P
/ e; g2 _2 l- F* Q5 n# P4 P6 K
- J% R" q1 I/ {6 \, G) O5 L n=n+1;
( }; y6 W5 ~' ? 9 w5 O% {' D8 H
' @& `- t; B/ L/ \) t7 ^ end
+ F K, X, ]$ ]' }2 r4 a7 o9 M 0 S' f! Y9 m6 ~
m=m+1;
5 N: P0 m/ z5 n- W* m6 M z& u! s+ c' _
end
% b$ m9 ]: {; D 2 b5 m/ P, D% \, Q" I$ w4 ]0 u( z
|; Y7 v. ?% h. T bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
4 h6 s& P' \7 Z0 E% b 8 q! o, t8 m. Q/ ^
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵 A; b/ C. G; z* `! Z+ G. L
" n o. N2 w, z bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)0 n% V/ E2 F# N5 q* d# x2 L
6 Y# x2 N' o, K imshow(bcode)%显示所得到得条形码
& p: o8 U6 [3 G1 g# Z
4 ?! b0 J+ ?/ q( u2 C7 J2 T %然后可以自行存贮得到的条形码5 X! T0 ~/ H7 g4 D; n+ _% w0 J
. p; n% N+ z c6 O0 @
%然后用PS等工具得出具有自己特色图书证啦0 T: V( t+ G9 p6 [% s, S; x4 c5 d
' k2 p0 S6 A! u* f) K
6 b7 a1 F: ^/ \$ P
zan