- 在线时间
- 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系列之——某校图书证条形码制作
/ T" ` E" v" |0 D w$ L/ i/ s7 B8 M. g
小谷同学 2011/9/25
$ `) l6 _+ W Z$ Q% T+ I& }
. s ]) W! ~# S摘要/ e& p' M7 r% I
: }) b {3 _2 o$ Q2 }关键词: 条形码+ n3 S U( C B+ w' M% @
( v; [1 k# v- \2 j; Q" @' z9 l9 N
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
1 A! S w5 ? l2 @5 O1 I; W- v; O2 j1 V4 X1 ]# ?) l( r
目录8 e7 H) w2 B6 d" r* x
" J9 m$ W6 i C& I1.某校图书证编码规则
0 _1 O5 X4 w: I3 x+ K) T' a6 G; s6 p r& ]# W$ W
2.条形码制作的过程5 U; j1 k z* C+ n" P+ s- x% U( L
, P* n' u4 w: @* I+ l% s$ |
3.打印与测试6 O6 g# s& A/ q* y! ~3 D A
/ s; @. M" k' J. d5 f! E) m: f4.扩展应用
& s5 D2 G' i* m1 G7 C% q0 W( s! t- E/ g8 i+ | u
5.关于本例的一些思考
) t; r' Q3 K6 M! q- r. |3 d4 |5 s' a' {6 g* E; P* w9 o
6.免责声明与使用注意事项/ f% }# X- c! W7 z$ c' o) d
& b8 @ D2 l% i2 m/ b8 l- q7.参考文献
; V4 g, {, T3 D: l4 G. r7 {* S# b
( l. x9 R* t9 _& K- D. @* x' w8.附录& \# n* j2 s% z8 [' ~9 ~
. s3 \8 O$ M. `# P( D: A5 t, M
, D! m3 V8 ~( L0 `. ^3 l% _& G& M# z
3 _7 Y& e( z; M$ J9 p3 h* W( p9 q4 g5 z" R# c5 P
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。; K6 x( H4 J. B; K& `
4 ^* n: q5 P6 ~4 A0 r
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
! R+ [' F1 o2 ^& i/ }( A+ i: B$ H
1.某校图书证编码规则
n1 ]$ ~ Z: S; g' Q. s
1 \7 p) m- b! Y0 h+ Y6 l由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:5 T$ h. G$ j$ N1 Y& o
9 c1 U2 l7 {. v P①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。; q Q' x# D( v
+ W9 l/ k/ W2 a: S. T* J# w8 m
②图书证的白色条码都是一样的,分为以下三部分:
/ Q/ T% T8 a- Z# k, f( d+ e3 _ z1 k9 t/ V
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
; L! x/ [. P1 D" K9 e: {. Z* d. F3 f) P
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
$ o+ O' W& M/ v5 Q( m7 P! ?2 X& Q3 g$ g. y2 f9 l5 X; h( E2 ^# H( v( j1 N
1)起始部分:00110;6 O7 g, N7 E( W, w& e
6 t8 F# Z+ m: n2 E% l' B, E
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; / e3 b- I& [8 Z
$ f# E$ }: F6 G, {7 I. \! j
表一 某校图书证号每个数字对应的代码' C* i {: D7 Q# k* C
- f" r* s0 c, W- J9 ]# v( Z
数字 代码 代码数字来源 数字 代码 代码数字来源 7 K1 n. Q, M. `8 v
1 10001 1:0001 6 01100 6:0110 " H6 P2 @" N q" T/ V
2 01001 2:0010 7 00011 8:1000
! V' {& n0 @! I+ x6 U9 k4 g3 a3 11000 3:0011 8 10010 9:1001
8 ]; w: P+ g1 X. Q) L4 00101 4:0100 9 01010 10:1010
! r# H* y' p/ d8 K1 x5 10100 5:0101 0 00110 12:1100
; @# |* l5 n: G. R3 Y' t; [% j( u( p+ V& m
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
$ _3 T" L' I0 q
# S: _" Y k) A) I- w3)终止部分:00110,与起始部分以及数字0的代码都一致。
4 B7 G* [, S$ H# s: z; y1 u2 \: J+ {6 L
2.条形码的制作过程/ J: h0 B; g/ z6 A1 K j% ^
4 u, b- k# h8 j1 T8 K8 F: `
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。# V/ [% y. w0 t2 g# p8 q
& ]3 l3 ?) ?: c0 M, c. U; x }
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。2 z4 U: K5 E# @, }
( c! s5 a+ a5 Q! _5 r' \: f, a条形码效果如图所示(程序代码见附件所示)。& ?) o2 C! N* m
2 p/ ?2 [/ \( R6 T- {
图一 所得条形码效果图& h8 F. }9 _0 R7 l- I3 N. f
4 Z2 x* r0 f% K+ ^9 `3.打印与测试
, C1 j4 C+ f7 f- j$ E/ L5 ^. V; {. V" a1 A' V' y
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
: {1 r0 w$ z( u9 y4 J
; V- u7 G# n: m; Q; M# n因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。/ j$ s' m3 a: x& w
9 A8 u: ]" a; a为了方便进行测试,本文打印出不同大小的条形码。
t2 B( l% l- R+ C7 C) C, h5 Z3 b5 B' d5 u# n& Q& U) B/ q$ c5 m8 J
测试一:将其用透明胶带粘在硬纸板上。: C4 @1 @; f: A
' E/ `% i; \0 S! O" |) A& B- c结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
; ?8 |% ^" y" J& Z/ ]$ s: @
o+ W) L3 i- J& d% s5 @+ r图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
% n6 `$ M+ ]) Z9 E' }5 y0 f5 c, F7 T, S
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!& k+ R4 C. O7 W
2 G& ~( e/ c0 ^( p4 `% c1 g: I- {效果如图二所示。
/ V& F+ h. c P" F
- Q7 D$ T, K2 ?( D( X. W/ k/ C
图二 打印效果图 H: ~4 t! n+ q P7 s; S+ q; E
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。; K5 P8 V5 t% n3 w' `0 \
9 w$ B: |: v( }! V$ c( A' t
4.扩展应用3 K) m$ v. S" N! d$ Z( Y8 Z8 _- _
; E/ W, Z; a+ E% y. _为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。, h" a+ p' E3 ?/ U4 n7 N* X
) q; C6 s" N& i& ~0 r2 M
图三 可供彩色打印的图书证4 ^3 ~7 M4 M& M9 W
. j2 B( {2 F* \7 @7 [过后,我们会给出相应的网页版、C++版、VB版等等。
7 O+ M# l+ B- v3 ]' e( X- s4 M C+ i% F/ G0 K
5.关于本例的一些思考
) G/ h$ _. e( m& [7 j7 V* d p7 g0 |: t3 f) {* d5 W0 i
由相关文献,可知条码技术具有以下优点:1 ]' I1 P# L; K7 v, ~0 h2 x+ S
3 U- G8 y0 K N) F 1)、输入速度快;
$ t' O. b/ h* w5 N3 U& _8 p. l3 X8 `; {; z
' v) ?. @: ^3 g% { 2)、可靠性高;) U* i- `& D0 }- j+ L1 M( i
, ?# b+ G9 P( R6 [$ v/ G
3)、采集信息量大;- s6 x+ U/ J% ^ F7 Z0 w- s
# y: e0 L" A) g9 X8 @
4)、灵活实用;# N0 {! y+ b* k
# O) B' [0 \# c+ y0 f
5)、条码标签易于制作; C1 x+ ]/ L- R
2 K! G$ G! Z, \9 ?. ^
6)、识别设备操作容易,不需要特殊培训;8 a- p) h! u4 U# D1 Y
, v/ Q* I2 K2 M
7)、设备也相对便宜。
, q2 z6 ` o4 {( g* S9 G* h
# g. ^. B# U/ j2 a) \因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
# g& K6 J! c' `8 ~( w% |1 t" d( b( B5 s" ^9 w
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。, F/ P) D- f$ a* k
* I1 D- }( K# v0 C i: i7 q( A& ]图四:常见的二维码
9 w; y0 D9 s& j3 L8 ]% w
* [9 D" x' w9 {; x/ N6.免责声明与注意事项: R4 l K) A8 z) [( Z
: j! @, ]% R u4 K7 V2 `版权所有,翻版必究。3 m2 ^4 e" r5 ?- ^% R
9 g, [5 U" A# {# E3 l9 p
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。3 q+ p3 u! X6 X* I. R1 {( C1 N6 c0 s
& K6 e4 k. w7 l. |. N3 p- }
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 % j9 p0 Y4 b% d. \
& Z$ ?+ l& ~4 d
7.8 w( d$ ^' K7 D: O9 V- @
参考文献4 l' F6 j" @4 Q; V: g3 d& m
( L1 q. O& a! [( i4 l: I/ ]4 w8 I9 U
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]) X, N& A" f, U
0 o( x |. c* `& [) K[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
0 n8 A4 q: S: j4 B* n2 b M1 c+ S) s) c& i
8.
A% q% w& r0 l8 ?: r" {8 [# r附录
& x: {! }/ T( c
( S1 H- i1 y3 h: B& }相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):3 _+ i; `* _5 t/ R- G; K- \
/ k2 j8 c% U7 u! B
%barcode.m
z0 J) C& E4 e5 e7 ?# |
8 T7 R8 d: u5 ~. M7 m! a, I/ p%生成学号a对应的条形码
/ n7 t8 l# E! |* E4 X, G s7 R+ |. j" O
%2011/09/25 13:24 BY小谷同学
# N' I7 g; l' b! f0 q% N
4 _7 f" d1 i- _' |' }& |8 [% L) xa='1234567890123';%学号,自行更改# G/ X: ?; ?- X {) ~& w
- r+ i! T! y4 b( P, ~8 G. }
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;
# @6 @6 O1 E& g# `. m' A" T& A! Q$ i; K" M. P8 F! f
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];%数字编码
* K1 E. W! d0 d4 y( Z1 _6 U
/ W1 O8 [# C$ r0 l4 I5 PWhite_num=[0,1,0,0,1];%插入符的编码
8 y- a! M L5 Q, G
* k2 h% w, o. G%Black_SE='00110';
( L8 o P% S9 m- n1 M; |! `4 M @" |7 S" U: O- w# B8 f
%White_SE='10001';White_M='01001';1 v* l, P0 o. t5 H ~% O r
- s4 i: y# f2 {! z s
barheight=30;%定义条形码的高度
, M" e$ X/ e( y' J: x: ?
: Y- H: n! x9 Abarwidth=1;%定义条形码的像素宽度
: l3 q2 t/ e) ~% s9 D4 Q# Q( O& M4 g
' |. V/ P" E) `6 i%可以对特定长度的输入进行控制,本文规定长度为13
) p7 N( H; d0 R* Q4 b$ R: }: \; E
$ C* V8 U+ o4 W. [" Cif length(a)~=13
0 T7 x! f |& r+ x2 Q$ c/ J
; f3 s1 y% \- ~* a, r) G, M; S: a$ W# r
error('图书证必须有13个数字');
0 L1 [3 i% d' M" N* A
/ g7 w6 g' s' y; o5 m' c- v8 I* `% w+ [end
3 k% U6 I# p" Z2 G6 N: E0 w, z! M) y: f# J8 L& n6 P
4 `+ ^$ i& t6 r5 a! s/ `4 _. t5 M5 S
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
3 M, L, S) ?: H9 b
- U& ]& i- ]$ j- M C( M0 \/ Q& ]%为方便,直接人工得出起始与终止部分的条形码
. Z; G! W1 E/ ]9 w9 H0 F$ |
( K! r. h1 n' j" h, w: R9 E%也可以由程序生成.
! A% J7 y* {* F( K! E9 C; ^( u5 Z( E( }" j
total=length(a)*(7+7);
, @0 O4 v# C: P% B( @' i' o( h$ I
%条形码的总像素宽. y( T5 u9 Z( d3 M: i2 u& L
' l: L& B3 k; a8 H0 u%也可以不用求,因MATLAB提供的均是动态数组
6 u& A. V* N6 ~+ f. d% L3 v7 a
+ b/ F% _0 R2 X) u# ? j \' Y( bs=1;%计数,记录: I0 z1 q% I0 q- s
7 V) }5 n6 d5 ~# N9 B4 o: _
8 t, r' n( a& r" R$ G%由于利用for语句容易出现不可预料的错误! d! I' @/ w. Z3 @6 z0 {
* Y. W0 N) {4 z8 k$ d) ~# D4 G%大部分是数组的行标与列标的调用问题,于是采用while循环1 t) l) |) M6 Y1 W
* X& t- }8 K" H5 p5 I! }. u
%嵌套循环,得出数据部分+ J- _- |. f1 B" j# ]
" O- |2 F+ n/ w- ~& ]
m=1;
8 i) ^+ i+ T5 Q8 r5 C1 S, }6 \' G. r' w f
while m<14 ( [+ b( H2 Z z" W1 A& M8 C
% i: w* o: z& P1 E" ?" k) T4 Y' {- x& j7 I/ ~2 W
if a(m)=='0';& @5 }: P- [. j2 ~6 \
7 h' c0 a( T2 G+ l" ]3 O# Q5 g
9 T2 K: @* O: It=10;
& [' y& ], H4 P7 Q/ z( J7 e( x0 Q' ?+ A; p
: Q- h, k) w: y4 l( U; N
%若为数字零,应该调用的下标是10
) r8 D; O5 i& r1 Y/ U
/ D) t& ^# Y, ]& M2 ^6 }2 i7 [6 Y2 C& l5 u W) g6 Q
else
; x+ g6 g8 |+ t2 v9 e* |- i* A2 N1 s! C6 Y9 N
9 `" }) B" l) B( W" Y) c( ot=double(a(m)-48);
4 C$ K* f' L3 ^. k; N; y- L* _/ g9 C% h0 \- W+ i5 f
%由于输入是ascii字符,转换为整数需要减去30H,即48" g8 e( a5 Z9 x+ c7 e _3 A
3 k, y5 J4 {; v0 E: D- z9 o
; A) A* U( l+ X9 Dend2 J- y6 U b/ s4 G/ M
$ A2 i) G5 c0 Q: [0 h$ _4 k5 B" N
8 U q* a' l0 Z7 n$ H
n=1;%同样的while循环
5 C q9 r) m* O+ G3 D k/ I) t" `1 J l4 C
: l) h3 j8 O0 y" r
while n<66 b8 q% X4 s& O3 S) R
" z8 q, c* _; H0 f4 k; \
! U8 P( R5 M7 U% y! y
if Black_num(t,n)==0! E" ^8 ]7 F5 R q/ ?+ S
8 r0 a8 Y: i; U$ _9 w$ _
' x% h9 X4 J# ]& J3 ]barcode_M(s)=0;
0 k6 E* I! P: o( \# c* O1 u1 \ h( z
7 B9 J3 E$ R+ o- j+ q+ Ms=s+1;4 h; Y5 y( u: ^9 R! A
5 e! t! ]: [2 \: K2 J; |% b( C$ @3 e% C
else
0 U+ X0 ~: D/ d0 B/ @4 _3 `
& y7 c) m' @2 e/ I/ h
' P8 {' L' j: y8 P" b9 D8 Nbarcode_M([s,s+1])=[0,0];
( I( @9 K* r/ L4 u
& Q6 f% H& r# i. y9 A E
: @* J' c1 ^- `; U1 Bs=s+2;
" J& ? n* g- }0 u. b+ K. v, P& n, T' `1 p% o- u' \- z
3 l/ w$ O$ V& {( C. hend Z- n/ P5 @ K: j, ^1 N
) l8 I- m" Q$ k0 k% U! C1 N
4 A) t# G1 }: K2 u( jif White_num(n)==0+ d6 C6 `' F: K: o9 p& u$ T
& @. b0 I- [6 F8 ]
! L! L, g( Q: L @! ]0 G* ?1 W" ?barcode_M(s)=1;. V0 D0 v0 m% R+ i
( D0 s+ ?3 r2 Z+ j Y0 W ~0 }$ m" K, S4 g# q6 E2 A
s=s+1;$ y' z @2 o' R- w' v6 v( Y3 B
! G: w) q: @3 K7 V
: j4 m [1 [2 [0 }3 B/ [- x
else9 L" t; _2 E! z2 {7 M, D4 S
7 }" f: v9 o& c+ F) B6 k7 {1 E0 v8 ~3 g- A% T* V8 w
barcode_M([s,s+1])=[1,1];: o M# y; c) J `; x/ e, u% Y1 q
) |) t- T( m, I( U( O7 n
4 Z/ E6 v; d8 [' U/ B( Js=s+2;
$ f+ B4 x5 ?: M C {! }
/ f; y h$ [4 N3 C1 \ ~% H) D6 U' V D, p9 g8 E
end
1 a% l8 `5 o6 [6 ]1 Z$ q+ q0 u; V% x9 q B0 K! K
6 U7 h4 u$ v! @5 c( ]: En=n+1;
! L1 j( d- [# j! x" p
# g' R: }3 u; j5 { m9 _
! l+ z: [( {9 z6 nend
, U9 u2 Y, A6 u+ _* p6 c t' G0 ^ U7 M5 j* x" f1 r
m=m+1; D% g8 _, `# U5 a$ A
& m0 H# L$ p p7 hend: d5 l& U! s7 T( v7 H4 i
3 i' W6 X1 C& H2 ~0 {- U
5 F9 b$ Z6 z. A9 h' l- qbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];' \ |$ i" N/ s, \2 A/ F
3 w' e/ K2 [9 _%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵$ ^( y$ p7 S5 b/ U" {
$ o c( c l+ b1 ^; a& gbcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
G C9 x9 j- _; L& I8 k. N2 G1 q/ b* \$ L0 K
imshow(bcode)%显示所得到得条形码
6 q: \5 Q$ f# H, D: A6 w
$ N& ~. ~. M, F0 c& C# ]%然后可以自行存贮得到的条形码# X' u9 c' N- `! C! T# D( ]1 ]
& F. C$ m$ h3 \$ A g) V2 Z%然后用PS等工具得出具有自己特色图书证啦
0 q( J3 i' D' l1 w8 b/ _8 a. J# o* u9 n9 X# l5 S- _
4 u3 R2 x: ]6 A# i( C
|
zan
|