在线时间 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系列之——某校图书证条形码制作9 B$ } W+ {$ \& D! W2 S
1 V5 `1 L0 i. e# p/ }) k 小谷同学 2011/9/25
1 T; t: E/ ~; f' D/ C% r3 \ 9 w+ h3 n/ f9 e$ F: C e
摘要
: K3 s2 U$ b- z1 o( h
4 V4 F+ \$ g, | 关键词: 条形码9 j, X7 l0 ~, ^0 D6 f j
$ r. p( S3 b# r8 a
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。% Y4 q& m- \: h: ]: |/ Y5 m
$ X3 ?2 p$ S2 g/ [5 O/ R$ ^3 Y 目录+ u, r* C4 `2 `( s( D* x
7 Y) r2 K+ t+ K0 f
1.某校图书证编码规则0 M0 h7 _" p7 s9 A8 c6 X
1 S/ L! h: |, l8 E+ n 2.条形码制作的过程7 F6 ^' w0 m4 b ]% K, z
0 e% q) K6 j# V
3.打印与测试$ Z; }. i. L# \9 w
) \& |: L+ y$ v7 }7 b! r- T
4.扩展应用; k/ |. w7 C( }0 R; @6 ~
3 [4 q" z1 w* ~6 i
5.关于本例的一些思考
u: W1 A9 \; x2 Y" f5 k* B / W/ P Y6 @- r$ V/ d6 ^* g5 ~) M
6.免责声明与使用注意事项
% w* k7 p3 Z( T% l; i3 _ 1 R" l+ Y* ?; O# d% ?1 m' ~
7.参考文献
Z- E4 ` i! p( I2 _; C8 z; l
9 e; ~5 A4 K# w+ f 8.附录
- @9 l+ F O" M
2 J" }9 T+ k) w" }! ^" O) | E + M; e* w5 x; `3 @( I* A8 g9 ?
2 {3 H9 j. @& f; o \% X
) E3 ?( d( H4 H9 h# p$ j 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。0 w2 C' x# T' { [3 P" v' r
* l) k, E1 i( p, j, ~5 N
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。6 X" t/ |6 w8 W4 j4 P f
9 F6 |' T0 T. K+ _
1.某校图书证编码规则% P; q) J# @% m6 l" s4 j$ p& v
2 E, E: [" \! D3 v5 w
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
* V' D1 s8 ~5 y/ W& A, I7 d! l+ I ; C8 R6 M0 m+ X& {3 Y
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。! c' l2 K% I; F) m1 r
+ B1 p$ T x8 e2 v4 e8 p
②图书证的白色条码都是一样的,分为以下三部分:; c% ~7 R& J# A6 _. n* @+ B% h
/ r0 F' g M. ?- [% q) w 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。: e- U, L9 V2 f* @* f9 i+ P
7 u1 o1 z& w* i4 y6 z" w6 E ③图书证的黑色条码是携带学号信息的关键,分为以下三部分:0 ]4 j7 Z# l0 A' |8 R
' w4 U- N: [: ^ k" t. H 1)起始部分:00110;
# O% U {1 k) M% ~4 J$ m h 7 V+ `% z$ R' A* ~( l1 }% }! l0 S
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; 2 J; c* H( B c$ B$ e, j0 I0 `$ k
- g3 K# P9 E j; l! V( k
表一 某校图书证号每个数字对应的代码+ y3 T5 Q7 @. F! |& E; _
# w1 T+ Q j# h- X- I+ X a 数字 代码 代码数字来源 数字 代码 代码数字来源 ' V" D5 C d+ F0 [! e, f T& H! I
1 10001 1:0001 6 01100 6:0110 + ^2 f ~' n( T5 ~! y
2 01001 2:0010 7 00011 8:1000
+ g5 t# r6 v0 W/ D 3 11000 3:0011 8 10010 9:1001
! A$ S, O: \- q; F" t 4 00101 4:0100 9 01010 10:1010
. N5 Z) c6 j; A5 g+ Z 5 10100 5:0101 0 00110 12:1100
- ^& }- @! g. q# D; h - o9 m4 k# ?4 g$ X2 c
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。* `" C( Z, T0 C9 S7 o$ n
$ |; N2 I/ [. |9 g# Z ] J
3)终止部分:00110,与起始部分以及数字0的代码都一致。0 B3 P* E8 B! s. O7 o2 ?& e
, T. o; |9 I4 e- {7 Y- w8 I 2.条形码的制作过程& `) W& a9 W; _. N7 K
$ L9 `9 b4 f' E% J 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
Q6 \7 D$ m0 C$ G k7 t q& T! O6 t# T
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。* J8 s# A# u* A H7 j3 J
' N* W1 b/ q- t7 ~
条形码效果如图所示(程序代码见附件所示)。8 a. p- W! g$ R9 A) K! |
5 n6 Z3 m; `# C% ~$ `2 L
图一 所得条形码效果图5 R* U- H9 V, x; m8 o$ }+ |1 [
: a9 T: Z& O$ C. a, s
3.打印与测试
8 b+ x' Q' X& J/ N: d ) c/ @; q6 R: C
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
; z& C8 J0 u N2 r/ R& o
4 k+ s6 J! b! r5 e; B# }2 ^ 因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
2 E2 K+ U$ l6 U; s; a- P; { 2 `5 M& W$ r* _* r: ]9 n
为了方便进行测试,本文打印出不同大小的条形码。+ y7 @8 l5 l7 r4 p# A! J
( O) k: j6 Z3 V 测试一:将其用透明胶带粘在硬纸板上。
: L& f0 z! [0 ?2 k I0 t
$ p6 l* l: d$ U 结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
4 H. [6 a& w r# @2 Q6 W
# t$ w9 A' I! H' @& c( J 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。. r, ~- |" u! g2 p! W
0 P( L/ i" {& P
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
0 g/ j+ ^; m5 d; B4 x 0 K7 \% Q8 o, x
效果如图二所示。
) c D# I( k* u& W# k
4 v4 B* g6 s5 p/ Y# n0 |& ? 图二 打印效果图2 s1 ~2 C3 f9 m1 E6 W
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。. T6 Z/ u, ]+ a1 l/ S' B7 H2 B
) J: p' b, S* b
4.扩展应用; X W6 B* I2 O) N" b7 g
! N1 O- ~: h( K: k 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。 a& q- O, }0 ]( ]" u$ J9 K9 I9 e
! w A7 w9 ]8 n! o7 M% R j 图三 可供彩色打印的图书证: x* C4 q! |* ^' C* }, a+ H
: M; n& h& a9 a( }7 ]9 h; J! m" H 过后,我们会给出相应的网页版、C++版、VB版等等。) I) X2 B0 M% n5 x, h
8 a+ p+ D6 O, L) k: e( I' `2 n4 |- K2 ?
5.关于本例的一些思考9 a% d& d0 Z: c6 i, w
! Z& e: r; D8 K6 P2 o m4 J8 x0 ^* q 由相关文献,可知条码技术具有以下优点:
4 t+ f' b0 B* F; z. V( m ) U( k0 F) k i. ?
1)、输入速度快;
8 d8 y$ Q' `% @/ F" b3 G+ F- X
! y" `0 B4 E( C& i5 M 2)、可靠性高;) C5 F r M' S7 ~: D8 o
3 R7 N4 d: J; b; q! q 3)、采集信息量大;
# T8 V# B% ^' u" l2 P
" X; m. g& B& Y 4)、灵活实用;' ~$ E7 ]3 z; v- X
4 M& h4 x; B8 N4 J& C7 q2 ~ 5)、条码标签易于制作
. ?$ k, ^4 J8 }
5 n& o( C7 L3 v' f0 F3 ~ 6)、识别设备操作容易,不需要特殊培训; c2 s: X$ S3 e; K y; ]
9 C1 L) B; L2 |; |; l 7)、设备也相对便宜。0 ^1 Y( K8 V5 V* ?" e" u! e
+ W6 @* K/ Y* p( Y n! ], b
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
. b- e: y! W, c 1 i8 ?) q0 f. r, K; L S7 C
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。2 L* ]/ f X" ]/ y% v5 {
9 F2 t( P0 L: x2 c2 V9 U3 d 图四:常见的二维码0 J& P: t3 _/ M/ G4 Y% O# b F
% J5 [0 M9 R+ E0 } 6.免责声明与注意事项
: A5 }0 Z6 m4 a$ @
; J. L. Q& q$ \$ |: e( e' B, } 版权所有,翻版必究。( R' M/ S5 O0 T4 q
9 H% Z9 J c& P6 y$ n 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。" y+ \" k0 }6 f9 a! K1 q1 b. Q# L
: y2 m; P1 p% B& I. h0 l& Z6 g
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 5 ? ?8 g1 c! b% q) G( {' u
+ f# Q$ M: e( U9 d& V
7.
" h# j/ G* r) } 参考文献/ f5 z/ N% f) x' V: y" _
1 I- d3 G b0 ^9 q$ |/ ` [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]
6 i) [9 R9 j- t D( |4 d+ H! q/ ]% V/ Q
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]
$ ]' L' C, u) o; w, U2 ` 6 V4 `2 E' v1 {% x; ~
8.
, b* A5 q0 h* B; | 附录- l5 E5 `; x1 F8 v1 _+ F, \( }
$ r3 @8 { h( s 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):. ^3 F- h: Q+ t
" t7 ]' J }% y %barcode.m/ l' C0 C/ t g3 D, Z
0 i0 a; e7 K7 W; l0 w
%生成学号a对应的条形码: R+ |+ K3 i* _. \3 @2 [
4 @8 n) L$ x3 W4 L* {$ f
%2011/09/25 13:24 BY小谷同学
; t6 f0 |7 C! E6 U ( g: J8 F; |1 [5 e
a='1234567890123';%学号,自行更改2 o; r0 @) ?! C& o) H8 P( R0 e5 c
8 m: W% Y0 p3 a
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;- I% I/ l7 D# K# J7 v
5 T% S: {8 b+ g4 s# D 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];%数字编码3 A# q# M( k8 u; F
) @9 y+ @8 C& L% t
White_num=[0,1,0,0,1];%插入符的编码1 F% Y7 [5 Q) F
$ f, J; M2 U& e ^ %Black_SE='00110';
% M0 ]) D8 h/ Y7 l $ F* I, P# Z, p! j2 Q* }
%White_SE='10001';White_M='01001';2 W( N' r5 o3 }' z8 U
- T$ B; j4 y7 @! {! R
barheight=30;%定义条形码的高度
* P2 O! G: M4 y) C6 A+ d3 p
! Q* I) h A/ N9 h( ^/ @2 Q# E1 q barwidth=1;%定义条形码的像素宽度
0 F m. {% V0 h2 t1 C4 V w - r% n o. O: a* `
+ x1 j$ E3 E2 I: H
%可以对特定长度的输入进行控制,本文规定长度为137 \* g X* [" p. A2 \! j2 Y
( I- U: C: f1 M C if length(a)~=13
' k; ~6 S5 _4 P$ e , p8 J" b! b" |) n, @
$ ?- l+ M) `0 V1 v' k: p
error('图书证必须有13个数字');% F" U* u0 x* K4 p3 B
5 S' `2 A O# I0 c$ v& q
end1 t6 ~( f. R+ o3 B
9 V- O1 R3 R G5 M! h8 U4 B0 b
/ Y1 n; j& z& A5 D
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];6 o7 z* N+ x4 [ G7 K% x
# q; C+ {: D3 g2 t4 C0 r9 X %为方便,直接人工得出起始与终止部分的条形码9 p0 |: H- x, \+ K) p8 Y% @! t4 o" z
4 M/ R5 I) I- \. G* i* l$ j( m4 c' l
%也可以由程序生成.
$ u# g) {% f" B( @6 ^ 4 A: E& A. h$ D/ k1 K( H
total=length(a)*(7+7);
- N3 b D5 o; c, A$ v" M : d8 r1 l0 l; T" } C& J8 m
%条形码的总像素宽
+ t" z: M( o3 V/ U! I, u' \
1 |- g. d% |$ x9 r# h- w %也可以不用求,因MATLAB提供的均是动态数组
6 L" |& i) E* a1 z - i" w' j v& g' r) A5 x
s=1;%计数,记录! t5 R& ?4 Y/ q& N
- C0 o" N2 \( |2 B7 c- }5 O
5 C( c7 V0 n+ C %由于利用for语句容易出现不可预料的错误
+ r1 K/ k4 U# w8 E: D3 G
# I! Z6 Y9 Y1 n %大部分是数组的行标与列标的调用问题,于是采用while循环; ^. `- O5 z$ C/ B8 s J$ u
6 J0 y7 Z( G# F6 O/ }, V9 O2 \5 q %嵌套循环,得出数据部分
0 _& S& y; R' } * ], v! S. Z6 `2 U" t9 O# q
m=1;2 E) _. h8 L- M' K; j5 X
6 Q; a% S/ r: o* v" X while m<14 ' p/ J6 L; m; ?
1 E7 `4 C0 o: _$ R0 w+ J5 J) z ! \0 `9 |! u( |: t% h/ f
if a(m)=='0'; s# g. X4 _- Q9 x: j
- C* j* F: ?3 c: {( E9 O- @7 @
1 a, ?+ s \0 f+ D8 T5 E t=10;+ ?# x" o+ C* x) e8 j6 _: K( u: d6 E
" i/ A' ?: Z0 ~# r4 z
3 V; d/ l" z1 @
%若为数字零,应该调用的下标是104 l) i4 h5 S; l7 H- r( K* s3 j: p* J) ]
: t/ |4 B8 Q1 ?- t/ }. v; k; w2 X
4 J' i; f0 t) w' e& Q6 [
else
( X3 u! V, d2 L9 z * }, S4 t: T* x' F* |) \" q% x
& ?3 I2 Q* t& ?- |
t=double(a(m)-48);
4 h7 e1 y/ n+ z2 c. S3 z8 W 5 u; l, C2 M' X
%由于输入是ascii字符,转换为整数需要减去30H,即481 P4 ?4 A$ [4 G7 w' i+ t
: c n* c$ I+ d% j" ` & E5 G& `8 x0 J4 J, }' p2 O
end" p I. Y- ~% k: q$ J
+ u! y9 U5 q' g# v; i! k, {& s
0 s6 y) s2 k( U% y4 X" k2 G n=1;%同样的while循环/ q4 N! g- G& I* g
4 x$ e, \ f: M. v6 g D
% q. ~; C* H- U* X while n<60 M; E# l: { @3 x2 V
0 R+ s1 ~& T1 _; |( n/ h
6 r" ^, I! l3 I! e# b( C1 z if Black_num(t,n)==07 t, q3 W5 K/ \$ _6 n
& j0 E( [5 R. O: M. _! J% g
& T0 T" M x! z- N% e" S barcode_M(s)=0;
3 N! F5 v) r/ c- u" @4 _$ J# N+ X
/ I1 n7 F& Z0 D7 w i5 m, r( I# |2 V& Z$ D5 b+ h
s=s+1;
5 \2 f" c% h t; ?4 l& s 5 g! O/ o7 s7 X' Y* i
# c6 i& }" W u: `! x6 y/ r else
) ~1 u c3 x8 Q4 E' y' U. Y
5 M! K2 v: ?' U% b8 Q4 w / b& g: I. ^! k+ r8 F' S/ E+ g t
barcode_M([s,s+1])=[0,0];
4 ^3 ?& _( {; z' G1 @( ^/ i: R. u: S ) j& O9 h0 }8 Y- R; n1 V
/ r ~, K# p$ p( L8 n
s=s+2;
# O9 H. V% u: | N4 f- F2 R & Q& t$ I, c" y" c1 h* T+ i
# @& P+ J% t+ I* o0 [- Q% x& ~ end% g: w8 [- V6 R" z [) @) r. C
% h1 F8 i7 F3 ^$ B " b+ Z2 ^9 P- z X& q, j' h
if White_num(n)==07 P3 H2 [& B" H" X) S- p
- u" j! ?3 J% p$ s4 l ( b# q: k- ~* J/ i
barcode_M(s)=1;
5 c4 X( K6 ~, C. N% S: Q
8 V+ q9 \( o9 e , P3 \: ~) l* H1 E
s=s+1;
}' J% ~: Z1 d
% K- f0 I* H+ ^
$ U( w4 `- ]2 x. l+ }: U4 d/ h. y else& d4 y' h9 r2 M1 \5 z: G9 y
9 E0 o- a& h+ e) d8 ?$ t7 b0 j ) ?. v0 Q! a7 P. K
barcode_M([s,s+1])=[1,1];2 b& c, H0 C1 `' Y$ h
5 t. h% y ]/ l# q) ]2 b
, o; F8 f+ F: x9 q% B* t3 g s=s+2;
: Q; u' E# p g- _7 a
5 l0 r: P" K r) J0 a ?$ T" s5 A" P a. |
end% m c0 N" T1 L( |8 F' d% U
) `* L5 P2 W9 _6 d, `+ z
8 W. j7 L; Y( m) F* l
n=n+1;& l8 L3 q' S( i, d7 J% q
% G+ D0 Z" {) U, j/ t i
" P: A8 X* s4 H) Q/ l
end
3 D' J$ h& r! l( O' n 6 ~' n3 b( o) O ~0 ]3 T1 Z+ W) o
m=m+1;
! a; n. }3 O ~) q; O & J8 i+ u; T. _+ T- J# i9 R+ k
end8 C; B' j6 C' _$ h5 O
1 m5 @/ ?3 p, n$ z5 Y7 n
" r1 p& ]/ ~2 J6 X' C bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
- l7 ^) n" w( Y, ~2 ] ; T6 b" o' C! R
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
9 T4 I1 d! h4 S+ t/ Q
1 r0 z: m- T+ l+ r bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)+ A& g, B" C7 [' E; l
& |' o" x1 x! I) t( c& E
imshow(bcode)%显示所得到得条形码0 l7 n3 c O! A- w
& ~$ P0 D( L0 `- v %然后可以自行存贮得到的条形码
! N, v- b7 O& I+ Y 8 K. X# C+ t) ?
%然后用PS等工具得出具有自己特色图书证啦* w0 ^: q/ k- b. Q
* b9 p$ K! m: a( P
$ n# \3 R3 J/ B3 v, D# I# G
zan