在线时间 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系列之——某校图书证条形码制作
: x" x+ }( ^) U+ G% k
9 P& `; d" ]7 o! E 小谷同学 2011/9/255 Y1 P0 @ D+ x- y5 r: ?
' @# A* L! V) P y& V4 C0 K 摘要$ O$ L- j: v f& P0 y T
; m7 e j( ~3 v/ }) N0 t5 r
关键词: 条形码 N) A/ U1 q8 Y2 q8 N6 ?( n! X5 y: S
! _" x8 d7 e7 x `2 m0 M# d 由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
0 X: i+ ?. u2 m2 F- g2 t, \( z
, F# q$ m6 I/ c9 A& W- i, d 目录: M+ J$ o- o. l" X# ^5 c8 ]8 N
% a: r- x) b. Y, H) F- X& u0 ? 1.某校图书证编码规则
$ n* E7 s8 D* E- E$ L' B% F/ Q 7 Q5 B) z& d% ~' C$ c2 l- M9 k
2.条形码制作的过程
) m. h8 W& g6 K- o 1 J, I) i: V3 i) u& q6 B4 t- N
3.打印与测试
' x. i2 L3 W2 x& z' \) ^) H b& C
8 }- Y; c# R5 E' V 4.扩展应用5 h( \7 D4 k. M; J) P* H1 ?5 E& W
3 g- {6 y, m8 ]& \- J4 Y8 u. d 5.关于本例的一些思考* @1 r: F; r. ]" l/ @0 x( }6 [9 N
& B7 q3 c7 f0 g% o 6.免责声明与使用注意事项( @& @/ l0 E% S6 Y! X& ]+ f- w
% K' e$ h3 K* W3 f) z2 P
7.参考文献
+ u/ M( ?( K7 I/ Y/ j1 Y* E8 J
) R7 \! [& p/ t 8.附录) Z: m9 U% q2 V; @+ H
( z+ D$ F2 N9 H( N, M' y
( ]. L5 S" ]2 J7 V3 x- L
, ], k Q# E5 `# p3 s) r$ T
' [% h$ H8 M4 N) g/ a* L
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。 O: m9 S+ x1 Y) J
. S* B. U; h* b. l0 Z 在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。8 t$ U4 c+ h+ U( s" L
9 F7 ]- a* C% R3 l3 e" E0 f A 1.某校图书证编码规则
9 x+ s2 Q7 S" b% w! [" U3 j $ g# p7 q# D: t/ C2 @! _2 z: @' Z
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
0 l# d- ^: F0 b2 ~2 i$ S" j
' M% E6 b+ N2 A ①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
S9 I& Q; h& w( Z+ @
* D: {! m2 q( ~. U ②图书证的白色条码都是一样的,分为以下三部分:4 y; |0 Z* q( v6 Z) G0 p8 F
0 y+ z8 T+ x# }& c 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
, U9 X& H; F5 K! U
, v4 p0 R7 \8 J6 R; f( K4 V ③图书证的黑色条码是携带学号信息的关键,分为以下三部分:9 a( `" k9 y; F3 S4 k- d/ a
! \# h% G4 P) D 1)起始部分:00110;
7 |- [+ f2 Y- {/ f! a; V / u: c0 H8 e4 M9 h" q5 I
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; " M: |% q- M; x+ I2 [
+ A& L% _' s* w% Z
表一 某校图书证号每个数字对应的代码
3 T" t3 L* o+ u. Z! {% m& ` / }- D0 l( _8 p. y
数字 代码 代码数字来源 数字 代码 代码数字来源 % |( n6 C1 F9 F" y1 b
1 10001 1:0001 6 01100 6:0110 % m8 U+ i' l4 N
2 01001 2:0010 7 00011 8:1000 . E2 Q, r( g6 E( N
3 11000 3:0011 8 10010 9:1001
; z z" e# |9 W9 d# P& ^! s* G' t 4 00101 4:0100 9 01010 10:1010 5 P+ g& ~5 Z4 [" m' |3 n+ l& }: E
5 10100 5:0101 0 00110 12:1100 y+ Y: O' T1 P
* O5 P( M; _5 P5 _
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。* l/ I; ]* n% b `
; [" F$ E/ g+ Y& ~& R
3)终止部分:00110,与起始部分以及数字0的代码都一致。4 c* x: P% ]6 N; p$ m% w
. c2 v# J# j# E+ F6 V$ W/ s. n 2.条形码的制作过程
8 h6 k1 F/ k% F4 M' q
/ x$ W/ _1 E: L; e- s3 y 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
* ~3 N0 k# k% I1 L3 O: }$ R: b" ~
0 z& q1 V1 b8 S- A& O 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。/ Y. y$ a. C% A1 Q6 a
, U- c: @6 x' w& b& c
条形码效果如图所示(程序代码见附件所示)。+ A8 a+ u7 ^/ c4 C
: O+ T3 Z ]1 H) @ 图一 所得条形码效果图
; C+ |6 {7 u/ F1 x ( I3 |4 j7 L; i& P0 i
3.打印与测试3 e. @2 }; }8 W; y0 u
}/ i$ O8 V: v4 o
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
: Z4 \0 x3 i" f& E 3 a0 n1 b8 O# t! y% I" T& W) p3 ?1 e3 V
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
7 ` d1 \# p# z& K5 z
- k& d1 x2 C( P* M& T; w 为了方便进行测试,本文打印出不同大小的条形码。& b! s; B7 w/ X
/ t, l# X$ M/ Y" @& _
测试一:将其用透明胶带粘在硬纸板上。
9 p$ N4 @ j! F f
$ u& [2 ?2 M2 c# H# ~* n( p& ` 结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
% q0 H0 G/ [# V8 k# h u 0 s# c+ j( M9 C' D
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。4 O) M' J0 ?5 ?% i( I
' f% v& n4 E8 z, P4 m [! z 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!8 d& N: `* E4 T
4 {4 Y6 o: B3 c; Z$ j. D 效果如图二所示。% ~* e# j. y3 U
0 V/ W0 p4 x4 u2 R. K3 T
图二 打印效果图0 G/ S% `. I b7 W9 ^
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。6 n" d' D: ?! H, ^ \5 D
2 G$ A/ I) E- k. D* O; t
4.扩展应用, r0 d& b' y3 |$ H: }
" E) a+ w$ J$ B% v/ `! O, g
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
* m$ D2 u, h+ w
* W2 ]& z6 n, S. c3 u1 q4 e 图三 可供彩色打印的图书证7 Q2 p0 D# ^( r; f' Y5 k
- r9 J# K9 u# s0 E( J& ]! k 过后,我们会给出相应的网页版、C++版、VB版等等。
# U( j" D! z# d
- ^8 n7 l" y( B! j 5.关于本例的一些思考
- A2 {, ^+ t5 l8 J! S6 Z8 P4 C m+ A; p$ a4 @: d& L# Q$ s: R
由相关文献,可知条码技术具有以下优点:7 {( N' J8 p: }, y) p- j, [
5 @4 T: I. I$ K; \ 1)、输入速度快; - ?9 n: T% n3 H2 S& C- j
- |& c2 c5 |$ O6 W 2)、可靠性高;& ~! W5 i# f) p6 L, b7 S
: i. G5 H& b9 u 3)、采集信息量大;
9 w0 |% h- V( H + R: D+ Q8 A; K: T8 o* d- ?- v/ x3 `
4)、灵活实用;* L# K) U* w+ [( ]! u ~- |! |
* F/ D5 o4 ^4 D1 }1 U" ]+ e. G! S! r6 L
5)、条码标签易于制作
7 w: d- m& p5 C7 a7 j
e6 _) V; Z, E/ i* B 6)、识别设备操作容易,不需要特殊培训;
- e0 I3 M% I8 o3 D/ G$ t 7 N+ G# L) [0 o: G& K' g' l- p* G
7)、设备也相对便宜。, z( ^" R6 x0 F" H9 v! }
" }8 D, ?2 a1 r) _- q- l% i
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
( E, c$ e$ M8 j2 c3 k
5 `0 M0 u; D: F$ f \/ n6 j 由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
! E1 }4 z- r/ s6 y7 O) d8 C
: I& i* N5 [. K# Q3 f( O 图四:常见的二维码0 S: [; j9 J, _; O& b
{# T( `( f4 F* N1 o6 x( }' l/ w 6.免责声明与注意事项* t" M8 y0 `; B# {3 ^3 e
6 A# R/ c5 a0 p/ r: [# A
版权所有,翻版必究。
h/ C/ M/ @& E ; h. }" W; S1 h6 L( a! B w( n
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
4 a$ a/ k. q, \ 0 u4 ^4 J8 X, R1 G r
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 # q; e9 p6 Z$ v# R9 ^ c
9 F2 Y h+ e0 c 7.
2 F' l6 k7 i5 m1 | 参考文献
7 J( V* G5 n' h- @
0 z$ p0 e4 Z1 `) ^ [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]6 X! p+ X, d/ U
! }1 M( B2 ]+ p2 X$ }2 s' C& n+ [
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]/ k' r/ i. I9 I9 K. N
. `! v- ?9 T% `4 h3 K$ o3 ^ l( [- B 8.
4 x$ H" ^" y% j/ Q2 x 附录
* l% D$ H& Z G) L; t% e& @ # o# [ ~* \- Y5 p* y7 m
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
9 o& W* |" g/ \
. A) V0 R0 M3 M* a %barcode.m8 j; |# A7 F; F% d% m9 @9 p/ X
3 u! J9 {( P. @3 M" j, ^3 X7 i %生成学号a对应的条形码. T' B3 i& r* t) A6 j L9 K1 ~- {+ _
( p( b( @) c# D4 Z: W1 V %2011/09/25 13:24 BY小谷同学
) O7 s, e# T4 @, R: ~ c/ v7 `9 @# p N7 t7 v+ U6 F/ K+ c: k( b
a='1234567890123';%学号,自行更改
; i Z8 q4 {+ T + p/ f# V! c" W
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 u. }* o8 B( [. A! g) J6 j5 B
+ n: P- n1 j' K 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];%数字编码& d1 \2 S" c3 s& A
% M$ l+ ]/ R# @ White_num=[0,1,0,0,1];%插入符的编码
- `0 U: E% C2 }
4 x% {$ d8 g' A9 ~/ Z %Black_SE='00110';! m! q j% m- @
$ `* w, t+ p& P% [. m9 R %White_SE='10001';White_M='01001';, K; ?2 Y. f4 R/ ]. Q) n% [: }
! ?8 H# m5 G3 Z% \! g5 u) ^ barheight=30;%定义条形码的高度) G& @0 T+ W5 m# ]
) p* N7 s% [9 z7 l barwidth=1;%定义条形码的像素宽度( X7 r5 ^( G! D" \
$ W, ?8 y/ W: E2 e9 z1 c+ T6 ?
% n" X7 V! k% b
%可以对特定长度的输入进行控制,本文规定长度为13
: v7 ?8 T P1 P
" ?- r' H4 E. a6 Z4 C; d if length(a)~=13- p: J" E# a C7 F, i
9 U$ u) e; C3 Q! p- c7 r& M
9 K. M/ t) _1 n- ~: G error('图书证必须有13个数字');
* B( h8 {0 b4 x! e3 I: v1 I 6 g1 p& C" v- _4 i7 O: Y
end
' M% V: V- L% |% U6 g+ R& ~
% b# S/ h) X) F4 m H" z 2 K- c3 v9 T# ]7 U" k& ~1 [; G
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
. ]5 I+ @' Y7 e7 D7 n8 _ 2 l2 D2 H k( m7 E8 e/ X
%为方便,直接人工得出起始与终止部分的条形码/ h* x/ _1 [# w' Q& G" ^
8 L/ U5 L2 [7 S* w& Q* E% \; p %也可以由程序生成.
9 Q! a" d, A: y8 T& h) l+ d/ v
; `" r7 J. C! W2 |0 c/ V total=length(a)*(7+7);. M K/ h5 c' A h. ^1 _+ V% h n
, u& W B6 K: p; b7 m %条形码的总像素宽) B; I2 ^( S+ t. |' c( I
; `4 V! z- f% Y \ p %也可以不用求,因MATLAB提供的均是动态数组% H2 e7 l! Y6 x0 N' z( B! _( ]
5 T5 D! S6 P: W3 J9 U& W) H s=1;%计数,记录8 T# A8 i1 q, U
% `0 F( F( \! X6 c 8 d& W0 w5 S' M4 F
%由于利用for语句容易出现不可预料的错误
$ S' _8 K: |4 t, l3 e9 `+ S5 J 3 T; @( Y) N- {* M3 q, ]; G
%大部分是数组的行标与列标的调用问题,于是采用while循环9 a- {! ~0 `/ i' w& A+ _6 n: T
" _5 w# |. m( b; E) v3 r Z# D %嵌套循环,得出数据部分4 z K! u/ q2 a- l
/ o% w; F' v2 o5 U' | m=1;; q% g1 b8 [; T1 y1 P% G9 X
# N! D" _+ J* ] while m<14 8 M9 N( C2 v1 M6 C* q
7 X. p7 {7 L% B/ O6 H1 K3 z 3 E& Y) ? @' S/ Y- x y# E( E) u. d
if a(m)=='0';
& P" N! P. {( W+ I
( L+ A# [/ N1 |- v $ q' ]% e- B/ Z; Z; k
t=10;
5 p+ {7 F& ~" a1 h
. b1 Y7 t- j( X# n3 b! R
) p, {. l- D4 J7 O %若为数字零,应该调用的下标是10
/ g* H: Q8 Y& e. w 0 ~' Q* P6 Z5 d6 F/ b
( @: {6 x% U4 _/ K else+ J- r8 h/ p4 u; ^) a( G
7 B r9 H! [4 t) p. n- I
2 B( U' c- ^7 o' E! ^3 T" j& @% X# e. x t=double(a(m)-48);5 R8 ^8 c- e# Z& I9 V# I% S4 v! U
; q- x0 M, K; Z' H; U %由于输入是ascii字符,转换为整数需要减去30H,即485 z: z" K w5 S
. P6 m' N" y+ _# ~: Z& [' P + N2 [8 x; D+ Y, K( c! }
end6 k7 m' n! t2 i( z8 y! _0 T
+ r# m$ K h1 _/ w% ?! m+ x
3 ~" u4 e" O1 ]1 P! P n=1;%同样的while循环
1 ]& L4 M# O+ M % J- s" Q' g: B3 u7 A+ C
' S9 O, r( e5 s* v+ P& i9 O
while n<6
4 |5 V3 Z# N; Q! n - I) E( y) y' t7 g$ u0 C! B
8 Y8 @3 l, x3 o* I6 V0 V
if Black_num(t,n)==0) n: g/ w( A: r2 N: C
% G* \" y/ B# J
2 X: @- V8 z! U1 P barcode_M(s)=0;
. g3 t9 ]; `$ f4 D% v, ] 3 p, b4 {% U+ c- Z2 r
5 h) s3 ]$ X# L/ P. v8 [* l. A
s=s+1;
t2 q7 b2 k) J. U " E+ U2 m; A/ ~) N2 F* G
( S/ [. ?- P& d. S( F1 y/ P! Q1 f# f else
" W. z+ G' t1 N4 S' x) }9 o 6 `: v5 |, z# r- S- X# [8 X) ^3 F
H+ H) d) U, }4 u
barcode_M([s,s+1])=[0,0];
' `9 p p# y# G0 ?% y: H 9 T4 C, w% l) t. Q s% i
. m- g2 ^0 Y% w: Y2 c( W1 }" | s=s+2;
8 i# O- y1 m0 v6 y4 [ , O! b2 O; H4 v9 {( w# L
+ \) L$ R* X& B1 U7 i9 j end7 I2 n, _ n9 J" O9 k
( ?, P% r' _4 E! Q; K" ^! M
) L# `* t" c" D# i; s% r, @: A2 L, r if White_num(n)==0
. z7 K' Y8 [: {+ r . t C9 a2 u/ i2 v
, G" z) c* p1 [, l
barcode_M(s)=1;6 X7 V7 A4 O0 x8 \0 Z
4 T R+ f, f! B
4 b- D1 K" J1 b; \ s=s+1;
2 {- j& [8 u& ~) D: s
/ {* C6 F2 h$ Y$ N$ i9 R" t! L " S1 a v/ m( T, t
else
! x) l- D. l7 V " z$ u3 Q N4 _7 N5 V n" L/ x* W9 m
% n5 Z* t4 a8 M barcode_M([s,s+1])=[1,1];. T8 r+ Y# F7 [( l$ W9 T
' H* G3 |7 R" j f4 _
1 l+ P" H, @) W N) O2 J s=s+2;
- d+ h% E6 m) Y: M, O4 [% P8 s 8 v, l; I# ]4 S+ d- x) ^4 |
* C9 R: `9 N7 u/ c1 t* C$ [ end$ `" v( R) f. C% t* E
5 e+ p. R$ ^ B" v8 g
0 l7 p/ S/ B" [7 Q; j, t! q n=n+1;
) J2 P. u4 m- C3 f- ?5 ]8 U7 j . o6 N/ q7 r4 i- U, o1 g* ?
" [& I0 O; m' u' a% G, v: B
end! b9 c2 }! O$ {) t. c4 |( E. B: l
b1 E' y8 f" g* A$ m
m=m+1;/ Q `! v+ h; G' \
! q" y# s9 K4 V7 h: H9 ?- ?. e end$ N% j# A$ h7 h8 i2 A
, p* c2 l+ |% Y
+ ~6 ~3 e& k2 T5 U8 D; U+ E
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];: u, S6 O6 a& _) h- q3 S4 \: C
) a" y( L2 J- D3 v% v %将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵9 q$ D" b" }1 d
, s8 Q* O M$ x6 o3 q
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
. H) C/ @" C8 U5 F2 R
9 ?4 J, I; [' Y imshow(bcode)%显示所得到得条形码
/ _ e* U7 F8 d/ N! s0 W
& Z% ~4 T& ^2 |) P4 V$ u2 y %然后可以自行存贮得到的条形码
# g7 I8 h5 n. z3 p! e- ~ + G& H- x! `0 o) b9 d
%然后用PS等工具得出具有自己特色图书证啦: h; Z0 n, f* s0 b
' ~- X- \( i) v; g+ Q
) f9 \; ^/ Q, A2 A4 q
zan