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