- 在线时间
- 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系列之——某校图书证条形码制作
, w% L- f1 i1 }* x4 i1 O5 J) h9 Y9 Q( {
小谷同学 2011/9/25
2 Z6 e- r: M+ P$ f2 M! ~- p% H1 n& Z. F- n5 Z. h8 g. h6 O
摘要7 l# B* H i9 h% |
5 l& ^" f) y5 x& Q9 \6 t) T关键词: 条形码
( l7 p3 o7 H: h+ K6 q. W
; [% Y/ U" N0 ^* d2 z: m+ w7 J由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
$ v2 G8 @ G; j2 t+ w: z
. p# f. \! k+ Y) E7 c% ~目录% Q" {" X6 A2 A* h$ V6 y/ [& }! U7 R
& W) C$ ]4 C9 q% D1.某校图书证编码规则3 v+ l2 q3 e3 t4 e5 a
# c0 }* [0 M* x0 p1 Q7 G2.条形码制作的过程9 C9 n; d9 L! N0 Y' t ?
( q+ M! y, [6 s& i' b4 a7 a9 M/ L3.打印与测试1 Z- r4 r' J, v5 Y; Q
. i9 D6 Z! U' r8 s9 A- C) }2 `* W
4.扩展应用
* I0 }4 j0 z1 p2 g+ K
7 O: m3 V9 X' M1 }5.关于本例的一些思考6 v# w* O/ W6 R8 g: `0 i! d1 L
& X1 _8 T) `9 l3 i( z6 D6.免责声明与使用注意事项, X( u8 H. y% a5 g
0 J% V& z0 L7 t7.参考文献* F0 b0 H, F, |
. B* P0 H) \" T |* J
8.附录
/ Q( b( L& z: P! r& R
! Y* S' k& l4 g* i ]/ G: [4 x1 b
6 U$ A3 F+ c# r9 ?$ h/ f7 \! S! K+ ~; Y' q
. [& g1 @! Y' z3 `5 j条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
( F* Q0 \" Z4 c$ z
3 G$ A. W# l4 M5 ?在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
0 N8 y8 l9 {; ?4 g4 c) H5 S0 y( h A8 m+ O& r2 H8 t
1.某校图书证编码规则3 d; V# N! j8 f) w8 K L$ @
2 M6 N" v" v1 U
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
( i& e% O% X ?8 W" A" \, i' m" q7 N4 B4 c: n+ r3 _
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
' m' K' r& j T8 ~/ U5 N. t3 P3 W" q+ Z& W1 C. z+ p5 e
②图书证的白色条码都是一样的,分为以下三部分:
' f8 e' O/ w& F* B
, m2 O( ^2 V2 s1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。& }5 w2 V/ e# t( W1 E! C4 l2 ]
3 T9 b) j" K+ |6 W2 @+ m③图书证的黑色条码是携带学号信息的关键,分为以下三部分:: V$ ^3 l' ]$ r+ p, W$ H) D
7 O1 V4 T" ]6 R) Y# z* x
1)起始部分:00110;
. j, z8 E- w/ j* u) G Q0 s8 S
, V8 L# x4 k9 K3 h0 r% Y2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; . [$ g" I5 t' i T. H
1 F* \# N. d" X% n表一 某校图书证号每个数字对应的代码
9 ~7 I' A1 e/ B- B- E% J9 d
: o' X3 j! j8 `数字 代码 代码数字来源 数字 代码 代码数字来源
& V0 ~) Y4 [) ]* J4 m- j, z1 10001 1:0001 6 01100 6:0110
' |" }4 f# ?8 w: F) E3 Y2 01001 2:0010 7 00011 8:1000 , |8 ^1 T+ H- L2 w: }! G
3 11000 3:0011 8 10010 9:1001
+ U/ L3 r# Q9 ]6 K. Y7 e4 00101 4:0100 9 01010 10:1010
* \* |5 ]4 [& K3 k5 10100 5:0101 0 00110 12:1100 1 z X3 z7 S% N" w: v7 o7 w
; \- y9 N, j, c, a说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
: S7 c' F# z( P' G3 e2 r4 Z( K3 J8 K$ h2 d
3)终止部分:00110,与起始部分以及数字0的代码都一致。 M/ X2 B# I- c+ c( \+ m0 Q
8 a4 Q1 k) e. M4 Z* K2 r
2.条形码的制作过程8 m" K" M& ]) |( M+ q/ Z
8 V7 U! S4 S; q
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
+ d B- X8 f4 q9 H$ [8 w4 o# a q3 y2 w" m+ ?0 ~
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。, z* |4 f# O9 b8 E! k4 }) r
" i1 U0 y! g' A! F0 }, }
条形码效果如图所示(程序代码见附件所示)。
: q0 R" k8 t; R; Y( I' ^$ t9 ~ b
. | |7 B6 d; N# P, T
图一 所得条形码效果图
- U) u5 n9 l% F& C6 w% C. O/ Z* s6 M6 S6 U) d# h$ |
3.打印与测试0 I+ U( p9 N, c
2 ~5 L& d) d" E0 H# c+ b$ g- J' {有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。. o, M) m2 f4 x$ x* b) m1 T7 J
) d: S; H, I' L7 k
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。- i1 q7 O j! `
" f) G6 B- u. ]9 }: {% _ ]& B5 W/ ]. o为了方便进行测试,本文打印出不同大小的条形码。, U3 {. e" ~! J% a1 O- s
, j# }4 |+ K& ]1 _% i# Y6 g# J测试一:将其用透明胶带粘在硬纸板上。; [# A- m' Q/ t& g
* u3 ^3 ?% h, T% Y7 _
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:0 o2 E) J1 _4 L7 a) A
& A+ J. m( u5 e" s
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
6 ]* x+ \9 E* K/ C: q" u
- o! ^5 z% S% z. }测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
/ |7 @$ Z; E6 ]2 ~2 s$ f
3 R; f3 _" G T4 X效果如图二所示。
! M6 i! c* A* l6 J+ j* M7 _, h/ J
3 k% g% n" v! g; y/ L9 T# S( m& T- k图二 打印效果图
' q* u# l$ o8 Q& t# ]6 t5 r5 t8 E测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
/ q$ g; U! H" Z! B5 L
# \, D/ z" K- z& z7 c4.扩展应用
( R5 }# o: ^/ _/ [+ N# r" W" y2 S! y& P8 M+ L! W
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。. U; z& N0 S4 U6 u
& t6 g- g* n! Q5 _/ }
图三 可供彩色打印的图书证
7 U c3 V' ]+ w, ]; i. {
3 }9 l; L3 f3 a9 u. ^过后,我们会给出相应的网页版、C++版、VB版等等。0 C' ^: F& j4 a
q' t0 S% |7 J* A3 x8 K5.关于本例的一些思考9 J8 e; }& S% F! ]) j
, N$ }* I+ V3 w% ~( H+ }
由相关文献,可知条码技术具有以下优点:# I2 r, H5 k0 b4 }# e
( y7 W, F! B. |, |1 o
1)、输入速度快;
$ m; o( `8 w) ]$ V6 R: ^/ {$ T/ y: i: n; P5 J, b& J
2)、可靠性高;7 P% B% ?- ^1 y1 c/ }) f! ^! k* y
5 n3 i, h O7 Q+ J 3)、采集信息量大;
4 U- t- y$ C% c3 ~! D/ f3 C* b: ^) w
4)、灵活实用;/ `6 @3 [3 u j: x' ^9 b& E
2 \; M0 `4 ^) h5)、条码标签易于制作
3 m$ E4 x2 O6 @8 T* j2 U, F# z. H$ }% |7 @
6)、识别设备操作容易,不需要特殊培训;% q0 p+ `- @- }9 W- u% h
6 B: q, s; _- T( ?7)、设备也相对便宜。
! m" f0 G% a9 o; l. s, q& \5 ^5 {# ?$ E9 Q
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。; m8 I4 V; c2 Y. f
~' s& O$ w7 g8 q由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。7 d5 N8 B1 {5 F/ x! v( {
) E- @' L Q7 Z9 k! V图四:常见的二维码" D6 |- k) [( x$ a3 M
3 v }3 A3 ]) E% u. i
6.免责声明与注意事项' [8 c8 `* K* z. r+ u
* X- u! w3 F9 r# W: H3 |( p3 Z" N8 I版权所有,翻版必究。6 _" K! \7 d, b! H* U
% I6 D* l2 w$ K! i% ]6 B技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。$ V/ n6 Q6 U) z% Y. p' \
) c9 Z5 o0 p* X8 A1 z
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 8 h; B2 v. ^: i7 Y
% {" ~3 S2 d2 i! k/ a @, r
7.
- _, J/ q' J+ n/ D' e参考文献
$ `' D9 G$ S7 _/ I7 d/ r' ?5 F; }3 l( _8 e2 g J. Z8 h
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
' C, ?# {/ }* G4 y
1 _( O2 `1 R" _. d& d+ @1 e; W' Z[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]: Y# r* V9 N# v+ ?
+ f0 R& z* D8 l( l P+ E
8., P x% w; W! |/ _. v3 t1 R9 k
附录; R3 x; I" k- `
$ u% A3 W/ w5 L! U; K! G' Y5 U( j
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
* N; J8 {9 E( L: `9 F, D. ] ]
%barcode.m
& J& h4 P8 T7 E: n$ h
! W/ e, g0 d5 v' j4 V+ a; F; b%生成学号a对应的条形码
9 z( N5 |7 L: Z- |- [ r, L) L8 q, [+ g; b3 \- A
%2011/09/25 13:24 BY小谷同学' ?7 [+ r, q, |! b2 C9 s) f
9 @2 l- K7 X% Q, |9 ga='1234567890123';%学号,自行更改
' _5 ^+ K" ~" R$ g: C \6 @
! V, r; Q4 }. G5 t' T( z' xBlack_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;1 P6 j# M* t! i2 g
: ?0 s3 N2 l) X" F8 A) u# x
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];%数字编码" R9 G7 ?0 N8 ?. E% [# H* P f; k- @
/ k- k; {% U. U
White_num=[0,1,0,0,1];%插入符的编码
" F0 x$ c$ T6 q* x; V) m1 X$ F8 j$ Y. n( ` j
%Black_SE='00110';, V' _; a+ v! q6 d, d
+ x- N2 S, I4 a5 {
%White_SE='10001';White_M='01001';) z0 Z# r9 g( C" t; y% |
9 s( H- k: M' I3 n
barheight=30;%定义条形码的高度' y1 w6 ~) j( @; a$ H# l
- b6 h; `7 n; ]: l4 dbarwidth=1;%定义条形码的像素宽度) z* n% j: Z( Q. q. G+ k3 q
- D" h5 G" F9 o0 N- b6 S" g& N. w9 r1 u: I c b
%可以对特定长度的输入进行控制,本文规定长度为13+ N% H& e) E! ^) N" N
, D! |: A4 _ Q9 T. K! Tif length(a)~=13
. { D9 o5 M7 |4 y: O' N9 H# A M6 P4 _. |4 w9 t( j+ A. f F4 J
9 z2 F& H/ N( W: L0 f
error('图书证必须有13个数字');
. I3 `) X9 v7 L# o8 T3 i2 J& f! W
end: a% w. @6 D/ K0 y% V* A/ t
d, g! f9 `: s) L, S
* \3 v6 x: K" O" g* qbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
! ]6 l* t2 g" t8 ~9 H1 l- ?- J h4 N& j
%为方便,直接人工得出起始与终止部分的条形码
" V l; u% [2 A
9 @! v+ \( c* R9 X% m%也可以由程序生成.
* Y6 P/ A% G+ i/ S# g! W% _8 o, J6 T+ t' U$ Q: q3 b% p
total=length(a)*(7+7);
* r6 y6 @- j5 w+ Z
% @% M4 F% O- {( k" L8 }%条形码的总像素宽
; ]) {, P1 U8 c% p# X4 S4 i' `; y# K
%也可以不用求,因MATLAB提供的均是动态数组6 n- X- [; `( A1 c
& ?4 e/ B& T/ _* z8 Q0 r
s=1;%计数,记录* ~. y" `) ~9 f* [' W/ D1 D
u2 h8 h# |/ ~6 v
3 I1 O. n- W; J% ]0 O/ L%由于利用for语句容易出现不可预料的错误# t" J8 U3 E1 H
8 v" w' ?( A. r6 a/ r' h, ^. ^
%大部分是数组的行标与列标的调用问题,于是采用while循环2 f& S7 C- F% F( {
9 j7 K, ^' V1 l; q6 t
%嵌套循环,得出数据部分
9 V# q% N" y1 H+ X: t6 e
! a+ g+ S# i$ \+ x& ^3 {m=1;
% j; l' l% P) L7 o+ @2 X2 Y- L+ z% ]+ k5 M
while m<14 8 b# c. o. R. t" b! y
3 _# I" l' H' R8 ]0 E& q3 u
! q! l9 U) A) J. W- bif a(m)=='0';
+ A9 T1 x4 _) g
9 `# a7 I" s' w/ ^+ A9 Z
9 P/ a& j+ n% f) B2 e4 a' }6 L# Mt=10;9 p/ T: M2 Q0 h8 d' Z0 ]. n& G, y
" i8 w+ g0 }. ?0 ^, @* V5 {% T! d+ J; [1 P
%若为数字零,应该调用的下标是10, _1 H A' h' D* P8 W
+ ]' C& N5 X, J) L1 e t' `$ P
, x3 b9 |$ i9 X+ kelse; t& I% w3 Y8 M4 R' v: l. ?# {0 `5 E
9 ?2 s" l# Y% @1 z
; ^2 s9 g, R( o- b& rt=double(a(m)-48);
8 s1 w6 Y" ~/ C$ A- r) B
4 C7 o* a1 v' a8 C' }%由于输入是ascii字符,转换为整数需要减去30H,即48
- G; H1 l5 d0 z# M
1 ?6 j& S+ _/ |! ]6 b; m# x# D5 @ k4 `! B9 {) S
end
b2 G# k E2 n0 ?7 y7 x
4 F9 b4 }6 {% ]7 e
. ]9 q) P2 r; y2 I* Vn=1;%同样的while循环
) D% Q3 B {" D; d/ G6 f
3 H- o6 e& X8 Z" O. j" G" K8 s4 X
2 w# R9 J. |" b4 {0 mwhile n<6
& C. o: x3 E2 ~: P9 X1 w( g9 w- P+ Q7 v' I$ c" s
* {+ {3 @' E {& g' s" j( Oif Black_num(t,n)==0" T0 r8 N2 L) X' l% T, v
& i5 e% L! S3 d0 x4 V4 h
1 z$ G& v* h; a! b0 r: {! Bbarcode_M(s)=0;& m; j+ m$ o4 G1 g
% K! Q, p& h" j" ^, T0 z, q7 u9 M% Z( y, ^
s=s+1;
, Q9 u3 E( G' M2 h( `
( P( X1 `* v+ N! n
H% _4 m* H. s6 \; E# `3 Gelse, c! S% L+ V# L4 J$ c
9 Z" H% f/ H0 K; {
" n1 C) t& P( Q+ vbarcode_M([s,s+1])=[0,0];) w" L! w$ r2 r
% ~" ]# M& [; C* Q5 }8 k8 ?8 P( |+ S. K2 l) H0 i0 k
s=s+2; u0 Y! D O- V' h! ~% h
$ \4 w8 `+ M6 f9 S* }) `4 f, M) Y. r; }
( D9 d* t5 M& u& r- g
end
% M1 R) _& c) O( i3 s; k0 U H$ f. r9 A: e
2 c( D, g1 O* z8 f$ r$ e4 w5 c8 S
if White_num(n)==0% u( `, W6 ]5 ^1 g% b ^! I
+ W5 T ^: S1 p1 i+ r
3 p# n9 |! G; E j* d# M$ |
barcode_M(s)=1;5 t" w2 t$ Z% r. m) Z9 b' L
! g& H' y& L0 _% v4 A4 H
0 X* X. F# P0 I4 ws=s+1;: Z0 G& Q+ z9 w* t
% U8 g7 z2 a5 N5 f
8 l+ w) B& n, J) Eelse
/ l' G \- z" K4 l9 Q$ ?# q* ?8 _% W U( s; m
1 P; Q+ b4 Y% Q
barcode_M([s,s+1])=[1,1];+ \' r# g0 ^- {* b' g; o* U8 e
k: C% [! g- D7 D% B' ?5 [5 ]7 F# _
s=s+2;7 y9 ]0 _1 V4 u$ W
1 C0 x+ H; l r# }: j% f, o& o5 o1 i$ x6 g
end
8 d* b5 j6 ]. a0 ^# I. i7 Q8 c ~4 L0 }# ]2 J3 Y
5 c& D2 O4 L1 R0 A$ @. }$ t; |9 ~
n=n+1;5 w8 o5 u; V' ^! O3 |$ u
9 b3 m8 {! e! M' m, g9 l5 z& _+ ?4 @1 B
end7 P: Z% D0 b' z( V( B$ r1 W
- C ~2 Y+ t9 l! t
m=m+1;! K( d6 y) e2 g G, j% ^
5 h# Z/ \: o& o: _( X% a/ `end
( {; @/ M% G( F4 Z, h3 v( ^& X ~) y& R) s
( j1 L0 V# V( G0 a* }) X4 V( ^7 q* I
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
/ [9 H' `, e1 C/ f! z' Z8 ]7 B/ R$ e; `4 e; d* K% a1 \
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
( q, j9 u8 P( s1 |2 D
8 W0 H# \) b! M; t6 K8 vbcode=bcode==1;%将数组转换为逻辑数组(Logic Array)/ P7 P( n( E4 U
5 r' |0 u2 w4 Z+ N8 Y
imshow(bcode)%显示所得到得条形码
9 a# X' p, E0 W) t$ h9 u- K5 Y; E
+ S6 @) G l- i4 [%然后可以自行存贮得到的条形码
7 [7 n0 ]! Y# t0 T: f& K: G- p/ b! v3 r5 r$ m
%然后用PS等工具得出具有自己特色图书证啦
, V5 ~+ ^+ ^3 S6 K# E b1 G- Q ]# p9 _7 y+ c+ F, S
& T; ~' S/ n$ i7 S. Z
|
zan
|