- 在线时间
- 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系列之——某校图书证条形码制作
: D- o# q( u, | P3 N
! z, T- r7 S3 Q6 h# @8 D* [小谷同学 2011/9/255 }, v: r2 F* G
6 ^ f4 v! Y# e, R% ]' Y/ E摘要
( |5 u8 r- W; J. Z$ F
" B/ S& x! F% w" c关键词: 条形码; t# _ [5 j2 D( B; \5 N9 M
D9 S+ d2 @" R. |, T6 x& @
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
- r! t7 }8 _+ `9 [
/ |+ M$ M1 H H; B8 m- B$ g2 j5 b# [3 p目录
1 ~4 G. ?. R6 d( V- R i1 p, {; m) e( r2 \' R# D: O
1.某校图书证编码规则" k# u. \) x5 L4 M* g
$ X' d; v: U, `2 T& p2.条形码制作的过程* N1 K3 Z/ ~! o( }3 ^
7 j( H8 I, [* C; z. L; a/ w7 O' g( u3.打印与测试5 P* p4 y. T& X( _
+ ? e3 o' y0 B+ F8 [' _( T' P' [* B
4.扩展应用# E8 J3 x9 s. P' v% R
0 R7 I) R8 l5 _; x. d
5.关于本例的一些思考
! t+ M! H2 D* C+ Q9 c2 Q* p: B
0 D4 }6 K# M- M: K6.免责声明与使用注意事项, x1 o* S5 `6 I* @
4 v& l5 S0 W/ I* ~4 j0 \9 g
7.参考文献6 E3 ]2 p7 \5 U, _. m1 E: f/ w
4 @4 v0 `6 z/ r& p5 U3 S8.附录, \+ z, O/ N# l# X( B* H
& Z" i; Z. Q) g" p! z- C$ R
9 c/ o) `+ g& ^7 z* O2 b$ d$ n4 X' e$ c) _ y, a0 n; _6 `! r; f
* m( J6 d0 l, E" @7 C g5 b9 y
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
E) @ N6 P0 | [4 a& i) V: }% t( `3 X
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。) x5 _4 j& D) X& y" |6 I
" Z. I' r) O! p: n- i$ b w: Q, | q1.某校图书证编码规则: h% ?/ g) y9 j3 d& ~" [
& Y: g& q' g# V' U- _
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
, I& h; O, i ~& e% F3 D e
6 }6 v5 |5 `6 W4 {% o1 p* Z! n①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
; `/ Y$ |3 z4 r. Z$ X+ e! H1 l* @. U% Y" e0 ~6 y8 [
②图书证的白色条码都是一样的,分为以下三部分:4 `- M* M- q4 C. z. r+ [4 N
/ p) |4 I, D7 ]& `! I4 @5 S1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
& X; Y8 A0 l( [
0 j% _( Z4 J- s4 F③图书证的黑色条码是携带学号信息的关键,分为以下三部分:8 z( U: z, G0 e2 O' c4 C
" O& f" ^9 a& P; j2 u1)起始部分:00110;
- Q, |4 i9 o2 `- g
6 z+ N( r" O" H4 E& D) s2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
- e' r5 R2 c" t+ F, b" c% f6 J. t3 u: R4 U
表一 某校图书证号每个数字对应的代码# a: w3 `% f: I N& k2 w
% C# }! Q" A" o5 C7 p数字 代码 代码数字来源 数字 代码 代码数字来源
: z2 U" P1 R" d' q% a1 10001 1:0001 6 01100 6:0110 - ?9 k; j+ O% e0 d; a! C
2 01001 2:0010 7 00011 8:1000 1 r, ]6 _7 }& ]% G& v
3 11000 3:0011 8 10010 9:1001 4 s2 W) L/ o' A& W: H1 X. c
4 00101 4:0100 9 01010 10:1010 . b) j/ d! p' p
5 10100 5:0101 0 00110 12:1100
: i' {5 J7 W; ~9 D
2 I5 ]9 A& D) C# d" ~说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。4 {! J! W' G) ?9 V- y
* s) p4 ?8 g! n K! I' z
3)终止部分:00110,与起始部分以及数字0的代码都一致。: _0 V' ~9 `& u$ X3 o" Z
6 o l, G2 Y- ~& j# @3 M N* J
2.条形码的制作过程 J3 S" L; o. x+ {- W
: i1 W0 G! P6 u+ k! R) k黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。( v7 G/ b: z$ k$ A
: w' w4 V$ l! e
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
4 s8 t9 p' Q, x' s0 S
& l' J% ~( ?' W9 Z0 }条形码效果如图所示(程序代码见附件所示)。
( d5 t! e- ?7 R* Q; E& C, _
" a* G, Q& a3 u图一 所得条形码效果图
! o1 [- {8 N- b: m- i. ?8 P% {, t- x4 J8 w# `$ ]+ D: d2 V3 r: o: w
3.打印与测试
$ y3 P1 L r! \" h% o5 [ B9 v8 y; o7 _2 W) r
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
3 A4 ?2 t% N& C0 X* f4 `# a- D3 h( x
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
! z0 z' F# h- y6 \# k) ]2 J( H
6 C. V- q i/ x7 s o) u+ L为了方便进行测试,本文打印出不同大小的条形码。5 j, A) i1 L# h b1 H( ?1 I
# z2 N1 i4 ^2 w$ U
测试一:将其用透明胶带粘在硬纸板上。
$ i* H6 Y, I' t( r
. W& Y- |3 W% c) \: t! J7 V1 T结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
( b' r+ i8 N6 F/ z4 M. p8 J4 Z. |) o$ i! ]# y
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。0 r+ e: i; K n* y C
0 D$ X, S. p5 |$ r9 k' x+ |8 w9 U
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
) X% b ` p! F
$ N1 l$ [$ [9 q2 g效果如图二所示。
5 V" a9 E; j: t/ N& I3 C" }
! b+ u- g+ C: G1 T图二 打印效果图$ @1 p5 b* N- |% V
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
2 ^0 I7 ]5 K2 F9 C* d+ w# n; V; B: `3 q* a* i7 ^. ^
4.扩展应用
- P7 n; L. [* a- y6 |2 O( d; ?( F+ {
$ j( q$ ?6 s9 v- e# Z为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
/ i* m6 T8 }# c: Z/ p0 s6 c
+ O% n5 Y1 T4 k- w1 A- N. \4 q$ [; ]
图三 可供彩色打印的图书证- U! n$ c4 s6 y' W6 |% e- y4 _) R
" F# [' X6 ^& E过后,我们会给出相应的网页版、C++版、VB版等等。
5 V* o/ E/ J+ t3 x- V) i
3 L. O" X% y4 Z* V: Y) T7 {% ^5.关于本例的一些思考
) v( U6 P0 _5 |4 I e+ G
4 M( ~- R9 r% R5 R& f1 k+ s由相关文献,可知条码技术具有以下优点:8 F3 o7 _- w$ `: h2 P
5 I+ `# ^8 P4 O& a2 C 1)、输入速度快;
6 B- c, k& u4 x; f/ n1 c( s8 e& e" P& D7 [0 z& p2 m2 X
2)、可靠性高;) }) r: C* z- W. s
: w) G, `. U I2 p( m 3)、采集信息量大;7 O9 c2 ~6 q) w4 _
) W0 ?+ p( @5 W$ c# V* g! ^; B9 i 4)、灵活实用;: H3 h& H3 J7 m. m
. H* p& v5 t5 F1 i5 j0 T* i9 |9 I6 ]
5)、条码标签易于制作
a# m+ b& S3 L- u$ _$ x$ @- C0 g; P( N) M6 e& l& h9 x% X G
6)、识别设备操作容易,不需要特殊培训;1 F! G ?& t% l0 `" K+ P
) {; s# j0 Z1 X# J0 M7)、设备也相对便宜。% C6 i0 `5 C3 |
" i! _9 U3 Y2 C4 h7 u因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
* o& O2 B5 H# I$ w0 O7 C' J
/ ]5 W1 s- {3 q n: G8 W由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。/ @! Y+ `9 {+ l/ N2 E, [
8 [& M4 }) j- `' g6 |8 y- M
图四:常见的二维码4 m8 q8 }; w2 l5 N* v5 a: Z
5 R/ z" @2 X) Y' q0 Y8 e
6.免责声明与注意事项
$ R/ J* L+ _& P8 N F$ H
, v4 b5 u. ~9 b; z3 r0 E3 V; E版权所有,翻版必究。
$ @; F& b* h4 [ f8 J, L' Y8 C2 m$ N% m. K" e; L
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。' }1 c( n& ^( g1 U) C
& s) A2 S& G( k! R9 V& Q/ _任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 + g( u# k, \1 [2 v# u5 V
! ^6 J+ h/ h, s( F; F) n' H7.0 Y3 z) m% _2 ?, B) Y. f! K; @- r
参考文献
. _1 P1 T& B/ [6 ~" n3 b' J1 H$ D$ }( t0 a0 D" P
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]7 o: I7 ~8 ^4 z% R) M% ~
1 l, Z# t7 z5 I& N, u- F5 ~, g9 A
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]; R' b1 b# R! l& E: ?! l
- u, Y6 n9 U3 Y. X6 h* |7 K
8.4 g8 T0 Z& |# {$ I- Z0 D
附录$ [! j; r5 W7 k/ n( w
* x- C Y. ~$ N9 T" D相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):4 J9 Q9 q) C* O: q% F9 H8 H
! ^; X) q+ A% T$ _2 O( k
%barcode.m, D; l3 g& d% K. ~
+ i$ R$ J$ J$ w" ]9 z3 n( I
%生成学号a对应的条形码! a& @ h* @5 D; ^+ `
5 o) I9 E, P. Q* N
%2011/09/25 13:24 BY小谷同学
9 ~/ @+ B; D6 l6 t( E* Y4 V6 l1 z
) D" _! H& Q2 _! Ia='1234567890123';%学号,自行更改 i* v' `$ X+ R. ^" p; p& K; c% X
8 Y! d2 ?& L1 [7 e: a6 c% u( N1 [' GBlack_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;) F2 Q, A% m1 p9 z F4 i
+ \- Y. s, U: S6 t) 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];%数字编码
+ f& ~5 D, S$ M# n# R
2 |- S8 M* U+ pWhite_num=[0,1,0,0,1];%插入符的编码
o; y/ @% j9 t% `( M2 Y% O9 u1 d5 S# u- Z' ~
%Black_SE='00110';
8 e" g6 f8 A, g7 @% ]* A% z9 \' i6 B8 v& [4 w4 |
%White_SE='10001';White_M='01001';
3 a/ [ \3 o5 E# Y% u% F- A5 D s* Q! E
barheight=30;%定义条形码的高度! `% \7 \: E% I
. M$ P/ \3 C4 [ ]# Z% \1 e4 n& wbarwidth=1;%定义条形码的像素宽度
' f1 |1 Z. k, r& a
2 I# S% T% G0 I: O
2 {; C& V& v, E' Q5 T%可以对特定长度的输入进行控制,本文规定长度为137 E$ W$ t/ @- _$ e
5 X+ c/ H# Q+ L) _) O4 I \if length(a)~=133 W1 c* c$ O7 k6 J' }
7 q) B5 o! R3 x, I/ @5 j+ b4 \
4 L v$ y1 G0 f3 {. s" O6 D5 L$ l) i
error('图书证必须有13个数字');
, H1 E5 K8 I' T1 k; |# m3 o0 Q& V$ w3 u& k2 X+ Q/ p
end
K) F3 A8 l1 H p& f% p8 r! W# D& u2 u' c$ r4 f- ?
' f( j+ [9 f4 v: Q4 o- n6 W2 Pbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
: v8 e. U2 O. t" R/ J2 I4 N( M J6 F+ b$ U& W- _9 p3 u
%为方便,直接人工得出起始与终止部分的条形码
' J/ k/ \8 v8 t. E2 a9 }" G5 X$ B) F" x$ h7 Y8 Q( g
%也可以由程序生成.
# t& Y, O% S9 X& v# e. X8 l0 ~ O7 a5 i) W9 m+ n
total=length(a)*(7+7);
6 F/ z4 W% `4 e r" m& h; k. V0 ^ a) }: `2 d4 L4 T
%条形码的总像素宽
3 }. c) v$ Q/ d9 V+ J: D
7 b% Y: b* I: n, |" }$ }%也可以不用求,因MATLAB提供的均是动态数组
" S6 i8 A! R* _( n) A; v4 ~8 R& p9 d7 I! r3 `5 V) o+ {" f
s=1;%计数,记录
1 j) a/ J; @: P p* D& I: |
/ U+ s T& y4 o# H2 Z1 F
2 x% B' C6 u' q0 _- d%由于利用for语句容易出现不可预料的错误2 n$ O4 g2 @+ i& [. L
0 `1 H' f& ?& v, ?1 H0 N. C
%大部分是数组的行标与列标的调用问题,于是采用while循环
( L; c/ S: o; n/ I Z0 F* L* p( S5 C4 |7 [
%嵌套循环,得出数据部分1 Y; K3 S; ^" E
1 ]/ D% r- X, R) S$ A2 l( V/ y7 q$ `. m
m=1;9 K o/ ~- b" i3 G5 h+ T0 ]' D
% E# f+ F( o- F9 z
while m<14
. f6 p2 o3 |! H; ?
* v3 i4 P( t i$ ?4 V) u& t8 H5 O5 y! [$ X) M* |, R
if a(m)=='0';
9 X: ]. ~% I ]& S2 f( o3 f2 D2 U# E. D& }
+ y( @% T% B+ r$ H% ]t=10;
6 b/ o; H4 I# B [/ ~! [
, a- @$ ~. G g8 t
! I* _* W# [/ C%若为数字零,应该调用的下标是10) |$ _& ` I( ?
p' k: n7 v' f9 I2 n: s/ d
8 X3 j& ^6 p' L7 t/ U5 N; C- J
else
+ ^5 m4 y1 @: ~4 s* S' r# H4 H/ o8 @2 x! L( k8 V5 i
( K3 D; f# I7 W/ a
t=double(a(m)-48);. M* @' C6 ^) P- _5 q* b+ n* D, X
p/ A6 O% ]% ^, {3 _5 s%由于输入是ascii字符,转换为整数需要减去30H,即48
@: _1 F+ Q* U8 H4 X$ g; ~" W
2 B1 W3 z2 W8 I! j
" Q. r. X5 I% Z' r( ~end
) e. Z* \) T- c0 g' f+ ~5 ^8 I+ E8 q! `1 r/ k) v- v- L% Y! `
, n* O' Y0 x4 V8 S# T0 {0 k! n' w
n=1;%同样的while循环" U! b* v) h6 t6 ^$ l2 ^- N& M5 x
/ k$ D' Y. \ E D
$ d$ Q0 e3 ]) P. G' kwhile n<60 G' R- B. j) h5 B: g& H. O6 |; L
) h- F, S, W2 {; d( L3 F. H* W3 ]! e2 e4 b9 o4 A1 I2 d
if Black_num(t,n)==0* ]0 M8 f M- Y0 I/ h
6 W& p' \, r# I, |. M0 P
: F+ j% c/ X9 G5 G& W/ }0 |barcode_M(s)=0;
9 h% r9 R/ m" q) f" @+ h& q9 t6 b0 Y) |; E ]
2 r; e) T! I$ ~2 f' E# m
s=s+1;
0 W2 R6 z# D# U2 K& N u! v+ q/ B$ I* w: h+ x( }0 Y q0 b* N `
5 A( Z" o0 [$ }/ yelse
8 k" j( b7 f) F j" C' L+ I( @) A# H+ K) k! ?5 K# r m6 f
" K4 q" F1 j8 K& Wbarcode_M([s,s+1])=[0,0];/ |' o, J# d1 U- h5 K% x
4 u6 J) O9 [8 D& C+ b9 l
" L4 ?# @# v; B# O
s=s+2;
8 E5 q- f. s- V) w4 Z/ L& B- j1 p, q: w- l" T
+ j4 V' H7 J9 i+ h
end
2 L& S; T5 h) E$ X# P9 `3 ]" n* l2 m! O0 m9 N9 v
: S# {5 C4 q; _& I% [
if White_num(n)==0
2 l' F1 S7 M' J7 L. M4 P+ r( v! ^/ w/ b4 V
( N/ y3 k( f# p" Nbarcode_M(s)=1;& [0 ^& W! ]( `0 ~7 r
! t) M2 {' x G. p* S$ |
" c( q, `5 a! W3 R
s=s+1;
4 r) k) p8 P# z
- V1 V$ m0 S# j/ J G
9 [7 N% _9 f+ u' X9 t/ Q, xelse
8 u) }' H4 j9 c7 _$ ` P8 C$ R1 `: J2 s
4 f3 m$ S P, o" a: d; p/ k+ A" abarcode_M([s,s+1])=[1,1];+ u7 ]( W* Z: p9 t: F) D
$ L$ W) v" F0 z
0 Q$ A. `- Z" [& d$ C' G0 e3 R
s=s+2;1 U1 p9 q$ X6 v% n$ z: f
* a+ ?4 A1 A) a/ [% G b
( y. e1 m" x; M
end( M" t- A4 w$ h7 J) h4 h
& h! A- w: x3 ?+ G3 z
- F' M7 n* z: ?9 W$ q, s
n=n+1;
3 M! L/ \& \8 m. m: y9 O8 Z+ h
6 F5 k6 q( ~8 n
2 K; a; K% v) g; }7 q5 U# gend* [+ Z6 [! Y6 p6 X* a
# A( Q' D& T1 F* ?" Q
m=m+1;
4 e/ D9 b# H3 S$ d0 v \/ U# c; [% [- t3 C; f. ?
end" F8 S' N: ^, A& s
& p4 R5 [; a0 d! N6 S3 e7 e5 ^! h4 C4 \
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
& u) R. a+ m0 ^$ P
. m: e: c: O/ Y, K%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
0 P% d) ]" V) w5 O2 |
3 `# \* k3 _9 l7 p2 a6 ^' Obcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
: {+ p7 X/ U9 \) B1 u: p
4 T1 {/ k: i5 aimshow(bcode)%显示所得到得条形码
5 y7 t# [. K* Z- Z& Q& n3 G* B& {7 Q) }5 H' T
%然后可以自行存贮得到的条形码2 ?3 t0 @6 Q6 G" |
4 g4 g* Y4 V9 l6 \ [* H" W2 C%然后用PS等工具得出具有自己特色图书证啦; @( \" ?. f/ V7 [; f
; K: M l0 @ l# S9 `6 h* \! A0 b3 M. U% ^, G+ E
|
zan
|