- 在线时间
- 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系列之——某校图书证条形码制作( o1 ~3 E0 T# G$ k2 c ^
5 V6 n) H( X2 I7 ^4 `# M! u9 I' w O( _小谷同学 2011/9/257 U" ?, n$ ` V" E# V) V6 X v
1 Q; y" _* E3 ]" P2 K" g
摘要1 P- [( @: n: W9 k9 A) }
# }, c' p$ ]4 @+ a8 G关键词: 条形码
# r0 \/ \* M5 e- b- R, Z
* l$ {! I% x; [3 {9 g由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。/ I6 u1 m: J7 Z/ b- r
V R9 P3 h$ L* ]. x% H7 |目录
F6 c2 Q) [. q4 B; L) Q- K; b H8 N
' ?( g9 S8 c6 L6 i: t1.某校图书证编码规则( H2 C8 B3 g+ `% @$ i/ t- N! Q% z
; ^8 J: H4 Q! u1 C* w- [0 ~" [8 R# t
2.条形码制作的过程
; S' z7 c: C: w2 s, h0 N# ]% V- Y& H$ |2 g1 C" _8 F& d
3.打印与测试! }! L! a N# f8 l( A
# J% o: N. V1 \. V4 C
4.扩展应用* t/ P+ z# }3 K5 \- o; r; ?. {0 ?
4 i6 K3 {7 j: o$ n( z. r5.关于本例的一些思考1 r! S) b; r6 G3 u! {
3 m& y- |0 d; u6.免责声明与使用注意事项
7 N# o# ?- J i8 m' ]
6 d5 F- [) a, }7.参考文献
- G7 u9 L1 c; Q. p4 C
* K% S4 F1 |6 \. N) H. j6 B, N8.附录 G5 q( P3 K2 @4 V1 b; C
4 Y& L8 l/ G5 v9 _0 R
1 i7 G+ x* b3 _1 W: I3 Y8 |
. o g. ]4 I+ U% }/ L; \- E' p! x5 ~8 M: w( U1 a
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
h# H2 @/ ?" F) A
* y1 B. f: ?& M. [在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。) C) y1 Q& o* M( m" v
; A3 C2 k% o9 Y; E8 x1.某校图书证编码规则
- U& t1 w9 T0 }: o2 j* v# g% I
2 z5 Q7 n* Z& W9 _" O+ o& b由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:( V2 T0 \2 r) `+ K9 ]: X
( a1 E# H2 N6 p3 Z6 M! R①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。: _* c _; q8 R! q' G2 C
2 U0 d. K; x4 J②图书证的白色条码都是一样的,分为以下三部分:
; Y# h9 B. j& m" g- T! {8 l7 U* d% D5 [( Y" l* }
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。- j* n5 o% u1 q& ^
9 i2 N% p5 _, e! t: R③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
9 ^, l4 T# m' h( V" I S% q, B' `& ?5 T" Z
1)起始部分:00110;
* a9 R, r8 V+ u) p& g7 T! z5 p' ]; H& U0 V1 X }# ?/ C
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; ( i9 u; K+ v% a: T' o( [6 }
% P n, f( c0 {; l% S% T) Y0 h
表一 某校图书证号每个数字对应的代码' e' i7 V! g% E
) J v3 m: {. \; s- U! ?数字 代码 代码数字来源 数字 代码 代码数字来源 : ]1 ?$ Y2 \" ]* \4 b: W+ U
1 10001 1:0001 6 01100 6:0110 7 [7 F1 Y P+ h
2 01001 2:0010 7 00011 8:1000 9 B4 M2 g: ~9 E8 B
3 11000 3:0011 8 10010 9:1001 5 E6 C; |' P/ ]# K
4 00101 4:0100 9 01010 10:1010
/ s4 I: J! L: i O" [" @5 10100 5:0101 0 00110 12:1100 % s. {3 d" v; c; B" b+ |9 V
8 m9 \/ [0 g/ w3 w% A+ X( m说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
5 V* n" M" Z s' o, X. y" L7 z
, R6 R+ U# ?/ }0 A1 m3)终止部分:00110,与起始部分以及数字0的代码都一致。4 y4 {2 e1 `0 }& t4 K% S1 O7 Z8 K
3 t9 t9 H. i6 u6 c" @1 t2.条形码的制作过程
! x, f; A3 _9 D) a- g2 S$ W) c) @) m7 m+ n
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
* }4 h& a' p' i. v/ Z3 c; J, @0 r+ ~8 `
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
1 o$ ^# O* t) e' Y$ p5 l9 m0 c
* |* e; q! v# A& H2 b/ X条形码效果如图所示(程序代码见附件所示)。
' `' z7 |7 ^0 H$ q* U1 _7 q
4 ~/ D9 V' A2 R' u图一 所得条形码效果图7 ~7 w4 o7 w' _3 F
3 X" } {5 E$ m f1 N4 @% r, r
3.打印与测试0 G2 s/ Q/ l& F( l1 d6 o: T. e
1 F0 S9 w2 m1 Z2 y5 a) s* C; h有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。( x; u6 `. X$ w9 T
. k9 W! w/ V; g7 A2 t) J
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
2 M3 {9 ~8 F7 G8 O6 r; P1 D2 p! n b$ m! s
为了方便进行测试,本文打印出不同大小的条形码。2 o' v1 l: `1 |" c0 h" K/ N' c' U
5 M7 I$ A9 t/ S& ]6 [测试一:将其用透明胶带粘在硬纸板上。' B" U1 P* A% v+ J( ~( r
, ]0 I* j I2 ?8 u; }结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:% ~2 Y6 Z1 j( A7 x+ H8 ^% e' k+ K8 {
; Y. t, a4 C6 x, X( f图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。/ C7 U( x& n* S# J" L. l8 E& k6 t
6 q* V# M+ s1 U! w8 l
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!0 H+ @& d) Z. N7 b, P E# S* @
, c! L. u0 t: A6 \! U效果如图二所示。
& \+ C3 e3 j+ g3 q2 N
( a, I' \% |$ W6 h% T图二 打印效果图5 p/ a5 S# P3 w3 J& J, Z n
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。; t1 Y" D3 n1 E8 A8 J& c. ~
; d" B+ n! b# F! W" \9 w, C" t, w
4.扩展应用
9 }3 R% f h8 Y& B' T: x$ V3 Z% i
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
+ g2 V9 j5 H; L( J
4 y3 W) f G. r* @5 p图三 可供彩色打印的图书证
9 g+ B- _. n) Y+ E( Z- |" T
! u6 u9 L$ N0 \& t! \* g过后,我们会给出相应的网页版、C++版、VB版等等。7 _& A, X1 t D7 L6 z& E9 P
- i5 d( R' ~& Q. ~) v
5.关于本例的一些思考
1 l( N2 n% p9 U0 _5 v+ ]1 Q
# l: _! d8 k n1 Q3 z4 s. O由相关文献,可知条码技术具有以下优点:
: c0 q! x1 J: R
% Q3 n# d, l0 m: F" f L2 b2 u2 ^ 1)、输入速度快;
% l8 l5 M3 Z& w) K6 g3 }
) [3 S( i$ {6 V2 a& d 2)、可靠性高;
/ w) V( y( @; D* m. O0 A
# i* M1 C+ V# S6 D/ K 3)、采集信息量大;
( X- d' ^2 L% T0 m) p* J, }$ e. u( ~4 Y9 N1 j$ s" d# n% B# Y7 O1 O
4)、灵活实用;4 g- B+ g, k+ o! I7 {+ m
9 i; q3 X& Q* v
5)、条码标签易于制作
# ~) J W, j% f \0 ^" c
# }7 F) ]2 v+ k& p3 x6 J" n b% A6)、识别设备操作容易,不需要特殊培训;; i; N$ `' M& G7 D
7 E- ?9 y d4 X) {. @8 j- L
7)、设备也相对便宜。! k1 e' u! L( \2 F; R
0 e* o& ?. j; b+ S; B
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。3 w5 U: g( s( [* ~( d/ Q9 o
$ c5 ?! x- S- i! @' ~
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
6 r5 b8 s/ r }1 j8 v
6 R0 V) l1 R0 m4 {# @; E$ A1 o图四:常见的二维码! h5 p4 A( R5 `+ }
. ^3 `& R, P% w; Y6.免责声明与注意事项' X4 H0 C. f, b* [; c) O8 u( ]
, q- i- o, j6 z( j: g, a$ a- z
版权所有,翻版必究。" o- f8 r' A$ q" ^5 I. x
0 V( C5 @( F! P# t* ]( _
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。9 u* @: Z7 d0 {& s
% R' d. K6 I" k- K! S9 P任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
5 }5 R; @$ G5 N. @( F$ B
: E2 Q: r+ }% I) z* E7.
6 j0 g. J- [+ e( g参考文献
6 J" _3 b" L' ~; I* Q8 s C) Z$ j" k% \4 c( G0 t
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
) w+ F8 ~/ ~4 J- { ^
' \# E& o1 ]4 Z p; t3 B[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
+ x8 H+ }8 h( {3 Z% f! ^/ U% u; A9 S( S/ P/ C7 {% e. W3 P7 G2 o8 N
8.* B3 R5 P* v! t- Q
附录: m, t f! c4 ]) C, v9 `2 f
, v9 |" J- P4 W6 O. R8 P2 a
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
( t% y9 c! D5 Y& ] n7 y* q3 V j% v) J8 L: ^
%barcode.m
' D, z7 Q8 x8 {0 L5 g: @+ l: M+ V- {8 j, o9 i/ [" D/ i5 z
%生成学号a对应的条形码
! g9 F; K( L( ~# y$ [2 Q
# g# o; I* N8 |4 }0 }3 M' w%2011/09/25 13:24 BY小谷同学
- z$ b J7 s6 N+ c
4 I% b7 _' ~1 N/ S5 u' ea='1234567890123';%学号,自行更改
6 a% q' s7 h2 f* J% a0 F5 A/ ]0 c @# H
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;" N- Q+ I4 U9 ?2 A( y9 P
+ M. Y- {& o! w/ t& y5 ^8 s Z2 s q0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码: c9 P2 {9 s* u, L5 C
9 p1 }' o" `/ t' j2 \0 V
White_num=[0,1,0,0,1];%插入符的编码+ n3 ?. ~" b% q7 r
# \9 q3 T& D3 m) K. `1 [/ i
%Black_SE='00110';' ^# g7 h' a4 i4 a" }3 E% Z# z2 P
) K5 I0 I9 a W8 i0 [
%White_SE='10001';White_M='01001';
+ ]( m3 n& s2 u- |5 h3 {
& \; j1 L4 G9 ?9 d) s* |7 |barheight=30;%定义条形码的高度0 `- G" K9 ~, q& R/ j! x$ v$ T. [) W0 w
" c! U& ?7 U6 q" H% V( nbarwidth=1;%定义条形码的像素宽度
' V$ t( Z/ l$ ]3 Q$ i
8 b9 |$ c! H3 t/ y% R1 M! _0 T5 M4 [1 t
%可以对特定长度的输入进行控制,本文规定长度为13; Q5 N- |7 ~! s, l6 x% T( f$ Q
) F7 F3 p3 k% Lif length(a)~=138 f W v8 J) m) b( D; G& t2 W7 x
: u+ w6 t3 X% D/ o/ g5 z9 m- {3 Y w: N) N$ h8 ]* O) }9 y
error('图书证必须有13个数字');8 n+ A( v/ a! L
! _2 S/ s1 r; y9 j" J
end
- A8 D' v Z( s! @0 [
% g4 Y) v( E: V9 ^9 N& l s
8 n1 K* t' A9 O' Vbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];+ U6 Z/ J' r- S
1 F+ p4 H. }* p2 d' U& F
%为方便,直接人工得出起始与终止部分的条形码8 q% Q; S8 Y3 B q H+ m/ O( @
/ f; _# I; d8 m) S; h%也可以由程序生成.
- g4 e# S, Z7 W8 C$ }4 K* i( U% z- n* x5 R
total=length(a)*(7+7);- f& q0 P0 h4 h5 X- {3 N8 D
2 [" y ^8 o8 a8 L" n( J
%条形码的总像素宽7 J3 m7 j9 {5 ]; X& V) j
1 B* h8 B) I9 a% l# E8 U4 Y, t%也可以不用求,因MATLAB提供的均是动态数组
- B" D2 w) j# ^% V7 z K/ ~/ [+ R/ e1 O. H1 }+ a$ `) n# R. {0 x
s=1;%计数,记录& l# O5 {5 N7 B6 R
, g8 n( x, M' p- d* ?% ^9 u% u
# c0 i3 D3 ]4 |3 H4 c. v5 F%由于利用for语句容易出现不可预料的错误9 c$ s6 ]1 u! `
8 Q7 Y) C2 K/ M; i* M( [" o
%大部分是数组的行标与列标的调用问题,于是采用while循环
v' e$ J3 b+ B% z- b- S/ X* d( j- i* |
%嵌套循环,得出数据部分
0 Y1 F. p0 Q- {0 O9 W
1 k3 u y4 ]* T4 P O# _m=1;& u( ]0 L' R% |7 ] v3 o
8 j( j/ w9 `: q2 h& T7 s8 jwhile m<14
6 h& ]! L0 Z. H( p' }
, H% R" e2 \, e* h
; V6 H$ z0 h; Oif a(m)=='0';
+ @" t: [- u3 y$ u N T3 T- e: l+ A; x4 ^2 K
9 M8 u2 q2 u4 m7 @4 O! ^, T( vt=10;& v, C. G3 I: F. E! n3 ^$ S* |
' E( S9 g, w2 w1 V6 U5 w
' S" B n/ K3 D: p! S# r%若为数字零,应该调用的下标是10
* X/ R) W: G2 q8 p+ Y: I& Y' z( _' O" E: U% O" {- P; H
' A5 p m5 J7 z# A Y' J8 Selse/ Y a5 U7 G# i9 K J3 j
- s# R* @, d; H
# Q9 q& p$ v1 U- D1 v5 et=double(a(m)-48);
# D# v d0 j2 S( C/ @1 l! j# D+ U) U; j/ ?
%由于输入是ascii字符,转换为整数需要减去30H,即48- A6 B- y. y1 y4 P( D+ C
$ d7 t) z! Z% G6 d8 y+ l
$ x+ L' [# B; [# S0 Y+ h- |2 O
end
/ u1 K/ E3 J3 A0 [. _: H+ M$ e8 E0 [. v* I B9 C6 R
- l0 I7 }. y; o0 F
n=1;%同样的while循环
, w' e' g" a( N- z/ Y1 P
: S/ W/ |$ L8 K0 O# H, Q9 Q
+ C# X' W0 P0 C! a2 \9 Rwhile n<6" U1 W3 H0 i; j9 b, |
5 w- i1 }) N& L2 W$ H1 R( u% W. S) n" ~& C
if Black_num(t,n)==0
0 ]% R$ s% `! A8 w8 G* K4 k: c I" e. n0 w
6 ], ? c2 o0 ~* {% ibarcode_M(s)=0;
% S. e3 |! U! h& i& S2 L( i$ b9 _- v4 b7 r: ~
$ R' y- J9 [0 w; @
s=s+1;; K& q8 Z& h, A! i5 G/ d# s: \% V
2 a+ a1 p1 r; L) M
/ O; @7 D+ U+ f; Q( felse' d6 P8 @# h3 Y" s4 P5 v% k
0 A7 l( }/ W7 R J2 y
. E, ^3 `* ]: R2 f9 ibarcode_M([s,s+1])=[0,0];
" S/ f3 y: L m
. h9 k- p+ w8 A* Y6 W; G/ x J3 u
9 Z& K- d- _ m" @( O- d$ zs=s+2;6 {- R2 u( g: K- d5 H
/ w( [( ^3 x, S) l, J v" S1 i5 Q) r
4 p$ b( e9 S/ I; c9 {
end4 M9 l* g* Z2 e- p& r
% v& a0 o- A! u6 f% g
; X, [: P O7 _' \3 ^if White_num(n)==0
, w$ P) s2 T# T1 W
4 c( h/ _/ j4 A6 G% w5 x$ C9 C# e% T' M& Y- a+ v9 Z$ e
barcode_M(s)=1;
" M. W$ J) y; z+ `/ X
- o( \. u1 d; i& N9 t& X% @* u) p& M, u$ a% p' o
s=s+1;$ e P! A; K2 y2 V( Z6 ?4 ~
2 E& t x2 U: N4 K1 |, @7 j6 d, s% `. }( C, g# [' S4 j
else
8 |. {7 S2 G$ K9 s, ]
1 U: J. c! c. l: f) I I' G2 `* g& ~' i; z( Y
barcode_M([s,s+1])=[1,1];% Z& D; |; r: N7 F3 }) {
: ?) c. A8 K+ K! i0 d+ v" w3 Z( Q
/ i5 r( c3 p& q8 }1 Z7 `, r; N2 Ss=s+2;
, [1 M% Y: u5 Y" h* f, ?9 l' B0 ]4 `
5 {4 M( `, g9 {) o8 x
end
$ G$ O/ B( u6 Z& e: i& b6 w$ {- j
% u' e R1 s. ?" qn=n+1;
- X& J" F$ A0 ?" L z+ P# U3 ?8 z$ V% G9 P3 c
2 ?' f- N5 `8 Wend" ]9 S. n! p) H0 [# B
6 X4 r( D( C% O. F. h" Fm=m+1;) W/ ]* L8 | ~0 \, J0 k) x; D N; G: p
# w+ W( V' Y* g, o- {4 L. cend
6 O' [( ^, }9 X, n! ~7 B) `$ r; @
* _7 ~# \! ]0 i' a& v. Z& gbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
6 \/ f h6 `9 m9 e& m2 P2 O p3 d! h
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
1 _/ b6 a. S& H& {! }' s" u$ _/ g
8 f0 K" ]4 s8 xbcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
* A9 B3 i. S0 E: `. K& ]# b( l( E: G8 T% S3 ?. |
imshow(bcode)%显示所得到得条形码" v& F! U7 O0 n% U
( h7 i1 z- @9 }. ?' c! h! H; h%然后可以自行存贮得到的条形码
9 ^( ], r7 O, l# B( B" v
% o4 @6 b5 i: p; L* g# [& D%然后用PS等工具得出具有自己特色图书证啦: E' j6 z! P) R+ U& s
( e$ P" J, o0 s8 F( {. x
% w6 p$ D. B9 _9 b$ d |
zan
|