- 在线时间
- 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系列之——某校图书证条形码制作+ O0 ?6 O+ j5 F: v- }
+ s+ e; ?- s1 d$ R. r9 ^( |小谷同学 2011/9/25/ G, e& E1 j3 w; \: |* K
8 }# A9 a" e2 K* L% r0 H8 G# V
摘要
; G7 {, W: ]3 O9 A1 @
) ~! ~- I! [+ a9 i6 J, d关键词: 条形码* {6 F, ]: F* {6 e+ P5 B
/ V0 L& W6 J, g: [
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。# P2 a" R! _1 w: k
& y) y4 m0 b* p6 d目录7 M# }% h8 G) _' q/ L0 A+ `
' z: ]: g. g2 D1 a, O8 B5 V, ^1.某校图书证编码规则
R: g/ L5 {7 T% _& b- V( L) m) |& m4 e6 B
2.条形码制作的过程
' @9 t0 [& S8 E7 ]0 a2 ^, E3 n4 M3 r0 I
3.打印与测试& `) b, I$ C& D* G- z
, _9 O; e% ?+ b( V, ]( h4.扩展应用
( h# p" f( Q) y1 c- ^: `
# C) R2 }. \# H5.关于本例的一些思考
9 U! _: E. y1 ]- {2 R0 S' n7 T+ q( i$ b0 C. e$ O9 k
6.免责声明与使用注意事项
2 X! P$ h* H( |, U8 y. ]" s: p
8 @( g5 c2 h4 [7.参考文献
' Y8 O2 D' j: Z" G4 w& o+ }# `/ ?# n, s6 G% a. D3 ^# u6 Q) h
8.附录
* {3 z, I' |2 z$ |( D1 p5 M# W1 ~
, T n% h3 Y3 y1 f4 T$ l/ a4 h8 J1 Q4 Y" T$ J& @8 K
* [9 P: _3 u" K3 S! Y
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。2 s9 x& a. O9 j" u1 q: s- n
9 u0 @5 A+ H, p ?# P在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
8 V1 c; u5 _+ A& _' @' T
8 b, }0 h. S8 C1.某校图书证编码规则% r) @2 P* R) i6 l1 z, T4 Q d
" Q3 W, {$ G; M' M" v" h由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:* w; i" G5 o6 O3 ^6 A) h
6 T9 A5 u' f2 T& A
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
/ i8 n- {( F* B9 T% }- n' i- K; D! U% D
②图书证的白色条码都是一样的,分为以下三部分:1 ?* d* S/ K, d- C" P
) W7 Q( R0 Y# V/ { R
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。' @" a9 ~# ?$ n( |! b2 n
( O! o( f3 ^* t③图书证的黑色条码是携带学号信息的关键,分为以下三部分:, {7 K6 [. v8 a) q; `! C
, l0 s3 A% x. m+ \% z1 V
1)起始部分:00110;/ b0 ?: p- v/ p A
* v! D) J6 V. @0 O+ Z
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
2 K4 p# s# H1 b. ^* j' y4 m
& I7 `5 B3 a \; b7 Y( \" u; \8 B. q; u表一 某校图书证号每个数字对应的代码
7 W2 F- J Z2 T) m, v: u5 T0 i/ A/ N* @4 i( E
数字 代码 代码数字来源 数字 代码 代码数字来源 5 u0 W: d$ V: `
1 10001 1:0001 6 01100 6:0110 - a, n8 t- G9 `, p. C# T1 A
2 01001 2:0010 7 00011 8:1000 7 W1 H T3 x% }5 V0 \5 g
3 11000 3:0011 8 10010 9:1001
8 f* A. }3 o, @* P7 s4 00101 4:0100 9 01010 10:1010 3 y/ |6 ~& C/ i
5 10100 5:0101 0 00110 12:1100 " D2 o w3 x7 g; F0 J
' `! Z* q- t$ J说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。1 o: Q3 D0 ^; `" A
1 L* A' M1 v e! F8 D+ ]3)终止部分:00110,与起始部分以及数字0的代码都一致。6 Y5 v1 e4 V9 u( W f
- U- ~6 g: l( G# f2.条形码的制作过程5 H6 X8 A$ y( {7 G. Q1 q, v: a+ O$ K
! ^/ I. [8 h7 N3 _黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
5 u8 Q1 B3 d0 F4 l6 H
o9 W% n0 [3 j0 O& T, \9 W定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。) ]; [+ T' W0 X8 ]4 h" j! e4 M0 Z
- {6 g6 k& o- O, F
条形码效果如图所示(程序代码见附件所示)。
5 H' w9 E. Z% c* R4 T3 Y
% d6 j+ R! U0 ^" X( F* L u图一 所得条形码效果图3 F! ~8 X( G: N, B) o
5 a. t% h! d( }5 y3.打印与测试
8 @9 c1 ~, X4 M* m3 x
2 d9 s+ o4 _1 \) B5 A, f2 p: z( ^! q有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
* |# {2 e* z/ e8 V( @: ]. j) i( J* P; Q2 t `! b. y5 Y
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。0 y9 j1 j" U8 I( X* y- m
; L1 x& n+ V) d/ H a为了方便进行测试,本文打印出不同大小的条形码。) K0 o w. t& A; r" r
3 U8 n% M7 A9 l" M# N/ h0 j# a* |
测试一:将其用透明胶带粘在硬纸板上。8 q% A3 M. G# e! v; p
/ X8 @6 |! I3 H7 g5 F; e
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
6 J# b6 n9 Y" z# }0 {9 J: s
4 ]8 i7 b3 g7 h. r2 [+ x0 G, |图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。& n8 t# _6 f; D
3 e9 {4 Y5 l- Q" W7 i6 I- O; `测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!* C) ]) F1 R, q" k
9 a; s4 y7 G$ v' q& r% [效果如图二所示。
3 S$ T+ g. D# w5 p8 Z
( X/ n/ N% W3 k
图二 打印效果图
; s- ]% Q1 \# H% e测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。; o: p* K' _% e0 o. c
, J+ N. M, {& s$ }' X8 r
4.扩展应用
5 `7 V( k w' }& Y: C
- X' x3 q: J0 P为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。8 H. i2 i/ Q0 ~+ ]6 ?
' S/ v' W6 b& e" D图三 可供彩色打印的图书证+ ^& K. H: j' D" d& j( l3 X' u
% H4 j/ y* f4 ~6 K+ R- B+ m, e
过后,我们会给出相应的网页版、C++版、VB版等等。' S' {2 X3 L) d7 F3 ? ?
4 Q& ?9 e( x% i: |/ g) t% E% b: U5.关于本例的一些思考2 ~- j: h+ W+ D! F1 _5 V1 j
7 f5 O0 Q' \1 b. c3 D d
由相关文献,可知条码技术具有以下优点:
! G* u8 g. u3 c8 }6 v7 y+ }5 Z* c0 [7 B: h* I* w8 t" y
1)、输入速度快;
$ c0 q$ Y- `, }4 @7 v2 r, B; Y
5 d# R/ Z# l* B3 [+ n: c+ ~- U' L 2)、可靠性高;! _6 t5 s: {! K
' g- d, _- O1 C% F3 E8 N$ a/ H
3)、采集信息量大;
. }5 t2 i8 a/ C9 z+ i, ?, k, J% j& T5 Y1 P4 D# f
4)、灵活实用;
& X/ C- ^! T5 [. w2 V" R: J
, m& w" l) i! F1 u5)、条码标签易于制作
' Z. e+ z8 ~1 i8 x
6 C& t6 v% j/ ^" j. G2 o' m' k6)、识别设备操作容易,不需要特殊培训;
; O- P0 B5 A. `% z. i1 D6 P5 c; w* E+ J% S9 y5 z
7)、设备也相对便宜。
2 [+ H4 E9 f! V3 Q9 V- i
3 j: O- l1 u2 p& ~- m$ Q/ ?8 ]" R因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
' W; T& d8 D y! P/ Z; ~; l
: s( q$ G7 e, t, V( o& A' |, f8 T" T) A由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。7 ^" T. j1 n& Z9 e! I9 y
& `* q. b1 |! U1 |. S6 V( }6 X
图四:常见的二维码% H- g- |- K: j5 R3 U. x1 p1 Z
" V% p/ l1 S2 B& J8 u6.免责声明与注意事项1 @& L! d h4 a4 l# d9 V" ~
/ U: d; t$ G* H6 @' e版权所有,翻版必究。" i3 `' k6 z+ @: _" r( T
/ h7 u) ?) b& T3 t% {/ w
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。& T5 y& F# r0 \/ v* u5 P7 {( Y
2 t ~3 W4 L2 g" @) i任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
6 v0 P) }( v# r/ t( o5 S% N) {% @! n( j% N. U z0 c' b& B! ^! P5 Y* P
7.
. M A5 E8 w( x参考文献
$ S& F9 L" B3 n& N2 w- p9 p6 ~0 W r5 I1 y9 `, w+ }( C
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]" V( d% I. y# Q
9 K% U8 Z7 o4 |/ A: c$ z" i[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
+ h6 g* Q+ g6 ^/ p: y. ]+ V5 _" J" V2 { Y- O
8./ z) Q9 c# F" {( R% h/ [
附录
# s+ h& |/ H+ i0 a( m* X+ c) d3 q6 s) v
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
( r1 g4 J0 e" e. b/ U% H, w3 \1 }9 L( u& f- ^$ D1 K
%barcode.m
- {, a5 r! ^' i- V) f: T; u: b
! Y8 t4 Z, o( h- T. O6 g, n%生成学号a对应的条形码: ~% K4 K7 s% d7 K0 G4 [
* |2 S8 D( I3 C) V' v8 ~%2011/09/25 13:24 BY小谷同学
/ O$ i# F$ v. o, {* ]# @+ q Y) l o8 a- |6 }6 z
a='1234567890123';%学号,自行更改4 e F# l& [8 g
( |8 P( t! A2 q% o* S% ?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;
8 g' Z* ^8 B' i& v1 N% }0 }
, H8 v1 }9 q/ {+ g9 C0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
2 F" w/ \* b9 c. x9 B3 j% B; D# V2 q
White_num=[0,1,0,0,1];%插入符的编码
# B4 F0 H$ W1 Y8 m5 j
3 S9 S+ l' w; T, P%Black_SE='00110';, q- @% U: Y) {8 @- A
g: w1 v5 K; m. v) l' W! i1 I
%White_SE='10001';White_M='01001';7 e5 r+ \5 T: M( m, N4 ~; v% r
# P, _9 ~# M- f: F& A
barheight=30;%定义条形码的高度
2 `( h& M2 \1 c+ j/ m
: t& W8 Q" j2 Y/ v" ^barwidth=1;%定义条形码的像素宽度2 o# X' f0 w9 b' x `
( U$ F5 X' ~) R$ ]3 ?3 e' O+ }+ L" z; I
%可以对特定长度的输入进行控制,本文规定长度为13
8 K/ Q: e0 Z9 c: X$ }; b& {
: @/ n9 H S: _" Y' Y9 A4 r% Z9 uif length(a)~=13
. N1 F& }. G T8 L/ x: A. b
0 B9 O! @1 x e- F1 m, M2 _6 `; z
( | R4 z+ y) e. Qerror('图书证必须有13个数字');
% i0 ^' p" z3 n
- D/ B7 c4 G7 \9 p/ dend+ p4 C, m2 R. x: [# R
4 r: }' }# Q( Y8 d9 u# A( f
. g3 L( Z' j# c8 x2 k2 ]* ]barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];* m0 C) o& e' x
3 n0 u: V: D- r, p# Z7 |%为方便,直接人工得出起始与终止部分的条形码
2 I3 [7 ]3 r, o; Y+ f4 h
9 z! n4 @- x+ a1 E5 K# c' t%也可以由程序生成.
5 c6 [* s6 B9 X2 o% x; g9 C% V! @
f4 |5 o, ^; N* v2 Rtotal=length(a)*(7+7);
0 a' S- C5 ^: M. i5 P, m" a9 s6 G1 t( [5 r; n
%条形码的总像素宽5 R& T6 |1 e1 E& L" W; l
1 |: i! l6 b6 S0 Y%也可以不用求,因MATLAB提供的均是动态数组
, m3 O$ r- E2 J5 Z8 j- u6 a
9 |2 p1 A& P* M/ |s=1;%计数,记录
. r. c, i' Q6 Y1 w" n ]/ e! p4 F$ d
) I/ y* |0 `4 u2 G/ Q b0 A4 T2 }5 I! n% I- Q, ?
%由于利用for语句容易出现不可预料的错误
4 w6 Q6 ]$ G5 I# U/ u0 U' ~% E- N) Y- {( s' H
%大部分是数组的行标与列标的调用问题,于是采用while循环 ~) V5 |2 Y1 P( X: g
. l5 X8 t$ f E0 Z6 o" _
%嵌套循环,得出数据部分
' O0 X& S' S* r7 \9 I7 V2 j& { e" p/ I$ x2 g" r7 r
m=1;
0 @9 A* X: g( C) D+ X+ o6 k8 ?! K' L- X- r
while m<14 5 C" Q5 ]0 Y2 G. d' u" Z
; q4 x: Z; u' K& ^; {; s
) G2 j% J& }7 a- H3 a6 Jif a(m)=='0';
4 v0 D* l8 m9 Y, i3 A( [2 G; ^4 j( w* n K& Z# y1 k1 O
+ O2 x' g7 b; ]2 ` K7 Tt=10;3 r% z, [" s& S/ O+ R
; w. K& n* U; f; c% F0 o" L7 q7 b$ x( @) o0 u# H
%若为数字零,应该调用的下标是10" J2 Q# A3 L4 ]! S, h
2 }. F! F1 \, y2 w# z$ }
& q' p4 d6 |; x% r5 X
else! L& N" a6 Z; T7 k* L- }5 r
. j# Z9 q9 v3 {5 A2 a& b4 n* P7 u) B+ o% j
t=double(a(m)-48);3 B ~* y" v4 E9 @: z( T: r
- H$ _3 ]3 ?, d! P9 g' R: s%由于输入是ascii字符,转换为整数需要减去30H,即48: O) }5 c. Y7 |
8 t6 H4 S, E3 d9 i5 t7 a: ~% ^
' w9 C* A9 a/ z7 M, N! i% Mend
+ r1 x2 E" Q1 @4 ? F
5 m( t$ f! b+ I n3 Y$ s
& x/ \8 n1 [4 R' i/ Pn=1;%同样的while循环
3 n# X+ `' l. q( r$ @; i
& s/ x" F! G3 N- ]/ H7 h! _
3 y8 t- y S8 I9 ~8 {. J0 B" Kwhile n<6$ {6 ]5 Q3 {% S3 y
; ~/ q4 k$ L* A9 t; c1 f( m V; c5 m5 V1 X- S
if Black_num(t,n)==0
* b% g! D( k5 m$ Y* b+ d8 c* t! e& E( v2 _9 l" l
5 E- M, l0 M& H/ p1 O9 ?barcode_M(s)=0;/ D0 }; ~ {5 b4 d5 i J, e% k
% G% I/ l, e7 K6 ~7 t: C, Y
' K, o2 L, p; t1 A9 f. us=s+1;
+ g1 N; n6 ^( C7 e, f; ]( W; r+ [; }
3 P T5 `. S! V3 y$ J9 q# g1 E* O
else
( O4 T. G" B! ^. Q. `7 k
' ?& F' ]3 i l$ Z3 J" S% Z$ I" i9 ~5 R
barcode_M([s,s+1])=[0,0];
0 {2 t* K# n$ h3 t* R4 M$ `
, z! V+ u0 C/ A/ t3 p
2 r6 c1 E8 M0 Y) Es=s+2;' x- i5 x/ j8 ~) g0 h; L) I
, I: `5 j V, R+ E: g: R; J7 ]* {8 I
end8 c' i! s: g) t0 p0 C/ T/ Z
" k7 I2 \6 B: c) N7 K7 c/ m0 {
2 g% b: O) T2 E* Iif White_num(n)==0 W: ?* Z7 U$ S* O# g
" ^% k( x* P; g5 j
( v a4 d1 y0 \2 l! W8 Xbarcode_M(s)=1;
_* C- W4 V4 @% e0 S
8 L4 O q, i) a2 A! c4 C1 q; E/ J; z1 [3 C# q
s=s+1;4 [( J+ i3 i E( I7 E% m
) p9 a3 l- b; W& w( h- {) }! P4 L5 a# z
else
( U1 ?! b' o6 k! n8 c
# P9 ?$ m. L0 k3 ~
! F5 M+ y9 |, sbarcode_M([s,s+1])=[1,1];& f6 a( ]) \0 `' W8 K" _; q) a1 q
w* i t3 s- {0 F- I
$ _% C2 y ^; l, {0 A2 T' A
s=s+2;' q$ l8 m/ s1 c
; w+ q: p7 D: r; L% T' b
& j7 V. @$ b3 c$ O( Send
6 w7 ?6 V. p' C7 t4 G6 j
1 g0 h1 _2 K# g# w. D/ C% o8 g
n=n+1;# G1 }. J& @& s) {4 h: x) A
0 Q+ g- X! b' s) Q' X- f/ f- d4 _) D L# ~0 ]& f
end
, ~2 Q6 l1 Q x- `* k: ?+ f& W& a. q! }
m=m+1;9 h4 q/ d1 M7 e: `9 o
v+ K9 f. W" `; @& eend5 N: p8 g4 ?3 S$ r$ \
0 j7 c& b4 }* ~4 b- l' l& L1 U! x: ]9 R1 A4 F6 B$ y0 i& y
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];$ A& L0 ]4 P3 z7 D! N& V
# {2 l( A. f# u6 i* Z& T0 i%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
0 _+ ]9 z. f* t, C: C4 w* A
' R; v; g, u# z' ] A8 {; F7 u* Vbcode=bcode==1;%将数组转换为逻辑数组(Logic Array)5 Z1 ~8 K7 d' l5 _3 e1 D
' Z2 A# G5 z. l( Y
imshow(bcode)%显示所得到得条形码, i9 j6 C Z# i, M
" G$ o2 x; e' V/ o& R
%然后可以自行存贮得到的条形码6 e. ~' a( J- e4 s
3 U8 u1 S$ T3 u S& ~
%然后用PS等工具得出具有自己特色图书证啦
3 q6 b9 Z, l/ {- }8 _ A$ t/ P0 y' Q- ]
6 V$ ?5 v' j- K6 e( t$ O |
zan
|