- 在线时间
- 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系列之——某校图书证条形码制作/ V+ Q* }. W8 E3 k- R
1 }# n: g6 x# D( o, G: r
小谷同学 2011/9/25
7 H. e) m; v* T) v# P7 f
) g8 B" @* o& L' n c/ |( X摘要: {+ X7 C5 U3 V {+ K" S5 k
- {) b7 A2 |( E
关键词: 条形码
1 {+ J' w) |$ x$ y
: l6 n- x$ N4 k' r! [! S0 T由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。7 F" L+ I; `, R8 V
2 l( W, O: F6 g* L目录8 g5 ]+ Z5 b; N& N/ O4 _
( B) X9 q9 r0 N$ E2 L
1.某校图书证编码规则" f, P' Q: n* K
1 b; C; U; D3 C4 U, U( t' b3 [' P
2.条形码制作的过程
/ i6 }: H; @- G! ~9 m4 d2 L' |$ d& {, d i1 e5 q1 D
3.打印与测试
* n% f- D4 j8 B* \; G; ^
1 z S# S% l- J2 M3 T: {+ U# _& p4.扩展应用9 a+ V) i1 h+ ]. l# n
0 e2 x% Q6 Y) n) H; H2 U' K5.关于本例的一些思考; T( ^$ T# k: U* e4 r: [
* a+ Y! K7 \# ] K
6.免责声明与使用注意事项
1 N; ~) Z& j" g, e3 U$ T! _8 ]* _" [2 w
7.参考文献
. j1 e5 y. ]! e, ~* {* Y( F7 S: ?3 Q
8.附录. n. t [+ `( N. x) B3 J
5 B6 _4 u( z$ P; |
* F( @' d" P7 |5 R: s, g# A$ T: ], H' J- J
$ u5 r2 W" o' ^! [6 S条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
7 O h( v# J6 i6 I4 n% v) F5 n$ Z4 Y! X1 ~
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
% G! C, x6 H+ l. c. w: X( R5 q1 `' ]8 p+ d4 E
1.某校图书证编码规则
/ K% e& [; b' W; O) q. b; P
0 J& K, { T& A) f由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:/ d- F+ E8 b6 |1 @
/ n/ I: L* ?3 _( h0 F l①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
7 c9 K. N% u) i7 X# e/ h5 S! ]) L3 f* t1 s* {' g$ M) ~
②图书证的白色条码都是一样的,分为以下三部分:" t8 \. b) U& s N
8 J7 L, n: ~, j! ^* g2 v4 J
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
# M& w% v3 j1 b; I) d
% x8 k$ u5 E7 _8 K9 S③图书证的黑色条码是携带学号信息的关键,分为以下三部分:3 j. H" R2 S! u; r' q7 m# l
/ y7 a' ~3 D/ N
1)起始部分:00110;, ]/ Z/ a ]9 e- l9 v
/ ^$ {5 v3 ~+ C$ P2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
0 ]# I' o( F& v$ M
8 Z5 n8 z8 m) w: }0 A k& m* F+ v表一 某校图书证号每个数字对应的代码
& S( d( T; O9 d9 g
7 d& ]6 b; @! m2 h6 ^- R* ?: @数字 代码 代码数字来源 数字 代码 代码数字来源
( S2 ~( u& s- p% @/ [1 10001 1:0001 6 01100 6:0110 3 e6 F# @8 |) T8 j# S' r
2 01001 2:0010 7 00011 8:1000 ) q4 p. A) `) Z- J2 t7 T
3 11000 3:0011 8 10010 9:1001 + K; J: w; ?6 J" a
4 00101 4:0100 9 01010 10:1010
9 [% v# A: N* m5 10100 5:0101 0 00110 12:1100 ! e: T0 D- c4 L( w& m8 Z# z0 ]
, ^% \; F' D5 x
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。8 u' s ~ M i6 d2 C: ?4 k
) F/ W8 u! m9 @# y' P: f3)终止部分:00110,与起始部分以及数字0的代码都一致。0 A. v9 I8 A& I% h
8 x$ S" O) [) N9 }* y9 G2.条形码的制作过程
& S+ g$ a5 \0 u
. @! ] b! V/ r1 x$ _# O; D黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。! R) v7 O6 b6 d: h* R
) w |1 p) C5 A" A8 [% i3 c4 e定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
& c y+ ^4 R: P2 _) v
7 V! E: h0 x# H: a条形码效果如图所示(程序代码见附件所示)。/ ]3 {1 H( f0 M1 O1 i( L
& e4 x6 W, X/ m图一 所得条形码效果图
" [5 D* u, V4 R' R+ m- V& t
' I! P! W, P& E4 }% D X3.打印与测试
8 g1 n% q) N+ O* o+ D, G4 r. J/ i4 \2 W$ x
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
& T( L0 D; o3 I% v- F1 V$ a c7 |% Y6 d' {0 [5 F B
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。1 Q) b9 I" K. C2 Y; |: @
; @8 w8 D7 U: k Q4 J# d为了方便进行测试,本文打印出不同大小的条形码。3 N, V; ^0 T4 c0 I
: m( E- E. ^5 S0 x( R3 R测试一:将其用透明胶带粘在硬纸板上。6 R. V" ?6 M, Z/ F1 ~# z
9 Y3 m# t& ?- A0 p
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:. e" G3 N* |1 S7 B
' K) R# u# l* G( g
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。5 Z5 c2 L7 i2 p4 ]' A$ \7 H! v
: x% s* S$ ~! ]+ o7 g8 O) l2 o测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
, G5 N+ D$ {4 a9 Z+ z
8 k( C5 O, s4 [( q效果如图二所示。+ j( S- s( ?, u8 z
% O9 I6 u% c r% S9 I7 _
图二 打印效果图) T* I1 _( b% N0 H0 C p- e, A
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。) y2 P5 d0 K" Y3 f) Y3 o5 m1 z
2 s7 H8 t: l5 j% m
4.扩展应用
) n$ Z3 L# e5 _4 ?3 ?
4 W: ~% l2 B! R- O为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
9 b9 S: R) c( I( }# `
' ]% {8 L$ t) I; A' X g9 U图三 可供彩色打印的图书证
4 i4 Y# c( w5 L2 D7 h; y. f$ Z$ }$ U0 H6 F) K' o3 P& ^
过后,我们会给出相应的网页版、C++版、VB版等等。/ R; u3 Z4 T) Y* U5 _! ]! e0 Z2 [
& |& v. R' z7 A/ C) c
5.关于本例的一些思考: l# G% `$ x; S- h" z9 P
e8 z2 L" O# z' ^. @
由相关文献,可知条码技术具有以下优点:
" U7 ~3 @0 l! p: L+ A: v: l1 P3 p: L, N7 b
1)、输入速度快; $ U1 Z( G1 s$ }
9 F9 B* y! P, F6 R7 o. G+ I
2)、可靠性高;" m! ]! p g+ l% G, F; c
9 I# w; h! j( K, y$ i 3)、采集信息量大;& c5 Y$ {9 ]. A
) [' @5 I5 Q5 ^% Q4 m' K. z& [
4)、灵活实用;
9 I) X( \- w; b1 Q+ C) u* Z
3 Z& u& j" i$ Y1 ]* F5)、条码标签易于制作/ v' h# m& V( }$ O
r$ h$ t) N$ a. B
6)、识别设备操作容易,不需要特殊培训;
: `' C# w: S0 M$ s: P1 E4 H
: S" M6 \9 @3 M4 i3 P! F2 v7)、设备也相对便宜。
6 @. n& X1 @3 Q" X c; p# ?# i7 b6 a2 e8 u( g4 |# g
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
( ?) C9 q9 M. X7 ^1 @
1 d. l4 g3 O6 q由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。9 j4 g4 H' {2 R5 L4 h
) X! r4 g, O+ |2 ?7 L# o* `- v7 {
图四:常见的二维码
2 A2 R& X8 x: a9 z% f; t
6 m1 `3 S) i+ m% ~2 h6.免责声明与注意事项
! N' Y# d. @6 g3 t
1 p& n( X, Z% H x1 @! ]' b版权所有,翻版必究。
; M( L' s7 ?; Q: I0 \ f8 `
, O% j0 g! l: ?! K O/ C技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。 \5 v6 e1 o" K3 B9 r! j& w0 C
1 u% P9 H4 k' D! n0 }2 P任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 5 m! ^( j4 Z6 @. `) }
8 d( F, y# W' ?. g& X- V7.
' q$ ?) c. g1 S: s参考文献
( Q0 P# P: S/ W4 I! Z5 c: e0 u9 K
/ Q3 M) a i4 }2 t, d[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]0 M4 w! W4 T4 L' |& q2 m
! h1 L4 h' [" P[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
4 v1 e: }0 J1 v0 y7 q' P% n" z4 J+ s% R1 b+ E1 g8 L# y) ]
8.8 |2 Z9 v2 |! s2 q/ ]2 p' M
附录: \' i, C" f0 z2 `( k7 e7 m* V
0 Y! X% r1 p1 S6 k. x( c
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
3 b$ m3 l0 _1 `* m( y" |, b% V- `2 w" x
%barcode.m" f& i P5 I9 g# |: s9 J3 Y& M
. E8 E! R+ M7 W+ }4 {%生成学号a对应的条形码
' A6 c [2 a2 c: b1 H' S: V" F; a( W, e' n
%2011/09/25 13:24 BY小谷同学
. T8 h# O, k* f. O' W% K( z6 d7 ]" ?/ O- e0 b5 J' o4 E
a='1234567890123';%学号,自行更改
! _, M- ]- ` G- g( K) d1 I" k/ ?0 d2 H3 L
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;. p+ w& b9 I3 y; w; I
( J$ c1 `$ m m9 j! |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];%数字编码, h z$ I+ N/ J. M9 q4 j, b
0 h, \) o5 G, b& a1 WWhite_num=[0,1,0,0,1];%插入符的编码3 ?- K9 q0 K* h' |8 Q+ [
: Y7 V' p& [$ Z
%Black_SE='00110';
, G, N* \4 T( B) q3 J. T/ S G- y
%White_SE='10001';White_M='01001';
8 T2 o1 l, P; I, |
, e J9 R9 `) ]/ {# G, |barheight=30;%定义条形码的高度
$ r; ]! B5 r$ `
' V' }; g7 M' q& e1 a: D, [barwidth=1;%定义条形码的像素宽度
. r5 B% j' D ~) ]; ^" l$ ?0 X
+ ^$ N3 b( P' }. @, u5 O, ]% y' e" p, t
%可以对特定长度的输入进行控制,本文规定长度为13
8 G9 F7 I' \+ f3 P, C( O
B% S4 e$ z9 i2 a2 Lif length(a)~=138 M% o" P1 R( F* [/ Z; k
/ ~- l7 }3 a: D0 ~
. H8 H4 d T6 |+ f
error('图书证必须有13个数字');
2 ^& l% W3 ]8 [2 J. y) b+ B
; F6 s' I7 s3 y: yend
5 B2 X' v+ m0 @3 E" w$ d
3 h; Q) n( J- R% L$ T2 T4 _
# i8 w) M! @7 Nbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
. B( I! f' n) }( {! o5 C4 g3 t' e& v; k+ O5 {5 _8 w/ x9 g
%为方便,直接人工得出起始与终止部分的条形码/ s8 Z+ a4 h" S6 P' i2 F6 U
L) R: G; T; a5 ~- S% o0 z ?( ^
%也可以由程序生成.( w7 Q3 P9 m" f8 @( e3 m5 T" r5 {
% H; n7 K( s4 o; Q
total=length(a)*(7+7);% V) f e a! q* N- n. [. t
, D! y# Y/ ?3 x' {) @%条形码的总像素宽
9 E/ ` u2 G. m3 n. a; O2 p! i1 u. W0 A/ Y2 N% d+ }
%也可以不用求,因MATLAB提供的均是动态数组
4 ?% c6 o3 h# H1 ^% P
. M& P7 E, J) l7 d- U% b& D& hs=1;%计数,记录/ {& c8 L2 _! w( f$ k6 r5 _& I
7 C; Q$ H+ s( c7 P. R. [4 S" ]5 ^" u, f; E [0 M- j
%由于利用for语句容易出现不可预料的错误( @ C# x" z5 Y6 d3 N! G+ X) Q
+ w4 f/ T$ U% W! a$ B
%大部分是数组的行标与列标的调用问题,于是采用while循环
3 M6 u1 d2 _( S1 U1 H4 r# `( z5 T* H O* W
%嵌套循环,得出数据部分( s1 ~! I$ W! p5 N0 p7 F
O& T4 J/ m0 Y8 u/ O8 |4 f$ t
m=1;
9 U: K8 H* n8 L5 t; C9 p: s: v
" p$ e$ |+ j1 J; N0 iwhile m<14
% v4 b. n ?) ]; f8 L& _$ J1 ]$ J8 c$ g4 ~6 [( Z
" h# z9 i8 W1 f: X8 v/ y
if a(m)=='0';: p' s* [" ^. g! Z, O0 S5 u( I! ]
9 j, \: Z- {& _0 A; a
* n; C4 d7 c0 {
t=10;) }& ]+ E( h+ @+ e c2 w0 I
- Z$ d* D# R) i1 N7 r, @
& C, z j# U" ]* |, e& o
%若为数字零,应该调用的下标是10
6 i5 l4 W2 O% t" o* u
% R3 C5 o% }# F0 _ x$ t6 E( l# a9 H; }6 a; S
else/ y! H( E) {) t; B# m5 p
% C$ z0 \/ j6 O. {* m7 k" {% c! g% u% h* L5 W3 i8 ?; ]
t=double(a(m)-48);
% Q* n r* m. r$ P6 S
5 m R( F' u4 w; z6 O% U# O%由于输入是ascii字符,转换为整数需要减去30H,即48
% D9 [# X1 ~ n$ I2 ?: Z
/ W% i5 c5 `6 |$ ~; L4 A% g- ]5 \8 O- x B, H/ `
end3 H7 j; ^1 \! p3 C0 V7 K9 E! L2 Z, L
0 U& X; Z* I9 ?: P2 A* N+ S
/ e% q; F' F1 @$ j7 P3 k
n=1;%同样的while循环 {) A, i' O8 S
1 @* t7 O2 b3 D
8 Z! A1 J- q) T: Swhile n<6
0 z" k: I/ @, p5 a8 d4 t9 N6 ^' e0 n8 g$ E
2 m! Z+ a5 X3 X
if Black_num(t,n)==0
9 q7 _, x/ J+ J t* k
$ v# i0 F( k# }& U4 z
6 e6 C3 g# n. Z: }( ybarcode_M(s)=0;
# m+ {+ P% J/ u, |' E
" t( M( v# _4 {) E6 H- b6 D$ y: w+ f5 V. Y4 B; c4 B
s=s+1;# q3 `& y" R5 ^
8 b5 O& K, a L3 r6 t
& q+ ]' r" c$ P2 L
else4 N8 [1 h1 V; a1 D* K' ~
5 l0 N3 `# [9 ^: V: |+ |+ e
; t8 L) W4 q1 u' n. k# G, sbarcode_M([s,s+1])=[0,0];) d3 P& w1 f/ y; g
/ O! O% [; G3 M4 _2 F% K; y
; G; P- l; G, P H5 `# A8 K' h, e" Os=s+2;
% r2 I$ v5 {5 `8 J9 `5 y1 V- | R/ @: U' W& C
Q* G8 O5 \+ e, a( S
end
, I+ g( I- D' w6 ~# J0 S3 ]# ^
; [$ l6 K& `+ D- F# b; r& c2 G
2 q! @0 M! h, |if White_num(n)==0
/ o, ? u6 f# o. N, f6 b/ p
' R/ n, l/ W! w2 U. {% e0 A1 }5 M- Z2 b" F6 m6 U
barcode_M(s)=1;3 o6 C" h: m2 u2 m+ S" T
o, |6 \% s i! B* |/ ]. D
. F) U N7 t7 @5 T( p# @s=s+1;" z; m& d# N4 E
( q7 ~6 y7 }8 U# c) x: V% B/ e: K$ d6 S% K
else% e C+ R7 B! `' m! X" R
5 ?- L& T3 b8 }6 ~& b0 E D) n, w% r
barcode_M([s,s+1])=[1,1];7 L0 w* j( h8 K
+ M6 G% H# ~% j. X1 t
% \! r; y6 k& ^" t4 z
s=s+2;
* m- J& _. U/ W- K! V
. x1 L2 g/ Z8 q# f9 D
, Z: W! D% s, g5 i0 B9 wend
% N( [ r0 R! _6 p5 c& t5 b9 @4 \# Q- a7 r0 O+ |9 W' @& p# d6 L y
3 n# b+ }9 w, u0 w1 |, d/ a% A7 ]' t, An=n+1;
# L# o/ U4 i, o, I+ t8 a& g) U5 p& ^% i7 \: n |
n/ ?3 G# @( V8 z: |1 E2 G6 l* i6 _8 I, `
end
4 H w) ?6 X2 e8 W: D- I
3 B$ V ?9 v* y7 m' P( w: w9 Km=m+1;
" }. z5 d+ G4 r, \9 L P8 d) x3 a5 _# |: @. U. v# K8 i
end( T; [- j; ^' `1 E; V2 L! _" @1 c
+ ]8 p2 U l4 j- K' P! C p8 y) ^
$ l8 e( l$ v) D" l3 l( pbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
. g! \; V$ r! z- x* O( D( ?# y: R9 D% K1 Q/ X
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
5 Y/ C6 E) v F# E: S- u
6 f8 Y3 l6 e! t/ V( abcode=bcode==1;%将数组转换为逻辑数组(Logic Array)8 o# i. z# \" r$ d- y |
) b g% E& p8 |4 gimshow(bcode)%显示所得到得条形码" I; x9 {5 q; }/ @1 B( V
; m0 u% D5 C' w7 Y# }7 [! p! d
%然后可以自行存贮得到的条形码9 P9 T- Z2 K/ X( C
8 i! V; x1 J2 k; F%然后用PS等工具得出具有自己特色图书证啦" B0 `- n U/ G, x2 ~9 Y. n
+ U) @" i) I4 @+ \9 }) D0 r( m% c5 q% Q: e8 J6 K
|
zan
|