- 在线时间
- 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系列之——某校图书证条形码制作3 t: \5 K! \* M5 t; E
8 P$ E: z* t( \$ h2 `小谷同学 2011/9/25/ J7 F, c5 y9 J+ p7 c+ J
( T% y% N6 Q* s
摘要& H1 ~7 s' W' h
+ E: B" @" g$ F( V( r, ^
关键词: 条形码
- Q7 A& t3 y& d! d1 p9 n: G$ J6 `, F+ Q7 O! X: I' q. J
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。; Q" ^ X4 r$ Z V+ V* `' ?! I9 z
& R1 ]( s2 g# i* I. J, N4 ~$ ~; O: e目录% C7 L* e) ~0 P; R( C
2 @+ t8 H; y% L1.某校图书证编码规则
1 Q. B9 [7 `! u9 n! y& _
* {, K6 S4 e- I' x7 r. H' P2.条形码制作的过程
7 s& @3 L( w% t8 }- r+ B7 m3 I) W2 \- \
3.打印与测试; O* I: i6 H X7 G, {. z5 G
' p$ h1 }' `' V; C- b' H
4.扩展应用
$ W4 }3 T- g1 v7 E; ]
6 J/ T; L W& X5.关于本例的一些思考
$ }5 w3 [+ a2 i% C0 H6 U$ i$ H5 Q
8 p, ~1 w$ B+ Q- B9 ~7 i# ~6.免责声明与使用注意事项& o3 R! e; t2 T L
5 c, j7 _9 ` O: X2 X8 M# B
7.参考文献
, L8 w3 q; A/ s# {) a: s# b
; f+ L% h4 G% x0 V8.附录6 Q/ c) X9 o$ O0 S) v
: p0 k3 \# ]) n2 c
0 A3 q& _- U* X' n9 Y4 M7 U1 B( _, c2 B8 k) Q5 F- z9 C
$ m. N% K5 N& i条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。: L1 p. T3 V, |" M( r9 E( ?
6 Q, S( m# S4 }9 }
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
. V- o; R" ? {0 h v. e( `$ T
. K) o! j" `% G. g' q7 Z; \" l1.某校图书证编码规则
7 h9 h6 T& N( Z9 {. ?: I* `4 ]
& x- k: ]2 x* Y) @7 A$ W/ @) x由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:% m8 j5 y7 P4 i4 x: v
' k% e& z" c; d9 n! H
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。9 y& m1 K9 h" q7 @
}+ q3 S* l4 [7 E1 l9 [5 r3 d②图书证的白色条码都是一样的,分为以下三部分:
/ o) u) k: v( D' {7 L) e. y2 N& t1 C. C/ c; E0 B
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
: K2 ~+ C6 E, y1 m! g7 T! _3 i4 q9 F, E7 ~/ T& ]# q- D( f
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:0 g i" V+ p& T1 l: |
1 m! c; r7 w R' f1)起始部分:00110;) H, ?: g' |" T& p" d
4 L h% g. U+ b5 x2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
1 B/ B2 E3 N# Y+ @; k0 P$ h* y/ {5 c" g Z. g
表一 某校图书证号每个数字对应的代码+ `' y* f! B$ h# v$ _% ~! U) e+ f
4 J1 N7 H* G+ g6 Z" a8 I数字 代码 代码数字来源 数字 代码 代码数字来源
. j+ V- h- U& Y4 _1 10001 1:0001 6 01100 6:0110 8 S2 T7 R2 `$ S/ H% W1 H4 M: e
2 01001 2:0010 7 00011 8:1000 1 E' v. {/ k. R
3 11000 3:0011 8 10010 9:1001 9 `( u; y; D" X) x8 J4 k* j# T2 |
4 00101 4:0100 9 01010 10:1010
, C& ~7 u- w0 z. a5 10100 5:0101 0 00110 12:1100 0 b: q: q, C" ?; m) N4 h5 t- H! R
9 r+ {: |2 U5 \& o: q ]说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
( M/ F. g& a0 o% J. |/ V* I9 o: O' ~ Z* w6 ~& \1 C& g
3)终止部分:00110,与起始部分以及数字0的代码都一致。- Q1 ] b o" }: X1 s& ^: s
2 t0 O v0 \& X( V9 A) `1 e2.条形码的制作过程
" P! ~2 u6 `0 [$ x$ K
' N& c0 a8 _: j' W; |黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。3 C! }* H" k9 u/ v" Z
8 d1 P: k8 }( `5 ^' H0 c( A定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
0 B- I7 w: w: a* M
0 _3 W; q4 Y& d; S条形码效果如图所示(程序代码见附件所示)。9 l) V& J* }9 v# D" h1 J: A
v8 D) h8 w3 x$ e( h5 `
图一 所得条形码效果图0 s3 ?4 v' x$ d+ t
( p; M6 F7 i; ?( V& W) M6 u6 `3.打印与测试5 |& }6 f" C" p2 N# Q7 E
+ W7 _" `4 w. _8 K5 D1 [ y. `% Y有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
( d- h+ l. A2 L6 y2 o* X, F; t4 v7 x/ K9 M
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
1 R$ v6 J1 v9 L4 t8 y; I. D. {6 v5 B4 D7 Z& \( T! x/ H
为了方便进行测试,本文打印出不同大小的条形码。
/ W$ x) l1 b' h7 D0 X2 I! D) _4 s/ e1 g! U3 F
测试一:将其用透明胶带粘在硬纸板上。. ~4 Z0 q7 x% u" R; @
5 m/ t8 W% \5 |3 U: M
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
$ s7 M1 I/ E V$ W; x5 L/ ?; Z E4 Q! {- G4 L
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
& ?4 U3 m1 \: ~, L+ O1 C4 \
5 p- M- ?5 W: P# @测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
. ?; s2 e5 `* A$ ?1 g
& m% K8 K' o& O) e效果如图二所示。% G$ Q* _! g, f& b
! r. ]! T# S& ^' _0 s o0 t
图二 打印效果图4 d. R8 E- d0 `( Y
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
6 D) M& o" o5 [- @/ O `) r" N& i% Z+ a( v$ y
4.扩展应用
2 Z+ ~. x4 g* G5 \5 C' G) X
2 g" w- ~2 o/ r5 }为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。/ M! z3 n: J9 L# b2 u1 W. U
# m# ~5 @* Z5 g7 @3 F图三 可供彩色打印的图书证
& V& ?& G) f- E$ N9 K) V. j$ R0 H2 u$ z! C# _$ e- r6 u( ~ N0 W- U
过后,我们会给出相应的网页版、C++版、VB版等等。
G! B3 |( C6 p
) z2 A' \7 R2 F+ Q, S, |0 n+ w, }. L5.关于本例的一些思考, @7 K% E( V# b; L7 s+ D7 |
& I' W3 J2 d( a7 ^
由相关文献,可知条码技术具有以下优点:* N# o" X5 W9 U6 ^, R9 ?, D
4 K+ A F0 z5 g5 R/ V
1)、输入速度快; . ^! \1 O* t& }2 W
& A: c; e- L0 B3 `2 Z# @
2)、可靠性高;6 u; R6 X1 G& ?) q, X5 K! R
3 s D3 ]7 S- u$ B 3)、采集信息量大;
+ V1 R# ]; i1 r2 a' B! g1 n, h/ [
4)、灵活实用;
. e y8 R7 m$ C) x- d6 A* A3 A. t0 p+ R/ R) k- h) k2 x& _
5)、条码标签易于制作
1 r1 _% ?# L; f' R* q$ c4 \
; n, ?* V w8 d+ Q* W+ P% g$ R" G6)、识别设备操作容易,不需要特殊培训;, A* I7 {" o1 }+ R* }
0 H$ v# i$ j) n1 r, Y8 r7)、设备也相对便宜。
A6 W9 N, N) D, X- N; u$ v \. j
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
# x. G+ H3 x# \/ `7 S+ G" J0 z! W3 ?
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
7 v7 |7 t1 L* {( L4 d& P
0 G" ?* H' I T- X. U4 }( ?1 r/ v7 j
图四:常见的二维码% K+ l. }# c$ y+ ^+ z9 \" D
$ Y6 n( W8 ]% _1 }8 C* M( {5 k6 o
6.免责声明与注意事项
, y" c2 }+ Y2 _* i: Z8 D8 {" B
$ q: g8 Q& g6 B O2 e版权所有,翻版必究。" F! _+ \1 ?2 z4 N7 \9 ]
# a0 [0 W W! p& y% P! f0 J8 g技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。) E7 ?' }/ G) S7 _" k1 v6 d( b
: T4 X$ ?0 g+ M! `
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 / Q$ i2 W* s) o6 A0 r
" x) ?' {8 l9 X7 `* h/ r7.
E) L4 i7 F$ k7 } o" r" D; F3 l参考文献6 I# _. Z2 D" d# M. s
4 W: n4 ~* n7 w0 J9 |" c" b
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
" T8 j5 H! b1 B1 l8 S' o' m+ w
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]6 a$ {$ @- j6 N+ {. c6 ~* |
4 x F6 ~: F5 e% {8.5 s! i F& i, s: }
附录; C0 G$ f6 X5 d) |0 S
7 M% `6 Q/ O$ q7 L& P4 n
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
+ P* v7 q7 m0 ]$ T; a, n% @
. K$ p' k$ g& }- ]. a& b& V%barcode.m
0 t8 p3 f" D4 Y- B7 W; ]
* b9 f6 H7 u) a%生成学号a对应的条形码
! V8 {: {; w6 N& Y% e* ?# E* R3 _) }7 p: R. z
%2011/09/25 13:24 BY小谷同学# I1 k$ O0 b G8 ^# |6 }8 s: d; o
* ~) t3 r. X% Y" s" l$ j
a='1234567890123';%学号,自行更改
: E8 ?7 `) _. u! O2 K) y3 D0 J9 v4 @
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;
7 Q; O: F x& c6 [$ G; z& p8 [
* y. }- ~" x, w+ `* i: z: f0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
3 V! H X- A3 `* r; c, ^0 ~$ h8 }% Z' e1 M2 |' V1 k' P; q& K
White_num=[0,1,0,0,1];%插入符的编码- V2 X8 K) `5 K9 ~3 G1 l
9 u3 v3 |! v+ Y* k S, Y
%Black_SE='00110'; h, Q6 g4 T( _. r6 ]* l
; ?! s4 W- o0 |* p( j: o8 g9 |3 R
%White_SE='10001';White_M='01001';* S S. t( N5 [# S
/ `$ _" Q. q- F. m! e; f6 }% j" N
barheight=30;%定义条形码的高度3 ?4 a+ ?$ P r J
, P: k- T! ~9 a1 cbarwidth=1;%定义条形码的像素宽度. ?* M5 N/ Q- r3 u" c; S
" d* ~3 E6 Y: K: \# T3 Y" b0 l! u2 y! R" Q
%可以对特定长度的输入进行控制,本文规定长度为13: g4 w* i* E0 N$ N5 `# U. U5 ^% A
7 c/ V- s( {6 w. y5 j0 W8 L7 O
if length(a)~=13
: J( e7 a4 J5 [/ ^7 u. h6 p, g6 \9 }* ]
5 U6 Y; w i) O# O. ferror('图书证必须有13个数字');! C; E* f! W6 S* R! f! S
& P1 ^9 `5 }& a8 s
end7 w0 B# w/ M- _* c
6 _" h1 _' N! B( `% g: [4 R% c" H
" A/ z% U) ]" ]8 [( p' Obarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];- {# {0 |. ?* p/ O# x. d4 ]5 l
2 k3 l. }, ^& O. Q2 }2 w( K! V$ F
%为方便,直接人工得出起始与终止部分的条形码
: x3 n8 [; o K0 V. F0 |; o
8 m+ @; u# X$ R! [; [ V/ `1 k5 ^%也可以由程序生成.% \5 B: L2 I" b/ S
5 W$ N" i# q& F: j. ptotal=length(a)*(7+7);
$ h$ a: S- ]% w0 q s% U5 d
a% _2 X- S# `; V, A%条形码的总像素宽# C$ _9 q, h' `; k- _0 j
9 a* T& |- I, N% T%也可以不用求,因MATLAB提供的均是动态数组' h9 A2 Z; a' M/ K' ^! L
% s# t& T9 S2 g2 M' k+ R
s=1;%计数,记录
8 c0 q! I" m- l2 T4 H6 |' W, w" r$ k# X, q, _' W |, {
' @2 k. x. g$ _3 C1 P$ I& n6 {%由于利用for语句容易出现不可预料的错误4 Z+ C% d4 B% \
; l$ M9 A5 m; A3 \ A& |%大部分是数组的行标与列标的调用问题,于是采用while循环
$ S/ @, V/ }) t. G& [ i
) h" c- }/ r: }# y3 T%嵌套循环,得出数据部分% _8 {* ~6 h% K. [& s8 A3 D9 H
2 t3 n' S6 |0 z$ Q5 L( h5 rm=1;$ b! k2 x2 \9 a9 k
' x$ q6 ~, Q5 J$ qwhile m<14
7 B; L; ]$ E& z' U( y3 z; L6 y ?
# O* B# w: W, K) Q" E
4 [; i* C: t4 z! K; W3 mif a(m)=='0';# J; x' p& l+ U, E. M
: h1 U0 D$ i+ G8 m& j" A! s8 Z6 P1 \- n# q% [
t=10;
0 b8 t; J' a* G$ h2 k# H# S7 o" `( L# P# y, W
& R: N- g0 d4 n6 t5 D7 `%若为数字零,应该调用的下标是109 M. `4 n1 ^% c& G
. R J/ P0 o# A( L, _& c* a
: d# e! i# _5 k9 @" yelse
' q0 p I# Q: j. P& f6 P
z1 C3 z1 q/ W* Y# Q- i4 P6 {7 _: s! s2 W2 g" ]6 F
t=double(a(m)-48);
; J, n( O3 n( Z. ]$ j+ D! v8 K( S: h. s4 H8 q) U
%由于输入是ascii字符,转换为整数需要减去30H,即48
5 b+ K+ n2 D2 B3 R$ L, J* p! W# G; L, N S4 O
l) O+ f; b' m0 N' I" U
end2 t9 t% m8 ^; ]! |8 k
+ \2 G! B1 }, y' m: @/ I6 h
) \8 _( {1 o. {: k+ P" N
n=1;%同样的while循环
: Q7 D# P: j$ P1 s8 N( q0 g- w! `- n1 T5 ^0 C: v$ J, T
5 r1 ^5 y1 E+ A% [+ H- j" ewhile n<6
* c/ X, ^2 A4 |7 P( S; i0 F) x v+ [1 x; S. n
, F+ r" p* y5 K) ^# X
if Black_num(t,n)==0! D: P: t9 \: C+ `) x
0 z/ o* j+ p8 `7 }9 `. L' x+ O! ]# z: _5 V
barcode_M(s)=0;6 H0 }8 m& w& n! L; E
% S" x5 v( a5 u3 I6 k5 o
6 K' }% K3 o: u' i7 ^4 g! ds=s+1;- n+ ~0 D7 z7 d+ r; g, E. W
5 @+ z9 ]4 U3 o. f2 u# c
& [! @+ [' ^4 @ ~& relse
1 S1 S3 d4 b0 e: M- c4 \9 W p0 G2 ^) S
1 B' X |, U9 x+ Nbarcode_M([s,s+1])=[0,0];
0 q; I6 J8 s4 G3 M# U f
( e( J: B6 P1 c- a8 V
: J5 I3 `5 k' `7 K) Rs=s+2;; ^+ m7 O+ |5 j0 L9 G
9 o2 s$ L7 x$ ~; X% K% x
v8 a; \- I% \) k) \5 Lend! l- z6 \1 ?+ P% r
. o) V6 P: Z% ~. Z5 T
+ u" x" X- S( \5 j8 O3 y9 Rif White_num(n)==0
& Q. w5 e! t' K
& \# p! w4 n3 r0 w+ ?9 l, [3 n5 n
barcode_M(s)=1;
* w0 a$ k. k$ Z6 x# g* ]% f; r2 w$ D) d$ {/ U
$ W( x8 c0 v( Q7 o- b) ~s=s+1;' V# f# c+ \0 S& L8 z; q3 u. M
, v- r8 {, w) ]$ e
4 C9 Z; {1 q0 relse
5 d A* D; H9 }* ^4 ?0 j/ }+ q( Z' l6 `) s4 j2 Z* [) k* Y
: i/ d5 K, V6 @2 H6 G
barcode_M([s,s+1])=[1,1];
* j- v! r. W+ I6 m2 y% q4 j7 y* P) H& Q4 @. C
" `/ E. [! k( u5 J& A
s=s+2;
" v# `+ B8 o4 w0 Q4 t; G E# t! P) \0 p9 @8 r4 @
' d' F3 z" ?+ ^7 h0 G6 |+ i# Y: z7 C7 y5 ~end* P& |: i3 f# X7 a. l
) e4 _' S9 F# J5 |! t: V. \
7 E" g2 c! o, S- ?8 ^% W7 \- o/ x/ P
n=n+1;5 w5 n; |$ n8 n" s
7 u/ v$ p$ |1 r! q4 x+ e( ~
$ m1 m# {- k! l# ~# \. q! Vend! t: c( m& W; ?- p5 I! R( [& W3 G
2 [. Z; D3 P# }7 Um=m+1;
' @+ t3 F( r! i- _- `2 ~
1 i2 _' c" B' k' n! [end: J, w) i7 M' I/ j1 Z$ J& G+ v4 Z! |
( a; R8 j5 W- ?* I$ c/ f8 N+ u
, g/ [ c+ ]7 ]. v: N8 L+ e
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];2 p, {, x: s# G% `
+ k) S, }, e% T4 r2 F! o$ t%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵; C" i+ z+ B+ p: c, }3 y- e( u5 [
, Z* @( i2 C* ]5 u4 }- p' y2 g
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
7 ~. T* b- g5 I7 l7 I
+ i9 E4 B) }3 t* simshow(bcode)%显示所得到得条形码8 P6 |& i4 s2 w( p) T; s; L
3 A1 S2 ~: M- x& C4 u
%然后可以自行存贮得到的条形码
0 k, ?% |1 A. l$ g+ V, V3 v) E% ]/ Z8 Z) L- [) G
%然后用PS等工具得出具有自己特色图书证啦
2 M$ C0 Y- ?) H3 V* e/ y
/ ^) C7 O7 [4 z
6 K! _( _5 W; o2 p) r; ~ |
zan
|