- 在线时间
- 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系列之——某校图书证条形码制作
, B7 D) }# x2 ?- S7 j3 ~4 C: c) @( A4 E
小谷同学 2011/9/25
9 p a8 F: Y, y: Q0 B4 K$ d' a/ C! o+ j' `& ^) M) U0 l0 J
摘要6 Y7 O0 |; a( F6 q( O: w
, Y4 I2 K" ~1 y% _" G6 {
关键词: 条形码5 u$ w$ o* {* @6 x/ o4 o
" U/ P: Q6 _) d9 t! x
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
: [, r. z3 [4 l7 v$ Z4 H" j( u4 G' U" \+ ` @/ ~/ C
目录
+ B9 Y, N$ G$ Q: T0 ^/ x$ H7 F3 X) F% w& `" X
1.某校图书证编码规则% {3 V' s3 M# C2 ]7 L
7 G8 t0 I& n+ K; u- ^+ F2.条形码制作的过程
1 x! L/ x1 M4 c5 a: r& O& d! B( _! h2 N# X7 D: c
3.打印与测试9 \0 _0 c, P& M0 g1 y
2 C$ k7 @. i W! d4.扩展应用
) v+ [9 s$ S: a$ ]0 C% v0 Q2 M8 j# @( U/ g
5.关于本例的一些思考
9 o! L% A% V, I3 z& e4 h* J) v) W2 T# @5 T9 R4 d
6.免责声明与使用注意事项" Z. p" I: T+ k) S( c
& a4 N; _+ w0 N9 \; c
7.参考文献- x% J* }# r- v3 ^
0 B# j' |& t9 K0 E# Q% t3 ^4 V8.附录# u$ G* i% V6 ~/ x) Q1 h
! C4 g7 A8 X x1 }1 c5 X/ z* o
& Z. Q! w/ j# J9 |
& A" [, O, T: l+ d( M# [
5 a4 r8 o) M+ L条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
* Z% b% b k& q7 ^: m- s, D2 c+ X, K0 a0 O9 N& `! T
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
w/ {# S2 S7 D: T( b+ f( k' H5 k/ I1 {8 [$ f" L
1.某校图书证编码规则3 l% H' r* |7 t( K" t$ }$ ^6 }; \
( m+ f/ S- P) m- f* ?- ~; {- M
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:3 D: z8 m5 n1 v# R% |1 J
, A. w8 W P: d/ ?3 i
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。4 G! O$ T) \+ g0 v5 ]
; h9 @- b: q& R( _+ U+ k+ `, Q
②图书证的白色条码都是一样的,分为以下三部分:
! z' Z- Y- m4 }+ h5 s, u) s! G/ C8 R$ C; a
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。1 r6 z: W, h) }" ?( R4 y" _
6 ?' q% s: @6 T" X1 C# f- _③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
" n0 n; x' u) e3 x
; a; G V: H: R# G1)起始部分:00110;
# d4 {2 B- l/ b3 `! w3 r/ X7 t. t! j- S! v0 ^8 J
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; $ H) R* [: _) }" Y. B4 s, d5 f; q
5 O# a+ G+ }: P" \! M
表一 某校图书证号每个数字对应的代码
9 M6 A" J* ?3 ~5 c5 {6 t' Z) O/ Q, M
数字 代码 代码数字来源 数字 代码 代码数字来源 % Q8 W! ?# T( O9 L/ b0 E
1 10001 1:0001 6 01100 6:0110
$ d& N' C, q, M4 V* F$ E7 ?3 S3 b2 01001 2:0010 7 00011 8:1000 ) {: `: W0 u3 M/ N
3 11000 3:0011 8 10010 9:1001
3 P: k8 L) p$ Q/ @9 _# _: l4 00101 4:0100 9 01010 10:1010
4 u8 B: q$ v. }4 H: d5 10100 5:0101 0 00110 12:1100 $ q, W' ]9 k i, g
. D) c3 b) M5 q4 K* q, L
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。1 K! N+ {/ a, Y: C
, i3 S4 C4 w, _3 n
3)终止部分:00110,与起始部分以及数字0的代码都一致。# p8 C( L7 d+ X) [
# K$ v9 P: \& O G2.条形码的制作过程
6 g/ I7 n" v, M' x; e: x7 l) }: T4 g+ O
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
- [! M. b5 ?: r
; {7 ]+ S4 R- `: b8 C定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。4 `3 A! V$ k* K, k, g& R, p
& ^1 }, l8 r8 }' H. O1 ]/ a
条形码效果如图所示(程序代码见附件所示)。+ m7 l: b* H1 J7 z# X
9 u; ]/ c" c9 \. U
图一 所得条形码效果图
0 f- H) t7 B( o5 V0 y5 [9 c$ ?; a! ~
3.打印与测试" v& \6 u* q. ^) B
4 Q9 O& S5 T L/ z: c有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
5 j9 n4 T0 r& }* ?$ ?7 x! f
7 a$ a" a4 H5 X! [9 D因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
0 u6 }4 h" t) O& ?
6 c# V" M8 E% Q2 a7 e为了方便进行测试,本文打印出不同大小的条形码。% X& c( A. A' ]9 v- W
/ p# Y* L, }7 [测试一:将其用透明胶带粘在硬纸板上。+ a. d4 u3 h# m7 u: Q/ e
$ T4 B# ^7 |, a; J* N
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
# v+ o, P* N6 }$ W
) M- g9 ]* d+ v9 g图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
9 [0 j7 B+ {" B g/ T4 w& F1 G2 R
+ Y6 e7 r! {6 x6 m R. `测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
+ S* [$ O4 C; u( a( l2 i1 M% G- a$ V( f% i2 V0 x' u `% Y* R3 ]
效果如图二所示。5 x4 E2 `' K: W3 b
- O+ n; A# a/ b& E& ]图二 打印效果图
0 X$ s3 v7 y5 J" ]' [测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
1 {6 B: e7 S" i8 D7 Y0 ]0 J4 `' d) X4 `( T) u( j
4.扩展应用
% h7 D" D, a4 Q1 M# P3 d+ T
. W7 A0 q8 T# Y; A6 ?为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。3 G, G0 Z* r0 L2 N
0 j4 _+ J& _/ J) r P$ f
图三 可供彩色打印的图书证" t+ K) b9 Y! B
z' b1 a5 ~" P1 ]. V: [过后,我们会给出相应的网页版、C++版、VB版等等。
: e9 J$ h L4 E+ n& Y
( ^4 g* I3 Z5 H2 r+ f5.关于本例的一些思考
. T7 B& G. q8 |* f. ?3 R/ B$ Q- M9 J& ?7 s; v" X, b! y+ o
由相关文献,可知条码技术具有以下优点:6 \: h4 @6 o' R/ r( C% E& |
: c( W1 E; q- f: _9 H$ u- i 1)、输入速度快;
+ S7 Z! }# o8 d9 A5 @+ p
8 Y+ Q' a& C, c6 w 2)、可靠性高;$ Q+ f R/ z, ~5 A/ V
2 w4 t1 T7 w& _ v; H" U9 C1 b
3)、采集信息量大;
- w- L( `; s" D0 n+ g9 S$ h( p3 P% b& C$ {7 O0 C/ |# B
4)、灵活实用;
2 d4 t, |& D" T w2 S0 Z9 _! a1 d, k9 h6 G' u& i0 d6 V# u
5)、条码标签易于制作' T+ z7 d0 m" T
1 \$ E0 G" B: D& F' k
6)、识别设备操作容易,不需要特殊培训;
1 S. h: L% a' J- V" K; K* c& D0 Q; A3 Q
7)、设备也相对便宜。7 A8 N9 y0 k8 X( g) T: j U: _8 T
% S( B& V( @6 p ~2 u( g
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
# I/ Y; A( b* l4 P( m) T- ?3 a# R5 r: M" q( W6 t# p" S
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。/ {# P$ ?) c5 d! l+ h6 p! d
6 @% p3 }. b3 r) H$ V. D. Q* b0 B8 W8 ]图四:常见的二维码
4 ~1 ?& I/ v2 Y! [& } i) ~6 G6 V) ~! ~0 v) e
6.免责声明与注意事项6 a: ~1 \5 d6 I
7 T% i2 U$ ^9 ?' u. A版权所有,翻版必究。
: n# M* L8 _5 b0 n
% n. t3 N5 _8 r+ h) u技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。! v; g+ T$ C" _& c
0 N& \$ r2 y' h" X% s, O* o: d9 N
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 4 w, Q7 W: {% x. k) r5 J, V& z3 N0 d
. U$ P& x$ ]: h4 m3 h
7.
+ }- P) E+ Y$ L" L0 `7 y参考文献3 J1 ]( I) b2 K6 x) Q4 B
* g% G7 G9 x2 k7 u. F% a1 ^
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
) {2 q, W Z, d+ d, e! W9 H
5 v" E! @) J6 }1 L) E4 x[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]7 Y! O2 v) O! @+ z
7 `7 f- K3 ~* f" A6 A3 W9 M
8.
' ` v* P0 d- O9 `, q ^7 c6 ^附录 P; h I9 x! t
# \3 i* S h8 v8 q) v2 p$ |* K* Y# h8 q
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
$ v8 I& G1 j. O& B/ C3 x Q5 v) }7 \1 r, O8 B4 J
%barcode.m
_9 N# J$ p# F; S/ ^1 O! P& R% ^0 i: J' Y! X/ W% L1 c
%生成学号a对应的条形码
|0 A# x! Q. J$ g! C6 z+ {# n" S: b5 t3 x5 d
%2011/09/25 13:24 BY小谷同学
+ E8 }+ u N0 b9 i% ^
l0 {. H9 ?. o8 q9 }# Ga='1234567890123';%学号,自行更改/ B9 ]$ u2 G7 j" x( t; }6 V7 A
9 [; W* ?1 d( N' d; X+ |3 SBlack_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;$ J6 [. s' ]) b. g% w
/ a, s3 K, O) ~! J7 m+ P5 H0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
: S/ I* M, Q! @/ u3 B2 {4 K$ w7 ~& }8 b
White_num=[0,1,0,0,1];%插入符的编码
9 Y, ?% |' }8 Y8 Z/ ~1 O
$ p3 z# x. e! m3 o4 H' F/ J%Black_SE='00110';
2 D' `( n4 B; i& N& W8 H' v3 G# Y3 [7 f5 a' f, {
%White_SE='10001';White_M='01001';* u! U1 z1 d: { t0 y& C# [+ M
9 S4 c; D/ s. L" h
barheight=30;%定义条形码的高度& \8 d3 e6 P0 L2 N+ n% F
, a" m9 V) A/ F) {; a8 q2 j
barwidth=1;%定义条形码的像素宽度
1 j% w& N0 ^4 }4 w: @# N
9 m O9 t& b6 k* f% ?: X* x( G$ \ [ a& Q0 q8 Y" ?& P0 g
%可以对特定长度的输入进行控制,本文规定长度为13
N8 Y) o9 l* U% l% D t( [4 Q6 H8 `
if length(a)~=13* M5 J' ^! g: ], Y4 L
/ n7 i5 [; P, [* ]$ Y
7 u2 [% z% C, uerror('图书证必须有13个数字');7 q- |9 m4 J8 W
& [: _ e d0 s* ?
end
' Q" W! K- T: \1 S0 c0 l( K: `
" Y/ v- D& h+ n! K. j) \3 E9 L, W: E. q% {# ? P$ s+ E* H
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];4 `& w3 t$ @% X# x# o, ~ s3 Y
% A9 v* E% d* f, q+ a/ ?
%为方便,直接人工得出起始与终止部分的条形码
+ c& Z/ n" U' `0 y& g/ P1 Q# {. q) A
: }' c& k& I7 a. \8 E. u: F%也可以由程序生成.% b+ `+ I/ K9 M" X6 t5 H
k: \% ?5 F5 \1 J, H3 b& B0 Ztotal=length(a)*(7+7);
4 I9 K) }$ c: |5 |( Q! Q. N) R4 X; @2 i* v% i8 N4 M! U
%条形码的总像素宽* V, j4 d& B% e
: e! K5 h3 ~- o" N7 _& P" ^%也可以不用求,因MATLAB提供的均是动态数组# G0 D5 ?/ P9 y* L* D8 Q- T
; H. N$ Y( ?4 K( m7 K' W( E
s=1;%计数,记录! c9 G; |! o- `) Y. w( y
' ^9 e7 F+ B* k+ d; B9 }8 \/ \) H8 X: R, T3 X! M8 _8 C1 v
%由于利用for语句容易出现不可预料的错误! E6 F, @7 n) C5 C- G+ |- D
2 \ o# b$ Y, l5 I%大部分是数组的行标与列标的调用问题,于是采用while循环4 E" _: J# h; |' L7 x
. g9 |! M% i0 S. m%嵌套循环,得出数据部分
6 Z+ x. s7 E1 `; }6 A( ?
8 ~+ M3 S- U2 h0 ?+ Z5 n7 Wm=1;
# V1 @! W: T4 D1 s+ I g
6 f k$ F2 z0 h& `9 d) w. Nwhile m<14
2 C$ T7 p- T! z) G- } p) O3 R" V4 @& M3 g5 ^2 ?; T* m" D
5 a! U' \9 C5 I4 K. Aif a(m)=='0';
0 b, g3 F2 k B _! T/ A8 q9 N' g3 `/ B% \
8 J. w9 M2 } C5 l! }; R) I( v
t=10;
8 A: k9 E* s, Q* `" L$ l
$ C, B& J' t- ]. |- |$ P' K7 C! k: ^4 q$ J% `: I
%若为数字零,应该调用的下标是10
; `) \7 {5 J% C- R+ u. J& b: U* V$ C/ F9 ]+ n: O. _
' \3 b, V! R# c* r9 K7 E* lelse" e8 S0 m0 O0 d/ k3 Z# s+ _( z8 q/ U
% G; W* X. G: v/ L: S( L, e+ Z
) X# m( R, m7 \, P2 _* m; l4 Ut=double(a(m)-48);7 y5 H7 b; w3 h9 o1 n, b" n: c
. x9 z" g& r6 m* R& k%由于输入是ascii字符,转换为整数需要减去30H,即48
) E P$ n/ @& s
. ~1 T# b3 U! V O+ j1 c5 G; i! C& L8 ^
end
& N; v7 G0 r: W! x
, h: P; [0 V) B6 g9 g' e5 r4 i
, T+ d8 ^+ q( S8 w$ `6 T8 An=1;%同样的while循环; ^4 N& c' x2 r( r# v
0 m+ M" X& y5 R" X
7 H$ m! S& Y$ `. c2 f8 \( o" X
while n<65 L' F& W4 G+ G: P ?! T
$ D8 l$ s2 L6 T6 j7 g
5 z* w8 q# ^4 C, H; O! F5 o
if Black_num(t,n)==06 J) [: k8 n8 b$ [/ S/ r9 O
5 k% a2 N6 r% L9 @2 d4 b- L: p" u) B3 t
barcode_M(s)=0;
: F9 q. r5 t* ^ T! ?+ X
3 m8 ]* B2 A! X' v- G1 t8 I' f7 P4 Q7 Z6 {: @* k
s=s+1;
) u7 m7 Q. B+ X) ]6 d' {3 [! T* M& d8 W9 N8 z9 |% H' j
+ W o6 x& t3 T1 ?1 M
else
( j4 ~3 F0 Y4 B7 \1 z8 U5 d$ | Z# y* y4 v
% e8 L' b, G0 H& i; z8 Wbarcode_M([s,s+1])=[0,0];
+ f5 Q' k% r H! |8 L2 w0 I0 E0 E- }1 ]) W/ J* Z9 E9 F2 r
8 b" q- C! ^" L
s=s+2;
; P9 f& W& q5 X$ Q; C1 I1 H: P$ l) c6 U: o0 @& L
) F7 g* w3 G( S4 q) {7 H
end J1 o/ p4 j* [) Y
9 T1 w; k9 t5 Y3 Z4 j5 B- Y, R
2 p7 M3 m6 G) I" ? `$ s
if White_num(n)==0- u" X; q8 L( Y& C' H1 m' g. e
# h' }( P! W* q9 p: a7 e G! y
% `/ ~7 k- f1 Y) k5 C" ebarcode_M(s)=1;
: p$ @# s1 b ?1 z
2 k! ~0 }/ R# D2 d: W, Y. H! }# X6 p& L! v3 R' E3 ?, \
s=s+1;% k, z7 F) @/ f7 ~) r* A/ a$ H
' k- \( X, i% D0 I6 } U3 |# W' `; Y L/ F6 P9 w
else
$ H3 G d) A8 u! G" e; l* h' r3 F4 C: z( l* X8 {. J
- t! v* _: G- w6 y# r' q' w
barcode_M([s,s+1])=[1,1];, S' |2 [( J8 h$ P: _
) U& d& v/ h0 L8 K8 D! O2 |9 [% }* h) J9 v6 U$ o
s=s+2;
' o2 S% o& o" p
5 ]) j1 n8 ]& I# k3 v0 h* |
2 [, H3 t0 @5 `. Z) Z% tend( ^0 `9 F5 z/ n+ y: ^# P/ `
" v& A/ O# T; m# R( S5 ~% s
$ m, [( _* J% v( ]n=n+1;4 q1 P9 h: W# O5 w( v: a2 u, L* s
' c3 V p2 x' R( j' l1 {
5 b9 _, p# [ N1 P5 Y' x
end" [/ M ^3 P! I
6 y" c1 [) b5 ~" |# ^/ c* nm=m+1;0 Z6 C9 z- G+ S+ J! \, j+ ^$ N4 _
3 M; c, h# ^; I* i; t/ X: dend- y% j4 z+ r) _: O' n1 ]
% Y2 z8 z# X4 b9 O6 X* x
! H X; ^& j. o7 X
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];% ~( f) b* F3 P- d/ H/ e- \* u- s
, e; u6 g5 {& \
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
) `: |% i! e: @2 K
% x+ P ]: _, {$ o8 dbcode=bcode==1;%将数组转换为逻辑数组(Logic Array), Z" p3 p5 a; B, V
. E) k p, {; H6 H; k) simshow(bcode)%显示所得到得条形码) A2 g" r+ `9 G4 w- G- Q6 a
3 L1 g- \' S( M4 p! Y, v, g. }%然后可以自行存贮得到的条形码: H( e. `( ]* J j! m9 ~) ^
5 D1 h) u0 z! z2 F" m# @%然后用PS等工具得出具有自己特色图书证啦
4 u5 y6 \3 \" K5 y
: M4 N8 P5 Z4 {9 T! C4 H3 c' V* F ?7 x8 N# R6 K
|
zan
|