- 在线时间
- 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系列之——某校图书证条形码制作1 s+ |8 c& b$ \* Q
6 e/ n5 M X/ Y3 h6 f. L4 B小谷同学 2011/9/257 d! Q$ R ^5 ?
) Z/ U1 S* E! E* M5 j! X摘要
& T1 b' ~/ H6 R) M- P1 }( v8 S
9 C/ ]3 `. l0 [' W+ }8 _关键词: 条形码2 [* ~0 U1 n* t: G/ i2 t X
, \$ I, \0 u; R& ]0 ]* w2 n
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。7 O- a- R9 T6 R3 T5 D
# g& s0 P, G7 z+ o% i
目录7 z! A% p' g# r# b) q3 t
?3 N1 z. |; i/ Z3 r$ _4 |% i, ^( y
1.某校图书证编码规则+ A8 a1 ^% h; L( N2 W1 S
; @, S( R) P( _) g2 ~
2.条形码制作的过程$ [+ N) Y7 z4 P" v6 h: a
, e. E, r7 C1 H9 j+ a3.打印与测试
5 O2 n' |, h. a# c5 _
. }8 x4 }/ X' _. b: i& a4.扩展应用, R7 M" s/ F+ c7 P
# M. P" v: J% M3 B! x- p
5.关于本例的一些思考
0 `9 \; k3 G1 `! {! R: D* L+ ^1 I, S
6.免责声明与使用注意事项
+ Y# c9 O: ?( u3 X$ F& ~' s" f/ k s9 z
7.参考文献) E8 h! v$ O: m- _7 m
5 X$ M1 H* G, H$ f8.附录1 m C0 J. w) F: c3 K! \* a6 R
2 o, @3 C/ o4 C7 ]2 n
% Y0 k$ v8 z0 G7 K) N9 V8 e
, x) ^' E8 i0 ]3 X4 \4 m4 d0 E. b9 G3 g' E9 ]6 s: r1 j
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。0 t- A0 h7 Y7 @' g' a
8 S3 l7 i" r1 r: C l
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。/ v$ ?% a9 h, O; h5 {2 E7 N
" o* M: H' z- }3 Y0 i
1.某校图书证编码规则/ t. U: e4 x/ o0 V4 L! W
) u! v( _& U& E' P% q/ o- w
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
3 I- t) N( B/ U7 {5 C
* H# x% E% }! U% m①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
0 c9 A) J# x; X! @7 x2 g3 G4 K+ J
②图书证的白色条码都是一样的,分为以下三部分:( X- R! c+ x4 R- E* d( l
6 s7 b$ S; |8 q. H1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。- O* J `( ~. g* l: n: |* r1 w8 Z
1 B4 z- w; Y$ c( \" B" S
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
3 g+ s2 {8 g1 W3 N9 N( [' I* M P$ M5 K
1)起始部分:00110;; y& C( t1 s/ j5 Z$ _; U. {7 \
' Z" S4 C+ @* S" n) J) u$ c: L
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
9 W1 a( J* V7 }9 L) e: G0 D7 [/ o
% q7 E) }0 A/ E2 O9 g表一 某校图书证号每个数字对应的代码
+ M3 q f9 d& }& X* X8 t. S" A
1 ~# O4 N( }* i% T; v! ~ G数字 代码 代码数字来源 数字 代码 代码数字来源
/ |: E4 w7 f# J7 ]1 10001 1:0001 6 01100 6:0110
, ?0 R. m) [2 V1 s1 N& A0 u$ {' V# N2 01001 2:0010 7 00011 8:1000
8 e$ V3 n! h9 E4 ~! ~8 `: l2 U3 11000 3:0011 8 10010 9:1001 , h# i% g( G) `2 B1 w; I" W2 Y8 r
4 00101 4:0100 9 01010 10:1010 - c5 N* \: C5 x& }) @
5 10100 5:0101 0 00110 12:1100 & C2 I! A @0 | m: s- L( @
7 D5 \7 W' K- N# f. _说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。' r4 C6 ?1 ^3 w+ \! J: K
a( j1 R4 F5 M5 |' k' i/ D3)终止部分:00110,与起始部分以及数字0的代码都一致。
5 H! R0 U9 L. Z
# K9 d" E9 F; e' d8 y2.条形码的制作过程
/ ~: n7 n3 C3 q: ?3 s) ]; k0 |8 Z, E6 f% n2 k$ C7 {
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
4 @8 i- Z( s0 x. f
4 j0 Q; c. i& @, [& J8 v1 W定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。$ p% V. B% V: E5 k6 }( E
5 A: i) w: I6 [; B) ], z& b) E+ o& W
条形码效果如图所示(程序代码见附件所示)。/ l: t6 r7 [# d& B+ l
# z( s7 K9 u0 S+ P" R
图一 所得条形码效果图
' a/ f) @. p, G8 a' Q" ^6 |+ O0 P4 u+ n+ j
3.打印与测试
( x& Z3 P2 z, F* x; Z: e
1 i4 m a0 f4 I有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。 O- m: F1 R8 Z/ ^& i; G! ?( b. G
, ~, C" ~" ]+ G因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
2 G7 A. a( ^2 l2 R7 s( B
- Y, I+ m9 v" Y2 Y' i7 v为了方便进行测试,本文打印出不同大小的条形码。
+ q/ M2 k" R$ @% L/ V" p+ g
# k) m* }5 F# N' G: ^测试一:将其用透明胶带粘在硬纸板上。$ Z5 X: a( F5 _) h3 A, t' M- L6 ~5 f: ]
9 D! n5 h) ]) M1 P3 s
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:$ g: p" V# E0 I$ H
; y9 C# w. g4 c* F
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。# g" h' e1 M7 u& x/ S( z ]" m
$ t5 X0 c# T( j4 L |
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
. O; h( y) X d9 L& b7 q, r2 d; d: a9 f, L' q1 m. H
效果如图二所示。
5 t: ]; x; k) c v7 q. F$ [: c
2 q5 D% W$ o! y8 ]7 U$ N1 {7 \图二 打印效果图
( Y: b$ p6 t: H7 A测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。4 Z2 F1 K+ n5 I
/ u3 G4 _$ P0 t( i# u4.扩展应用
, M$ b, T- K! h
0 |# R) R. ]- Z$ [, U6 Z/ g为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
2 S6 d i& j; e0 B3 K
, c6 U$ e8 d: `图三 可供彩色打印的图书证8 n/ @! @% U" e0 \! t/ t F
& e* C" f. T+ g过后,我们会给出相应的网页版、C++版、VB版等等。% w$ a6 E$ }* O- U3 S) c
6 l3 n: H8 X& G
5.关于本例的一些思考+ k1 w+ R, a) P7 M
, E2 [$ j3 ^' b由相关文献,可知条码技术具有以下优点:- c& r; }0 a7 ^
9 Z: {% Y. z2 I, h! W* J# e
1)、输入速度快; - H+ E! H5 R7 j, M% L6 |. a/ W
: k/ @$ S n- K4 [7 Z8 V 2)、可靠性高;& M Y# `. i5 ~5 d Q
{6 g+ e4 E1 H& ?* g/ C
3)、采集信息量大;- r6 ~9 P& O, z! p) ^" [) D: _
; b0 x: Q1 i! g/ F. W _ 4)、灵活实用;4 O) c# Z4 g& D& k- p
& P. m# J# t( [$ j6 G$ \+ n% }7 @
5)、条码标签易于制作7 H- W% g/ J* H# |+ Y5 a# w, H9 T
9 x. \3 m+ t9 F$ y6)、识别设备操作容易,不需要特殊培训;
* t: [: c9 O( k) r2 A0 j: A& D5 b$ S5 N, \( q3 j
7)、设备也相对便宜。 m( [$ U* Y8 z
" ]+ Z0 \( ]% W% Y. r0 N7 h
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
0 z: n! H, ]' r5 O- J; a* H$ t2 o: D- T0 K# O
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。2 Y( X4 e- ^+ U# q; c" F
; n, i, g8 {! ]/ S5 g" L7 ]/ A! ?图四:常见的二维码
& w, _6 M8 {9 {' @$ h' x
4 D7 F* P2 l) S( M/ j; H, H. l* ?6.免责声明与注意事项1 v' I0 T' {' Q
, K8 }" W) E3 U
版权所有,翻版必究。; O8 U; S) ^6 P4 [/ U$ T& I
( S' q9 M& u1 z1 Z4 O
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。& _1 {' m- w5 l8 t
! I$ Q+ K1 G) M* @# Z' X; [
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
K# ]# [" q$ l4 Q& ~
n v- c; ]' P2 X0 U1 K7.
6 q; Y b+ v; {5 t2 w6 s4 C参考文献* ^) _( c4 a! @$ q0 J- g; m7 O
1 W5 f, R) q9 c6 e: n- A[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
+ t4 q3 O$ s c
, @2 F5 N* w8 j% H. ^ g, I[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25], L: r! V7 ]! L, m) M, \$ s# ]
6 C& f2 j. I S
8.
0 [/ w: R# m0 y7 C, b$ e附录1 E7 O! X6 s7 U) X- F
7 w, e( z0 P* F: @! o4 \' S3 e
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
}7 u( H* q# _, T
6 n& B: b3 E4 r% y3 D3 F/ g5 l%barcode.m
9 X0 E' d9 k/ `# V0 f: _. Q1 T0 D! K! a/ D# e' s
%生成学号a对应的条形码" i6 E' o/ Y6 K9 f. F/ _$ T N
. x. T$ a" b' B. k%2011/09/25 13:24 BY小谷同学
3 u, n/ I( v6 L0 V, r
9 A+ y0 `$ R0 va='1234567890123';%学号,自行更改% k: R5 K% b' `. V- G. `9 T9 H
- o4 g* d& ^+ B5 o5 I4 b1 zBlack_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;( l0 ^6 k. ?& M) a
& r& I/ Q! W9 Q3 S D0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码8 [6 ^5 i; e! K, u
]9 e' P( _2 D9 I1 }
White_num=[0,1,0,0,1];%插入符的编码
+ b/ {8 x5 e" y6 W
! @) {$ N) G7 o8 a$ I%Black_SE='00110';* ?3 s& h( E' ]) S9 J* X
; W3 i9 U# u' m, s! t3 W( `& M1 _%White_SE='10001';White_M='01001';
9 p9 n# E0 `2 z7 V. k1 x# M, t% C3 j7 _/ R2 T' S7 Q" ~
barheight=30;%定义条形码的高度
3 E! U' P1 L5 G6 o1 H+ m) x$ B4 p6 u# T! a1 S3 i. g
barwidth=1;%定义条形码的像素宽度5 p/ f, A- l! i) K! } z2 n
5 I' L' k( L( K' `( c
6 |9 H. z7 R4 j1 B' M) k%可以对特定长度的输入进行控制,本文规定长度为13( j2 W _; V% q0 C. J' R" p- Q
/ Z9 O% }: ]$ y9 Aif length(a)~=137 k+ `( _; F0 W" W: x* _, U4 \
& ] F) y3 O& C+ r
4 F7 y: I+ @8 e4 y7 k$ herror('图书证必须有13个数字');" s( `& w F' G* ?
9 F w. ]8 f+ _( U3 ]
end# g. i5 K" x5 ]' {) ^2 S4 u, z7 x
4 u) U0 k/ n7 I9 x0 p3 P) N
! L4 h+ F9 G7 ~+ ]% P
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
0 t D6 O4 m9 d. R0 @, t/ u
) q2 l. \- O% {/ C( A I%为方便,直接人工得出起始与终止部分的条形码
/ B4 M4 }2 ]: C& o2 N% _% m
: @& }/ O8 K* A; l* K% s0 D5 R/ I%也可以由程序生成.
& g* u7 k7 C% j& m( e( \" _8 I7 ^% K+ b6 `$ ~% I8 g
total=length(a)*(7+7);# O7 D* F% Z: c
6 y' Z# m$ W' \4 C( _1 L
%条形码的总像素宽
$ W' w: a& p% G' C) _9 K1 R# b2 P& ?
%也可以不用求,因MATLAB提供的均是动态数组; K* T0 G4 K% O+ ?( ]6 D4 d
/ H* H' ]8 u4 l+ k6 m: X S# G( zs=1;%计数,记录
( t ?" Q. k1 Y$ A4 }* |! N% @" j R9 }5 W' {$ o0 Z
) W( Z' t, O& f- B" t%由于利用for语句容易出现不可预料的错误
4 d) X3 F7 f* P$ n; h+ I; J9 ]
- n* U6 ?' M; m0 S1 [%大部分是数组的行标与列标的调用问题,于是采用while循环, n6 Y8 T. Q/ s3 c; B7 S
k( A6 L! h/ }%嵌套循环,得出数据部分 X3 n' I% e9 r! w( t" P
( {/ J! i+ h+ `; A4 O
m=1;
4 e& l2 w+ j4 y8 i, j) P2 F! @. @. e2 ~. k
while m<14
8 T3 t: V$ N, i8 X
2 V0 w4 y C8 V7 M8 D4 `& |
x$ i- V" Z+ d% }. Y1 B2 tif a(m)=='0';3 g! q6 @. u6 B* O4 ]9 V1 j
3 t9 ~1 i8 Y( F6 U
& Z/ o3 l% L0 J( ?9 Lt=10;2 j6 h2 G; ^: r5 m
3 o6 ~. F3 |7 A! ~
4 [: }, A, C$ a: D& |0 f, ?9 L%若为数字零,应该调用的下标是10
& F9 d) J9 S+ f# t2 l
# \8 q2 Q" L, v' t# b' W3 h5 o7 A* S. k" ]- \8 ?
else
2 I, y, X- i2 ]( y- J* n5 m ~; a( E5 @( T$ _* Y# T7 K
$ t' U/ U; T; Y( i& x# g
t=double(a(m)-48);% D" {# O# I! ]3 e" s7 u
5 W/ W% L3 l( F6 Q%由于输入是ascii字符,转换为整数需要减去30H,即48" h! h# g% i2 u& s- T& I% I
0 Y* [4 d3 |+ a- ^8 b
) u9 r1 |7 U; F% z8 \- Q9 tend0 x: H# }6 O+ Q' i; } @
r9 K$ D" ?3 U/ {5 I
6 `2 w6 }( U6 }* x6 x
n=1;%同样的while循环
h7 W2 O! e$ K4 R7 Z1 D3 z/ x4 e3 ]9 w# [9 Z
7 D r) i8 H# J$ A3 w& X. d
while n<6
6 L3 N- S5 ]) y. m: A; X" I! c# I& r% b7 M+ J* }. N
; y$ @: u" F; T, Yif Black_num(t,n)==0" z7 d+ w9 [) K! i y9 p* Z% d
* Y# g ]+ @) _: W
" J9 Y2 n6 s, e/ B
barcode_M(s)=0;
7 a( ?; s: z& x# F2 i7 V' ~; w, D0 w" c# G% M5 X
5 q5 d! U: l7 L% f8 Q6 v7 e( M
s=s+1;( l' R; a& a4 {5 q: H m
( f; r$ F4 t! T- B- \) d- n" y6 p% K2 H/ P# a/ x( a' R
else5 `/ r& N, A. @
; @3 j9 N, R- ~" {" ]& ~ a
4 l2 w8 A3 E" u! S K! u# Rbarcode_M([s,s+1])=[0,0];
4 I; v R a* a' E3 y( X+ _ w5 `
! U# ?7 d$ r* u! X- U7 Qs=s+2;
2 [ C2 e& H( F& P. B o0 R! q* C9 g3 I9 M
7 L5 _ V( _, h
end
1 N2 B3 O3 o3 i' _# J' l# j" Y! @! P& P9 w4 _+ Y g
( b G0 a3 F) _0 C e9 c( l2 |9 q
if White_num(n)==0
) s1 t7 u! o0 c+ O& e/ ~
0 Z) B8 i1 r& x% e. o- p
- c9 @' f- H& d4 r, L# C# tbarcode_M(s)=1;
' p& O* q" r5 d& X1 S2 k* c. d# H- H7 X8 w! U
5 a* `5 W8 I! i7 V3 Ws=s+1;
" Y3 E2 P1 M& e! G- L7 O6 A! m6 ?. [) _) y q" z
& Z# y' e+ p4 ^1 q
else
) o( p7 }! e. I" U& q! I6 r1 _! I1 Z. @( x4 O3 r$ ^* ~
4 z2 I& V" d6 w
barcode_M([s,s+1])=[1,1];) m6 ?) b: c: p2 M* y$ a+ h
8 ~' C9 T& t! X
6 {/ ] V6 O$ E: l* D; s9 s# b( Ts=s+2;
E# `: t+ u) I: G" L) j3 H
) t9 u$ k" c1 e8 I. t# c4 M# c
! U7 L' |, U" D) @, w, |, pend
8 f9 A% ^4 g( b" T, Y6 `
: ]! p2 Z5 X' [; R3 f, s% f7 E0 |
0 T z- @- T5 n/ E" X1 |n=n+1;" m) w5 s* l( T8 H% m7 p, f8 F
+ r* l2 ?3 k9 W) d
" W; i) f. \: Pend3 j, v. C0 A y6 G8 ^2 k& z
8 f8 e- k \ u9 G& H- a% r8 A; Tm=m+1;
& I3 }" X: T& a$ i: p* n8 M$ c- o, P4 q# P3 k* w8 m: f* b _
end
. Q- C$ T7 o" N. K+ C* p: B' W
0 j3 ~" k. V& r* F( {0 {. y/ b# w- n- X
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
. S) v1 y5 l w# r
0 k) p) Y% l% p; ~%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵* a4 [" x, P5 U: h4 D. e# H7 S
$ J2 Y, M* A% l2 \% o# q% s
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)2 J5 e* U* T q' W9 S" Z& v
0 T1 q+ P7 ~' \1 _5 k0 iimshow(bcode)%显示所得到得条形码5 a3 l5 o9 o, T2 g" M
( ?3 a* ~8 i+ p+ {4 f7 n%然后可以自行存贮得到的条形码
' M" T# `& @7 x
, B" S% q6 [; d/ v+ I+ Q%然后用PS等工具得出具有自己特色图书证啦& W* x3 R$ o7 o \- f
- }( S# E) B8 t9 H S8 ?2 Q
4 c% m+ P+ D, a/ w: q# D! B/ q% ^ |
zan
|