在线时间 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系列之——某校图书证条形码制作5 ]4 u/ x8 u1 N) B% _" Z
0 @: j$ \9 t: t ~! y! X 小谷同学 2011/9/25! h: n( U% O, `: x9 h" f% u. ?9 F
H9 p% u) I3 ~3 O* P 摘要
/ |" F; M; K3 G* k $ |5 e, I0 e8 S5 y
关键词: 条形码" A+ Y- \& c B6 o/ s6 K0 i
3 M0 a J. M4 D6 U5 q1 E8 M
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
. @0 ]9 w5 s- I# y% r $ l1 d$ j) T: D+ F" k
目录: `- p" S( d+ d
6 s. ]! W W7 r4 _" I& k# r
1.某校图书证编码规则: }7 N* q% C }$ K) }
( E( A# p+ n7 c/ y, e- K
2.条形码制作的过程
! D2 L- D, Q4 U ; X0 f0 t' B8 H- A( u- I4 ^7 x& _
3.打印与测试
( J" f0 c3 M8 r9 g. N* S 2 j" F4 e9 s4 k# G* C# A6 d1 ^8 w
4.扩展应用$ G! ?0 w4 H* c& G7 W
4 p1 l4 b1 Z, y6 T
5.关于本例的一些思考
# D" Z$ g) E7 [* j* K$ K" _ # m. J$ ]" K1 n" u% u
6.免责声明与使用注意事项" B8 p. g0 _/ h- S: N3 {
9 n2 G% m, y1 c3 |/ H
7.参考文献3 p' Y6 {1 h1 @
8 P6 ]4 g) I& F7 [7 }% D/ L 8.附录' i/ X. |" f; N& O, m
- n% R' d: S) [/ u, y
7 {+ K5 ~$ C; Z ' W9 H0 d. P. X5 F& d5 x
& I# N% r: V* J# W: y1 J
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
. X$ G1 C6 ^9 _ 5 d3 q3 H; U) u$ W
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
9 t9 }0 ^8 P/ F5 M! v/ [
& T/ l- |& F+ A- f) h/ I j 1.某校图书证编码规则) ^5 }! B1 G" W1 U- E! e! `; C" I
1 p- l0 K8 V' T: ?! k! Z 由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
6 I& r: H) g& G& C
9 s1 C8 z( ? o ①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。: J3 }) Z1 Y) R( k* {: _
/ f+ S+ H/ v0 W: S. s ②图书证的白色条码都是一样的,分为以下三部分:
1 R) `& H% A X7 R+ b2 G* ^
7 _7 @: e2 O1 Z9 { 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
$ C* L3 K, k. P# l% B/ Y 7 W# S0 W& t2 h" h! y
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
: W; x4 _1 A2 c' ?; {- ^ - @& }: M, l) ?9 a) y
1)起始部分:00110;
2 x; A. u- m8 }; c* I" m( T t2 R! D8 z# v. k: a# |
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
4 P$ z% h8 ~7 c : j( ^5 n9 H o7 Z
表一 某校图书证号每个数字对应的代码
7 c/ R8 z( x) y# u$ `* v
+ m0 j: N. @2 A 数字 代码 代码数字来源 数字 代码 代码数字来源 ) W7 G- X& E# H
1 10001 1:0001 6 01100 6:0110 7 `6 V# j2 c# ~" b) z# _
2 01001 2:0010 7 00011 8:1000
6 Z7 P ^' z1 w 3 11000 3:0011 8 10010 9:1001 7 X% Y6 @9 i9 @ t" g2 t+ B
4 00101 4:0100 9 01010 10:1010 5 L' C9 t! K# ^/ t
5 10100 5:0101 0 00110 12:1100
0 a A* Y! v5 a/ l# {% u o- Y0 g1 C' A6 c
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。! {4 x& U. M5 g
3 F' L$ N5 D1 g- r7 x
3)终止部分:00110,与起始部分以及数字0的代码都一致。; T3 {2 T# h, F9 z5 K' E% [$ x! Y
- }$ C6 m3 @* K 2.条形码的制作过程
' M0 b) E4 ^0 _1 _. C a' j: ]
' e) t2 V! k( Q7 T7 T2 X; F; \9 ^ 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。- D' T4 h# l" }2 V+ I
( N0 W+ e, Z3 h" m+ e- k _ 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
+ ^( g' a- ~$ o3 i8 ?3 [ 1 @/ J2 R1 ]2 y: K! g [
条形码效果如图所示(程序代码见附件所示)。! m3 [) B& C2 U& g6 G b7 b9 {) G
' {( {. z/ O* d% [+ H% a$ n' C. l 图一 所得条形码效果图! a# D/ R- J3 O- j' A; q
k5 v! R. w0 |; B- q3 l/ c2 P
3.打印与测试' f6 s* k$ N; t- ~( F8 r" s! k& E' Y
' s& J0 }* V) L3 C 有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
6 l* N/ d. p' s! `0 b
$ g- w/ u) s# E) ~7 B 因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。4 }, A' j1 c, C4 q+ i0 Y2 b
# ?1 m0 H9 P5 m5 q6 g2 \) q 为了方便进行测试,本文打印出不同大小的条形码。8 p# s" y% H0 q+ T* H* x
- J: m8 J2 p0 ?8 y! l4 Q& R 测试一:将其用透明胶带粘在硬纸板上。 O; H, o7 ^4 R9 H9 M8 U: g
" E( b6 }0 K5 T
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:7 G/ L; K @/ e5 A6 l! f
w2 e" u) y7 k/ A4 Y$ a# m8 P$ P4 ~
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
8 @! q- }6 |8 F) H. [+ L
: x& L* Y: X9 Z 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
% Y, W, L" }. }' \) X5 D " @9 ^' d" h, F4 x0 b
效果如图二所示。
4 A$ X! m4 s" |5 M( y3 ]! A
/ a; ~2 x0 j3 N+ h* b; H 图二 打印效果图
0 f8 E( s) V1 O' P2 v 测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。- ]+ s o" F. L! m% v6 j: o f
5 x2 j- T2 O: m# t& q
4.扩展应用9 [* B/ n: s5 \
5 E- G6 B/ ]/ J! S 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
5 P/ H/ K. H5 _( W& R; F5 X
' p1 U' q) J; a5 n: M3 ]
图三 可供彩色打印的图书证 |& y# p$ P! ]" [
4 C) q* W8 ]( z: N/ ~ 过后,我们会给出相应的网页版、C++版、VB版等等。
$ F, ]2 U: |4 [" P7 g% I # `2 I+ v% }9 z: A
5.关于本例的一些思考" x4 N- Q$ |; S$ n% R! i
- ~1 m! c5 I( ?5 b) x4 } 由相关文献,可知条码技术具有以下优点:; |% f% t; b6 O2 q+ `9 [- E5 K
" s* E8 ]: n6 V, C/ v1 m: G 1)、输入速度快; ( V/ g6 A) s$ u7 W& j: j
! h7 o' _ V' u 2)、可靠性高;
( Q# p& S" o+ _" P! b' R ! P) r$ @$ v# H8 v, ?* G# Y
3)、采集信息量大;
. ^8 \2 L8 q" G9 g, M }) s
" u$ d, t3 _/ M" z! m 4)、灵活实用;
. H2 F+ E; j }5 Q" {: ?+ @, H
6 @" [$ I8 x3 ^8 b# v 5)、条码标签易于制作
]% u' n/ U: z" l* a 1 K0 }* P! ]. ]: W
6)、识别设备操作容易,不需要特殊培训;
8 _8 _0 F$ u" J( O F) r ; a* }. t; L4 ~
7)、设备也相对便宜。0 i% B/ _* Y% c E9 ?9 ^3 w+ O; E
$ p2 Z0 ^7 T, z 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。% F R, ` M _( o8 @
, Z* I' q n- b& \% {1 f ` 由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
+ E& _ O% e1 @5 L. u# D
% q. J- l0 t. q
图四:常见的二维码
* _6 s3 e: u% m# } 7 K5 R8 c1 t: g t* D
6.免责声明与注意事项. |9 W1 G C% c4 y. }
* E, f( E* M# P 版权所有,翻版必究。
' ^$ i. Y$ l K" o4 V + x5 B$ D/ M: ?' ?3 z' A
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
$ p1 ~ h4 E2 r5 U
! K7 [# v, ~. P6 O" k+ h0 @9 l2 ^ 任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
+ u U E. o, e' M% g ; a+ J2 S, r0 S, p
7.
, X; d% ` F3 b5 e 参考文献
2 ?- k/ {! |0 {# E+ ]. W5 X 3 X9 _. E+ }1 N! j1 s) f4 m: r
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]& ?7 p! C; A. f( r1 U
0 W% |, S5 E( W: F, |
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]
& q, ?* \3 |( N/ h5 {2 B ) c3 p) Y2 B3 o0 ?% I/ c
8.
' S' e1 _$ E( B# _- K 附录: n& E9 i5 g' ]: m0 ?, _& M
s3 n1 `" T* I3 n8 w3 z
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
+ i0 i: }4 ]8 B2 R
7 f$ |- a/ P( ~) b& g6 n) h9 Z/ h %barcode.m2 w1 N$ l# I; w# ~3 H
2 Q5 K$ U# ]8 a) y& q- H. i
%生成学号a对应的条形码
/ q x. s( ], r3 w/ A- O$ ~ 8 P Q/ t5 g* y. Z2 [" f7 K+ z- o
%2011/09/25 13:24 BY小谷同学
; P' V# w& @" d; v4 ]
& [4 b4 M; x9 L$ P9 g a='1234567890123';%学号,自行更改
( G0 B( c- x* u& Y% ^6 b) I3 [ ; c& m1 d9 ]: j- p" I* v6 x
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;
/ g: O: _/ ~/ ^( ]( C/ K$ i
0 H0 I- p3 i. C! y2 I8 Q- d$ I0 d. w7 U% l q 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];%数字编码( \ R* b& n1 d3 N
8 A+ G" a: _! W' m# d
White_num=[0,1,0,0,1];%插入符的编码9 \) \ y% w* z0 H( C
. n/ u$ V" s. b' y# O2 T+ s
%Black_SE='00110';
2 _7 ]+ G; ^, {" F7 |& @ ( k, E# T! ?3 c9 j, _/ ?
%White_SE='10001';White_M='01001';) ?6 {" D( b& _0 y( o; Z
' \: ~6 U; V3 W- _ barheight=30;%定义条形码的高度9 u' R$ i4 m P) r" l+ G
! y0 u9 W' G8 p6 ] barwidth=1;%定义条形码的像素宽度, _% B \2 N7 k5 p/ }
# P1 D6 U: m' G; z' A
+ W5 j* k9 _. {( R' E6 R6 i! L2 O %可以对特定长度的输入进行控制,本文规定长度为13
! c; \: ~- S( q7 L8 D0 U
+ x& y/ O" I; J; \, h, |+ P) y if length(a)~=13 o; b) F2 f% X; U' s& s" G
1 m/ b. d7 Y* M0 K; }; b $ h0 I. i2 i1 V8 _2 x
error('图书证必须有13个数字');
w2 J. Q9 R! K s
0 d# y- r1 I9 v' o6 ~: `: n8 b) s end
7 [; p! z. h( I+ t. l
2 u$ D! Q+ l8 L* l/ O! x4 z
, ~; V1 u+ B' z# U2 H! P barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];5 p4 b5 p7 Z* j' O- L' b8 ]1 t3 B
& D! Y* T/ ]: N8 |& f %为方便,直接人工得出起始与终止部分的条形码
1 O/ D) W5 |9 U5 [2 |
# o* i9 p! t8 z %也可以由程序生成.
8 V! R) |# D' k" P7 | 9 z$ }4 s i, {* X j) U
total=length(a)*(7+7);. [+ v5 [9 F' J, u" ~$ V [0 O2 _1 [
) G- L) Q$ Q" T& v1 @% y4 d %条形码的总像素宽
8 P! |# u5 Q3 A7 K8 c* m
, X) X8 @6 \% x, J %也可以不用求,因MATLAB提供的均是动态数组7 d5 @5 P( N, p4 x# s: }) o' f
9 v5 ~, P4 V, e; I2 [" x
s=1;%计数,记录& N9 ~* p2 m0 v0 T6 C% K. V1 x$ x# A2 B
" C( ^7 g6 b& i* D' c% I
; l2 C& d y# z$ N6 a/ w+ L6 R9 @3 ?
%由于利用for语句容易出现不可预料的错误
_. K; O6 }7 I$ A; i
+ L- O5 U, i* R6 U %大部分是数组的行标与列标的调用问题,于是采用while循环1 C4 _* p, W n
0 B& J& q% M' K& s
%嵌套循环,得出数据部分8 Y1 N0 C$ A+ F" o6 ^7 g2 v6 V
$ P) H3 U9 O# Q/ Z* Q5 G; V
m=1;
- W8 I5 v3 l% {2 P1 W & T. O3 Y+ L I; G+ J) f
while m<14
! q# H2 ~* N/ t5 u( z ( m& y+ {. S4 O+ e% Q7 m
! ]$ A9 |1 a2 n- G7 Y; n3 ^
if a(m)=='0';8 r/ z: ~5 W9 J, J/ _' w% O
! g" w% n0 Z2 s. ^' x
, p) a y9 ?/ V w
t=10;0 Z6 L ]6 K" ~% s+ S% V9 S$ y
g2 X; P: n1 z6 `$ X8 g1 D) K 5 q7 e _7 T, {4 I! _9 l: ]
%若为数字零,应该调用的下标是10. f7 I$ U" r! T; W C
- e( b4 Z3 E6 n7 l9 V5 l8 I
C0 Q k* O* |% \; L6 j; ]
else5 ]2 J7 N8 O/ E
) o( a& h1 W7 r6 X; I" d' O9 T
2 R1 k+ D9 m5 T, A t=double(a(m)-48);
9 P! j2 ^2 s, x % [4 F4 K3 Z2 k; P
%由于输入是ascii字符,转换为整数需要减去30H,即48
6 ~0 c/ G% g; a5 J. d# y' N* S
9 _2 E1 \7 m5 @# { u6 s
' o3 `7 `5 x7 Z# d2 G: { end2 f2 K) N, S" \
( k. u5 E$ D9 D; m
: F' ^2 q9 O0 G1 L$ b8 q$ f
n=1;%同样的while循环
, m. q2 w* a& Q# d$ g3 Q / n) M' ^& a5 M! R( A
9 W1 k' b& }! @& a4 f% d% j% ~ while n<6
7 Y/ |* H }- S7 m _* ^) m; c
& n0 N' d# q4 F! C4 j , `& Z' u& Q' Q
if Black_num(t,n)==00 y7 h2 ^+ W8 K& c$ F7 ~
( `7 s3 V% @( K C2 Z* k
5 Y+ S* F. |5 _/ C2 s. ?4 B0 H; @
barcode_M(s)=0;$ j# U) f/ V3 p) u2 Z
$ Z4 p3 r+ L9 l3 y2 H2 t6 u% J
% z5 H" _9 s2 F7 M s=s+1;
; r' n! h1 t' b: w
6 f$ \7 Q/ }9 m: I2 z0 o 6 e% n7 R) ?/ ]) l
else* B5 U5 T* a$ o6 y8 Z
6 C( s- F9 {) u l8 |4 L; b- p) ?% k, F0 l
. v% I9 g9 y) f8 {# ?5 Y) I4 a barcode_M([s,s+1])=[0,0];, Z$ H% N4 Z$ Q- s5 _) g
+ r9 v* t; a: Q8 ~4 K+ z3 D! g
9 Z d! c7 b: y6 A8 N# r0 J
s=s+2;
# N7 M4 `2 \4 \' e3 K3 E! Y , `' F, ~4 k" p9 |
4 \( j8 v& X( Z. x( o5 n/ s$ _1 y end
) ]5 a2 {3 r! ^- d$ y 2 y* G3 [/ ?" z
6 A; a: p. |% X if White_num(n)==0
- i: J9 y- Z1 Q8 h$ R& U , k# K' g& O" ^2 y2 r- H' t5 }
2 y* {. x Q; n! i barcode_M(s)=1;
; F7 i0 k' {2 V% Q: M; H
; K* W2 y O2 t4 d 2 X1 Q. O; o4 ^) \+ F' g
s=s+1;
3 P& i7 V% B- C6 m8 ? 6 T3 F- Y' t7 \
9 T3 |0 r7 G/ ^9 M* {
else$ ? u( `( G% h1 z
* S5 E9 L5 D$ o+ h9 _
6 I9 A! S( @2 v7 f) d. S9 h7 |9 d barcode_M([s,s+1])=[1,1];" B( e( h1 ?8 h5 f
+ P$ e0 v J, ~: I
3 w4 v& i& p3 V s=s+2;
9 L% p5 F( N: o9 m . V6 M4 c. Y K8 \! Y$ `- B% P
" X' X! d5 z! s! d
end0 J& y8 @1 k1 i+ S( Y- U9 |
0 B. i% s, `3 ^+ o8 m8 n5 t. r
# l" k/ _" x5 z2 Q: r3 A
n=n+1;
/ P3 N* c3 q" y0 d! \ 6 b o+ b5 M9 P" {2 ]+ ]) ~. ~
/ B% J5 y# ^4 k& Q# ~0 F end
3 v- F, J* U% p) F5 t
0 M4 I+ H0 ~$ }: `9 x m=m+1;' B: t* t3 O2 I4 n5 i
6 F* y. b3 L( N3 X6 i end& I# M" R# p( u ^0 J
) a" s" b; e* [4 ~
$ x9 f8 F# o6 l2 H bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];+ }7 z0 w, A$ n) `# J7 O
6 x7 o6 ^8 [; f+ J: ` %将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
0 p% v O4 Z5 D+ w! N8 v# g' q7 n
% c7 V& n+ I, ^2 D1 B bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
/ U' l: r! i4 L0 G! t9 P; g
9 `: C( I3 i6 a a# m9 l imshow(bcode)%显示所得到得条形码; {: X- P E7 I. [& ^1 R
7 M8 {2 ?/ F2 P. e" {4 _) ~9 F %然后可以自行存贮得到的条形码) X8 N1 z1 _& |* E& Z
5 |' o0 b: j/ B! y# f' z %然后用PS等工具得出具有自己特色图书证啦
' q; L9 ]1 H- p' F6 L+ I8 Y, y
0 f8 }4 r3 J) P. y( h2 o ; s3 _: A3 `0 v) ^" p' G2 X
zan