在线时间 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系列之——某校图书证条形码制作
* A5 J. @( W, k/ A) O2 A% W 9 ?. ~+ y( O) w) O4 d5 F/ i3 V8 f
小谷同学 2011/9/254 b# I0 B: ` q. j" P5 R3 y. L
7 P1 a, L @8 G7 P1 \! r 摘要) E6 \! ~; x3 o' G% H _
7 ^2 |- J" j# |5 i1 ^/ w2 y& g 关键词: 条形码
+ Q5 ^ `, t0 }% X 1 E# k& P5 Y% g1 ?9 p* ^
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。4 d* \, S/ n1 ^! Q6 x+ u' Z% @& R/ n, C
: T9 X. ?2 A# i 目录
& q, i4 @* v9 x/ l# P 9 E* t) D" y. d* Q
1.某校图书证编码规则
0 {6 h, v. W# g. h& M2 L$ l- d
4 o& m# |' ?8 V. ^$ J 2.条形码制作的过程 h- B- a1 {% F
) d" q9 z' H" I9 `3 U. j1 }% V 3.打印与测试
9 K5 c# i1 J! \2 z2 {
; M0 v; y" v B+ s0 S! d 4.扩展应用! `" q+ t) _3 u+ U( ]- }
# |# Q' \( G6 \( x( _( J* r/ K
5.关于本例的一些思考
! {' m1 F( v6 I7 [ J# m% e
9 `9 C+ S1 O& _ 6.免责声明与使用注意事项
) Z# H7 l3 N& w2 U : Z9 o! l& O- t" m' G% x- x3 A
7.参考文献
+ N o) h3 b' @' Z
/ h3 O! L3 ?% ` 8.附录3 o8 }$ o0 G0 K7 l& |0 Q
2 ~5 L9 y5 _+ @6 Q; G. R. [( B
( O# }+ e2 g) n# e
- e8 `% z: A( R/ b! \3 t ) \7 P6 D4 Q4 U8 U, `. F( T; U
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。7 z. |/ a- A/ S3 G) H; V8 |
' I7 K/ C. ^' |% R5 M5 f
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
: c5 P( o# f; t8 u
+ d3 j; ~; [$ [4 {' b& o0 m 1.某校图书证编码规则
& R0 K0 I: j$ n y
5 d( U" Y" ]; H+ O7 T/ j5 x' d 由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
c% G: X# Q" m1 g % n# p( X7 k6 |) C7 `/ G7 X7 k% q$ V7 J
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
) ~% h# _% i( c ! l% d! X2 k, w8 B
②图书证的白色条码都是一样的,分为以下三部分:
" P1 {( m# j$ H# U. Q3 @+ c+ Z) S0 K + t; z( J6 d/ g' P, J
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。0 d9 r3 V+ N Y A6 G% J
; h4 d% Z: E! N) O, ^* `. F: D' Q ③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
# x& n- Q# ^+ n5 j 6 O8 o8 ?1 ]( ~) o4 s: f
1)起始部分:00110;
4 ^8 h$ v: G! n; H9 w / J6 V" A' V3 P, v5 ^5 w1 g" a, J% C
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; $ p% r. U3 c* D: [2 b+ C: Z, x
9 }0 |! q- J( F3 j! o3 \. Z1 a
表一 某校图书证号每个数字对应的代码+ m" ]4 N* Y* H8 V9 }: T
$ H% s3 _! v& K" C/ j$ d) `( l 数字 代码 代码数字来源 数字 代码 代码数字来源
7 C; K! A7 H, Q, ]! x E* w# O: x 1 10001 1:0001 6 01100 6:0110
3 ?$ j! d. A* |; f; b$ F 2 01001 2:0010 7 00011 8:1000 # e7 v( u7 L- Z% V& e3 u1 s
3 11000 3:0011 8 10010 9:1001 , ~& r2 T% Z! h* f B
4 00101 4:0100 9 01010 10:1010 : \) K. L/ p8 E8 \1 [( z
5 10100 5:0101 0 00110 12:1100 ' C, R5 i6 w) W. J
. b1 x9 b& k2 W! {( I% Z5 {1 [$ Q 说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
2 H+ G8 B' v- L * U' M- x, a4 M/ g8 X+ x
3)终止部分:00110,与起始部分以及数字0的代码都一致。, C5 o! f% ?9 f7 e$ o
/ y! Y8 Z* M2 m; L+ i, a, g 2.条形码的制作过程
' x5 l1 t0 f% h( O5 {+ U0 n8 Q* b5 f$ I
) k0 f' `9 @2 t 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。1 g3 _6 D% v0 ?$ C
' t1 |9 Q. {0 H: X$ y# r K6 }; m
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。2 g. Q# q' N1 a' T( T) A; E" `5 \0 X; ]# X
$ Y! z+ f) g: x5 {) J
条形码效果如图所示(程序代码见附件所示)。( P% r4 n2 y2 M7 Y
: i! U3 ^7 J( _6 J( ~
图一 所得条形码效果图9 ~2 Q3 B/ e; J2 p7 k# q$ l
' q/ D! R1 p. O& d9 D3 t; h6 | 3.打印与测试
: W# g# {4 E, Q( t+ H7 j( } 5 D5 G1 P. P9 p% c8 U
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。' n. ^. u( Y, [0 c
( J0 _" H S5 B! r) [) i8 F' R 因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
3 h- B+ S- K# A7 C% `
# J$ {4 B5 v4 g z; S* L ], m 为了方便进行测试,本文打印出不同大小的条形码。
7 Q0 O/ t% K$ K* ^* s) a 0 F3 W& o# ^& s- ^, ^+ ~1 b; M2 {/ v+ h
测试一:将其用透明胶带粘在硬纸板上。2 l T) h8 i: n* A
- Y$ ?: ]6 b& D3 t. r* q; @% L
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:4 F9 S- O) l$ u0 x3 H
. m* X% c/ M; }5 K7 W m/ r6 F 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
1 g$ p+ d5 x z% R, p
, a- K; @/ p; {5 I 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!5 D" u; r6 N# S5 M2 v; f
0 B7 {& r: ]! |: t
效果如图二所示。
+ I# b2 l3 K, _# m* W; t; ^
9 o( R2 H# z( n7 @
图二 打印效果图
* x& m( O: \) V6 c. `( @& j0 E 测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。( U. [8 {8 u: J2 h
1 x* V8 B: k9 z4 v
4.扩展应用
- U. h4 d& @: B, y, K3 A 8 p+ B6 H$ o0 k" v/ n- b2 ?
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
/ L) S0 F/ Y; L
8 w3 n2 ]/ ^$ t' l5 A7 c' U 图三 可供彩色打印的图书证
6 k; e0 _+ E, W4 _+ J2 A ) Y5 j/ b" ^! F# O8 b9 x
过后,我们会给出相应的网页版、C++版、VB版等等。0 y E5 Y" X5 j4 O
: Q3 T% p8 A0 t2 t0 I7 M0 X
5.关于本例的一些思考
" a9 M2 \. e0 w$ f4 { % Z; F* n4 W0 z7 D
由相关文献,可知条码技术具有以下优点:
$ y! i$ C- U5 q( r9 ^9 P 0 g9 l9 K' {+ Q' X
1)、输入速度快;
; j7 \4 y5 s$ j( t% t. W , {. J4 ^& Q0 ` S1 q) z; I6 Q" [
2)、可靠性高;- K8 o1 A3 ^4 ~% b2 B0 d3 X
% d4 h; r8 ?' Q/ X B 3)、采集信息量大;5 h1 l& t% t4 S, X9 P+ {& h
+ |) F+ N% I; Y7 |9 k 4)、灵活实用;
7 }5 `5 T0 e* j3 a0 J) ^/ j
Z3 ~, X% u; k. F0 y. r 5)、条码标签易于制作
/ \2 q/ \, m# i$ w) v " k# B9 o. U- B& G5 }
6)、识别设备操作容易,不需要特殊培训;: \8 W8 P6 U' O8 C; ]* V0 k
) _8 P8 i: R: b! X" [ 7)、设备也相对便宜。
: `. j; G% ]$ Y8 D
" \$ ]4 w) t3 V7 e7 V9 a: j 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
! R: C6 O: t# b; Z 2 p5 L% p2 Q. Q- M6 L
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。$ {: \; d3 V! f! h6 ~4 k$ M1 @
/ L0 ?8 z. j% e# g% l! {* ?5 [
图四:常见的二维码+ q3 n8 g5 H, ]" L) F% O
2 D( }2 W1 r, }' K% ?$ L
6.免责声明与注意事项
* K# T* |/ K$ W2 z) e; L" k4 y 5 u. }: a0 T- `: V* Y! u
版权所有,翻版必究。, V; L) o! h) H$ d2 v- I
" X6 w# w. T2 v0 j5 y% K
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。! L/ K; B7 l. F# w% V3 q2 V
2 j# p0 g$ B+ S0 W 任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 ! @' \+ A5 i0 I7 E5 S
+ v7 X; u! w7 g
7.0 _1 q$ ^6 ~) |' \
参考文献: I2 @5 D; }' ^ M, n% i: s/ d
: g8 S+ C6 e1 P' z! c7 D/ w. E [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]
+ l5 V( i8 o% c7 ~; M
5 P; G3 A: k4 R' j [2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]
% t1 @! K- I2 u! H+ \ ( x& |! A6 _& [) I4 ]
8.
- m5 B& I' j/ n) J 附录
. g: r5 s; ?) t( j, ?# Q. N. u1 [
! o$ A' o4 F) g1 X4 U: L3 x# u 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):8 P/ Q7 n- Q0 O$ O
4 e5 o" _7 d3 S' C
%barcode.m
% S2 @8 t9 V0 |3 ]0 E0 o9 R! f 4 A" F. Q; [, n/ ~# U! q' }
%生成学号a对应的条形码1 @- x/ ~+ O6 h$ H$ J. N
. A3 _, D0 d+ d' |
%2011/09/25 13:24 BY小谷同学1 O8 P/ p+ ^! G* v% {8 y
# @8 ^2 H$ L, J, c
a='1234567890123';%学号,自行更改" u9 e, O" y/ S% x& F% E7 |3 n
+ Z F3 {0 b3 f" s9 l' i 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;
4 u4 U" g! R# n9 T' J- p/ h ( z) ]( H4 u/ E+ ]3 x6 T
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];%数字编码
" [2 V, ^2 U; \8 s5 U6 L ' I( k' N3 {7 V L/ v4 E$ N
White_num=[0,1,0,0,1];%插入符的编码$ ]- O; H! M7 G2 ~
4 E: V) \- b4 G4 h) Q' a: U* ?
%Black_SE='00110';
; L! M: U$ [1 t2 X
: i6 I" u; \4 \( ~$ S %White_SE='10001';White_M='01001';5 e$ i2 p9 X# B3 c
. M5 M& b+ R9 p" c2 s barheight=30;%定义条形码的高度- G: r I/ g$ m; B3 _
; j# V: L7 A7 ~ barwidth=1;%定义条形码的像素宽度
0 `, n' y: A1 a; u . h$ w, r. M. n# o& A& n
3 w) H: D. @# C$ k3 |
%可以对特定长度的输入进行控制,本文规定长度为13
" q+ D5 _+ R' d) {* ` ) [: N4 V0 j% r `7 V8 Z5 c9 X
if length(a)~=13$ _1 X: s' V$ l. E% t, _: l: Y5 v% w
8 q4 X" U; \& Z4 G
: {6 i/ H+ v& Y# D- }! c3 C( E error('图书证必须有13个数字');
# f6 O& X5 m& q7 P3 E5 R5 j% L 4 {7 K- _+ Q7 `+ a! U0 g: n
end/ \7 ~- Q4 A+ U1 A
" s5 Z+ c# T; |
9 ^. y8 _# `6 G% V; m' n
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];& M6 W. \! V; Y1 o! t
0 O' U0 ^" p, K7 K( F, ]5 B
%为方便,直接人工得出起始与终止部分的条形码
n+ q) X. _) d/ Z
7 u7 s! R0 u: Y% j1 F %也可以由程序生成.
( @; U9 l4 `9 J 3 N* V9 z: b- U! z
total=length(a)*(7+7);# T& Y( K- M% o# }8 Q" z
0 j3 l+ r: |0 Z4 ?7 e: [ %条形码的总像素宽$ H* m2 d/ H* Q1 A# y% ]0 ^
9 N* J. U7 ]3 y* q ~( L
%也可以不用求,因MATLAB提供的均是动态数组' C5 Q$ B+ L" V; E
0 m9 g: a: \) i, y+ v! F
s=1;%计数,记录! O$ b3 ~# L* ?$ I! N$ _- k. p. R
8 |. F4 `2 R) T8 U( F; {
! {5 k8 ?0 K3 a& X; P- j% b %由于利用for语句容易出现不可预料的错误
8 U) ^ M$ Z+ B; S" P/ m& g% e % F$ n4 `* O. v
%大部分是数组的行标与列标的调用问题,于是采用while循环) Z& {+ P5 r- v
$ p6 h& I: v# s: |6 l- h! k; J( d* A %嵌套循环,得出数据部分- M# O7 }7 s! `* r/ @; o; l
) [, K6 s6 X+ Y9 A8 g i6 r& m
m=1;
+ t" o: O% Q8 S5 [6 P2 {
. o* k: x+ w7 T9 e6 k) F+ H2 n0 o9 J while m<14
) K( @1 Z% g6 V! _2 U! S
. `" R# x1 l* c4 A5 W
" m9 N; j2 n5 e, B6 @ if a(m)=='0';
9 c* ?7 g5 j: q M/ f: |
' |- W5 G0 w8 r* [" a+ I% u( I
8 F, J9 o* y* e3 E1 I- }( t9 L t=10;
! O& B: ]0 |4 a* V0 P 2 U1 _3 \2 L( g; @7 u% s5 q
0 d: M/ u8 S3 E/ |/ p1 m" X %若为数字零,应该调用的下标是10/ F+ V7 z% l$ g" p7 @7 w
8 d5 m0 L; [3 ~
: d% l9 `3 I, Q1 L) _* U* G else
, q- }4 c' ~6 {2 j0 R( e
( X; u; L$ P9 I' K6 P0 C 6 l" |1 z' d. N3 P" [" k. E3 F
t=double(a(m)-48);& T( Y8 D5 {) @3 h
; p1 u' j# U( V4 N, _* g %由于输入是ascii字符,转换为整数需要减去30H,即48- f- E" J0 E, i" k- `" X3 t' l7 G
) i7 l& T3 Y+ J8 C5 a
7 E( z4 l" ~0 c9 b3 Y* A; p end) _; S$ M: Q% ]( P, ^
. A4 C9 h8 Z4 j9 l/ A- R2 T
X% ^* c7 U* R2 Q( Z n=1;%同样的while循环
+ T" y: i5 X1 e7 |, c/ X0 i# f - Y6 l" |" N. J: e* F
4 u# K N2 `# R* U. T9 R$ E% I4 t while n<6; L' Q* L9 V% J8 e1 G
6 L: k4 O0 C9 \. R/ A
2 h7 r* P4 J9 ^" F4 h
if Black_num(t,n)==0
, G4 L1 K" w4 J
) q0 m' P0 V& J) T% h: Z& j* X * B( u; b _8 B3 c" a+ u- P
barcode_M(s)=0;# V; ^ E" @3 y6 v3 ?4 d) d: l; \
/ }- K1 R+ o8 o* C3 j
6 W& \/ k+ b6 [8 D s=s+1;- w \. Q, k( f+ @ @) G3 ^
3 C2 U7 W, U) g5 ^6 z. Q6 C
' `$ W8 p$ e2 X" v2 L9 f* X6 H else/ V Q6 E* q" f$ ^
' _- o- b( Y2 I& V2 D $ `/ Z+ ?. h4 o% q' b
barcode_M([s,s+1])=[0,0];
8 ~/ w, _* |0 E
/ p- K+ l5 N5 C' b " a- D% H7 _$ N E* _
s=s+2;
/ x5 I' d4 R M' i5 F8 _ ( q- K' u1 ^% m; s! K$ }
; A) W8 T" e' V) \ R; ?& r end
4 h4 y3 h$ B4 z8 n
/ g, t4 G1 o7 D * S+ r. J+ Z J+ G" K/ W
if White_num(n)==0
5 v- D' g b4 `- k 4 o. I! a; r2 i3 ?% \
$ j0 c) t; @' `$ |
barcode_M(s)=1;8 h" D/ S3 g7 c @% t6 N5 q4 E
2 w8 R: u2 z6 K' m* K/ S% k ) B9 i% U6 a5 H
s=s+1;* c7 U1 o7 T6 W0 T8 b# V
0 }+ o6 z. ?: d z
: d) w2 ^; t0 ?- X/ Z, u4 p5 X
else' y! M2 Y# b# }& h
( V+ o i& o, @. O ~. i
4 F8 g' B X* O1 _0 I" t, @
barcode_M([s,s+1])=[1,1];
$ E4 n0 L/ f$ J$ n2 r ' B* z$ {, A k
1 M3 e& C" e8 P9 J6 F s=s+2;
& D2 f, x3 \) U
: p- Z. ]! }2 P
' V! w l3 X( ]. ^2 T9 ^6 x( @ end G: p# ?" w0 |% U# @1 v6 {# k) s$ Z
+ I. w/ R- ?+ G, S
# m) N, h, k: P) r/ L n=n+1;
7 y' e8 a9 t s( l8 H( ^: H9 }' P 3 Q' P$ Y; f% n4 J& T! p- Y- O
6 A2 w" H R1 p5 R7 [4 G* c
end
& X; S( R7 X) C8 p6 K; T3 g # P) T- h7 |5 B. ]2 D
m=m+1;- Z( n# k0 u8 p5 Q( Y! I1 {
9 s8 [# ~4 d+ c
end
# G% o" V/ d5 q- S& D3 |
" J( w, c7 M% v# X' c( O8 j g- f * f8 o3 P ?- ?3 v/ p; a
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
% w6 ^) Z0 H8 `5 q / ]; h0 y6 s, |7 B: M3 J8 \0 |
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
) L9 \% }2 _- z+ o
; o7 C1 x! u W5 P bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)' M) J+ ?* A) k1 Z; C! I
) U2 Q( t: x h% }0 t& S# X imshow(bcode)%显示所得到得条形码
4 s# s, Q. W5 D, O9 Z1 o ; V6 l! F" |4 _2 |) ]+ T$ S
%然后可以自行存贮得到的条形码) G+ w/ e; I* n! C2 c
5 y" L% c8 I0 N3 D% f4 t6 Y6 T %然后用PS等工具得出具有自己特色图书证啦
1 {, {, x) h3 E+ n: f' c! P: O% q % [+ v" i/ _1 [" s' B
% ~4 p$ L6 N) L! ?* n
zan