- 在线时间
- 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系列之——某校图书证条形码制作
% l1 o/ e! T9 k' f% r% N! N" F7 K8 B% l7 ?6 m3 s$ i
小谷同学 2011/9/25. M ~, Q; x2 e
. R* p# F5 Y8 m: x. Y. I5 L* Z
摘要
, Q) e7 E4 b- i x. [3 R
; b8 I/ k+ f% Z. r. l( f! \关键词: 条形码; a$ P5 ?1 M5 E! O' A
3 f9 W% V8 r, m; y6 i由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
% O; C8 k. X3 V! c5 i
0 b7 o* F [1 a4 c5 D7 v3 m目录/ S; G1 j& G \+ O3 j2 a
5 f0 w, Q; \9 b4 p% Q1.某校图书证编码规则, n7 } P M* {' h
8 W: `# h: ]! L4 G2.条形码制作的过程" F* _1 M/ p/ Q# u
; m/ n6 E$ ]8 j" w) Z2 W: ^
3.打印与测试
* t5 l \& N; f6 n' ?" l
( g1 T- w5 k5 i4 J% h# e: V4.扩展应用6 g: y* ^9 d _7 t
! G5 }' M( j8 O8 z1 `5.关于本例的一些思考2 G7 z! g- z( D6 Z* L
. P8 e+ j% A% J' g8 M$ n2 \+ m
6.免责声明与使用注意事项
6 h/ N$ D. V% m. o/ L! b# s$ B
5 t3 b( P7 W0 a5 p: E7.参考文献
) m ~) Y; M/ P' F, L+ T4 N" B+ b, l
8.附录
}/ a) Q" o* T1 n3 b$ v6 L; k9 ~: R/ y2 d3 s# N1 t# z
! ? p, q' M% Y1 {# N9 D2 w( G3 y# z$ o: d& A% ^
9 F8 o" x$ @1 q+ e2 v) V( Q条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
D4 F9 ]$ T, Y1 V, Q. @! |4 u9 z
* I1 L6 V2 w" {' Q4 d- U/ \在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
8 X( U5 o- i# C& t8 u( h! z E; G& U$ O3 ]' B0 j
1.某校图书证编码规则
5 q/ p# V: K- B& i) f, i+ j2 ?. K5 ?: b; ~; `
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:+ j& s6 \) b$ e: K9 f! w% G3 V
6 P$ ~& u2 g6 D: R2 D, c" v+ F①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。0 M/ G+ \* L! }( A& v
n: |* c1 x9 b' U7 g9 B
②图书证的白色条码都是一样的,分为以下三部分:7 o1 g$ w+ u3 {7 Y1 V
/ o' M8 T; B( B# P( J
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。- n7 R" A$ J i8 o" ]
+ e, S. S1 k) ~# q③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
5 ?% T& c/ ~1 W, G" }
9 q q% G" B% y1)起始部分:00110;# x" s/ C, X1 B% i5 @% V, D5 ~
0 b( g+ s% u+ M/ n2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; 8 [/ o! G- b; _5 J: A
2 D# ~ x: M4 x( V表一 某校图书证号每个数字对应的代码/ m! S& E/ X: g( x% c2 j. T
9 K1 X- f8 L, n
数字 代码 代码数字来源 数字 代码 代码数字来源
. K8 s; f G. A/ }4 z# Y) H$ z1 10001 1:0001 6 01100 6:0110 ; H* T( h: z \# `' I* |/ k
2 01001 2:0010 7 00011 8:1000
1 |, w" f1 M# P1 j; ^4 R3 11000 3:0011 8 10010 9:1001 & n7 [2 `5 m0 ]+ k% C# T
4 00101 4:0100 9 01010 10:1010
( p$ S& u4 ?0 f0 ~, V1 }5 10100 5:0101 0 00110 12:1100
2 P/ g( B/ Q( `* z f
; D# i6 u$ K7 ]说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。- D; U; `/ d: ?) B6 E! j x) g
`7 \& E. `" o( o5 I/ u+ e4 [
3)终止部分:00110,与起始部分以及数字0的代码都一致。
/ {8 s# o# Y$ S+ g! Z5 Q, n, e
. h. R3 r+ [% _' c9 d; w2.条形码的制作过程
& W @: E8 M4 E$ L& s G8 ?, h! q2 A. T! n b
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
4 ]: J8 T. b& i$ s2 _
5 T" u" u1 f8 C定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
' R' O4 Z R4 j9 T4 I- \) W; q7 ?
* _, C2 v H: @: J条形码效果如图所示(程序代码见附件所示)。/ H0 J- I" G4 g! f
& ]2 s8 R! i( c& @9 a7 [9 v# E
图一 所得条形码效果图1 R' u+ w9 t5 H7 `
) _4 J T* D! y7 i Y
3.打印与测试
! d$ D. T" A2 M5 \7 v! {( y9 i1 |/ A3 }9 w! L3 `
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
% o9 `7 n" n; D. Z1 e/ d
! b+ J6 E5 `4 ^9 E: [因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。0 K& Q" H* U1 U2 K, z
6 F e8 x; ^/ n& f9 S$ ]6 I为了方便进行测试,本文打印出不同大小的条形码。* [# a/ {, A1 S4 E
* R8 i+ E- u- N, E5 z& w) e
测试一:将其用透明胶带粘在硬纸板上。9 I' ]- g. o4 c" A3 w6 a
" S8 |0 y9 a+ |$ b* X
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:2 R3 g. r7 v+ \# T- w$ z3 h
( W' |( o9 x0 v }: z, j1 {图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
S3 t/ Q V- z% X# _2 y
+ ?5 y, P8 |, j测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
/ W I5 o: H$ ]: A0 s. {! o& U$ V* ~
效果如图二所示。
1 X* g0 A8 ?4 y2 P; x! H7 F- x! A$ V) s! `
+ F9 _% s) I1 W; y' a
图二 打印效果图% w1 G$ d" x) H- j0 Y6 e
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
2 @" N8 c+ u: Z3 G4 a
, ^) C7 S2 Z* F$ C l/ {4.扩展应用
6 p8 {: l) B' S& b9 k( d! G) I$ z" ^; B# s: f
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
- ?, i3 Q" s5 _$ @
/ {/ O1 W1 G/ I0 L( V
图三 可供彩色打印的图书证* t% O0 H {3 b, I# u I5 Y
) b3 R) t/ K' {' F {+ t/ I2 Q过后,我们会给出相应的网页版、C++版、VB版等等。
6 f" O' s S+ F, R" }( y; ]2 K( {5 f& c! }
5.关于本例的一些思考
! I9 {- s! Z" w" Q; R3 }
6 G( I- W/ ]9 y) n- T; \由相关文献,可知条码技术具有以下优点:
; M. L+ q. w9 m, g1 t- V- V$ D, A& a* Z, ~( m6 x, D
1)、输入速度快;
7 D4 P) C1 t% e( Z: U) ]5 B' W3 K. p4 _( V
2)、可靠性高;5 X5 r+ U0 _' v0 d. q& P! X" F1 ]
; m( q+ e' Y8 F$ G5 ^4 T2 t/ o 3)、采集信息量大;) L' M* O* A! n' F; Z- a# F
, ^/ c5 N3 X2 e+ L 4)、灵活实用;
; S( P- [0 `: @$ S
9 T; i$ r( n7 |8 z5)、条码标签易于制作
: V$ B( k6 a, x7 H* ~* g( N4 T
% d1 q+ p4 s6 J/ ^6)、识别设备操作容易,不需要特殊培训;: H, i6 F) O/ b' j- g
% m; b7 R, e2 L
7)、设备也相对便宜。
/ V$ R0 Y1 ~8 R& G6 e
3 A. N7 T& A: s& T- A M$ b$ @8 h1 ?因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。8 H ]- w4 O$ c# b! ?
1 I- X( I7 x W- Q$ {; t
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。! Q' C& u$ R" f, w: l! A/ w
" ?& J8 r( z7 c; d5 c
图四:常见的二维码0 y3 M# p/ t* C/ H c# u" O
( q. N3 b2 e! O( l8 T4 B6.免责声明与注意事项
' U- J3 A- r- d4 e5 z+ s& Z, G" N* K3 Q
版权所有,翻版必究。2 e# q% a/ t0 f" E( D& _1 ~4 X
2 t% I9 ^! P1 p+ a, G
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。" m7 \$ f2 F" o7 A8 G V( p
6 t- F* { Q; u" u- ?任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 8 h' M) k( m' ^6 ^" T
3 d! ]* ^8 q# b7 M7.+ S5 J/ A/ Q+ N" L. K U
参考文献
) I' x; [! s3 T1 m5 p) T) @& V* e; k7 J( F' H9 z
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
+ l9 F/ p+ \5 i. d- Y
+ U: W# c1 O3 D# n5 q! L9 ?+ ?[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
- Y2 `2 x1 _5 o8 r4 [3 c& @6 g5 ~! @1 J9 B. @8 \7 U( N
8.0 o% A4 n% W6 Y1 a
附录
0 O5 g: @ X1 p. W* w0 z( b+ F" \6 ?! N4 |
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):2 L9 o0 R4 [; [7 W" a: a' Y
9 i+ j" t! x& k" Z, ]%barcode.m
; o* ?" z6 l0 [1 N7 A. W; K
( g1 T7 G" h& D( W! d' O: s%生成学号a对应的条形码
. | {" t9 _9 E' P
9 F1 t, x6 r) B# X' j, p% d) W( n) q%2011/09/25 13:24 BY小谷同学
0 _+ E+ j7 q; B- y8 ^+ u( T! _4 p2 B- b
a='1234567890123';%学号,自行更改$ q6 J* m) k6 n
! {' W$ U- w* k5 \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;
3 z' B% Q. i, K& W
" h$ z; d! p+ ]# l0 ~, u, X2 t6 B3 z0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码5 c: s# k( e' a3 I
/ u' N6 K$ V' |" J* HWhite_num=[0,1,0,0,1];%插入符的编码; g& u/ |& L$ ?# e
0 F. P7 d- O9 F, a4 Z) l/ D0 `1 I+ H%Black_SE='00110';
+ \; r( |' A8 C. \3 G1 s; C0 ^2 _9 ~1 t! v4 \* q
%White_SE='10001';White_M='01001';
8 ^4 s& @# I, b& r& q" w S+ z. H+ \* L: P* j
barheight=30;%定义条形码的高度( \, M& g1 U5 u( t" t8 Q
5 H6 f7 w& t- e0 `" Y0 Gbarwidth=1;%定义条形码的像素宽度 W/ t4 q% B6 T+ ^, H& \% m6 R
0 t5 C; v9 c2 u
6 u3 V! ~" b! v+ u
%可以对特定长度的输入进行控制,本文规定长度为13( z) x) X8 y8 s8 _: _# `
& C. l: o* O- T: K3 V9 I! h5 ^6 Bif length(a)~=13
2 g1 e8 {. a( s2 l" W
# h: R: q. S& S3 f9 i, b6 E1 |, B6 Y4 [3 f5 y, {7 X" G# `
error('图书证必须有13个数字');3 I$ x- l9 v( J. j. x2 }; m) R/ }+ ]
- ^/ U% D5 d- D* G
end
8 O" W" j+ k* o( j
* A; H. [- a( N$ g V6 V+ d( h
& m9 N7 R6 ? k' ybarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];+ D6 X/ D; V0 ^, ~2 `+ J
6 R/ x e! X( X3 G& H$ A
%为方便,直接人工得出起始与终止部分的条形码1 j- }# |& F1 ^2 ^
* V5 M9 u3 Z0 i/ R%也可以由程序生成.
3 H1 r9 f2 {* c) [
3 S3 l6 C8 w2 c7 Z! J2 D3 l) stotal=length(a)*(7+7);
2 k* r- b. _7 e2 ]9 l9 v0 w, N& h: s4 s/ S! l2 p- C* Y0 o) u
%条形码的总像素宽. d7 D: l( A$ K# J
) N1 M8 x- z7 k%也可以不用求,因MATLAB提供的均是动态数组. z V- z V H1 e0 l+ ]) V
C0 g4 h/ A2 [- W" Q
s=1;%计数,记录% x, T- _1 s; @( |0 I5 s( l
7 q* {' n5 H. W/ M/ D: d7 c
8 t H4 i R6 G- Z3 n9 \%由于利用for语句容易出现不可预料的错误
4 t* d0 c$ W5 q: g% `5 X3 E" X5 z: `* e9 R" Z6 a7 c
%大部分是数组的行标与列标的调用问题,于是采用while循环 _' f$ y) ?# I) }
* M% j% Z% W6 L" m( |) r2 C
%嵌套循环,得出数据部分
$ V A6 t. ^! M+ M. k' m3 P, B% n* ~; N$ i
m=1;
/ p j1 ^+ s$ ~5 w/ q3 b( L+ O) D4 L7 j
while m<14
; I! [" @; O, q7 I- i
7 w' C0 e, F) @; [( S0 N4 k0 m: h6 M0 w; M
if a(m)=='0';' y. S3 j" F* |/ ^/ f
( Q$ f$ ~4 Z3 R% r6 M( [& p- g
: G, v3 T% b4 t5 mt=10;# ]2 c4 m8 v& g# p
7 T* `; O" q, \# h/ c' E4 y7 j2 {1 N6 ~* }! g5 M
%若为数字零,应该调用的下标是101 z$ y9 b0 |4 i3 ?3 k; K7 F
5 h& I4 E" u4 q& A" q. u& G0 v* [" U
else
/ C6 c1 F- f, C' o; y. d
2 V' }2 U# x. Y; E5 b; M7 w# `4 R* v' Y$ M
t=double(a(m)-48);
! v" d8 O; }5 A. W( V
+ V0 @" Q. j/ Y8 X%由于输入是ascii字符,转换为整数需要减去30H,即48
' U7 L1 I% q* Y! v2 [7 Y" S( \4 n
) k& ^& T( t. U0 M5 N% A8 B4 B0 k+ t
end: V8 T6 z K- X/ e ]
( h$ y% r' Q2 T9 i& Y5 B
. S* C, H% i% B; k+ F$ Q; {
n=1;%同样的while循环
1 |, M8 t, b! N" x }# H; w! K6 C( Z: ?
' u8 G( c3 g* n% Q$ D0 j8 _/ [% p( V
while n<6
* Q% a" M( `+ ?3 z" }* ^1 N$ V# j: e0 a3 @1 j9 \
, `/ w+ F! A! ]9 f. }if Black_num(t,n)==04 W, |% F+ G0 X: v6 l# p9 K
$ D# @8 x6 A9 B& w, [: D" A. v2 z, |5 S1 O( C8 I
barcode_M(s)=0;
{. l, F; M+ ? `, ^
" w# k5 h. V# f7 Q5 X Q
$ {) L) ^# R$ |s=s+1;
* L& Z, R( v* ]+ `$ r
: M* t- a2 b6 N; J' c e
1 ~) f6 H& @; @: q7 aelse
. g: y0 V; k6 r0 m; e1 S6 W, Q
" O$ R" l2 P) V* `. V; C; X& A7 a) ?3 p7 r$ d, X
barcode_M([s,s+1])=[0,0];
& w+ A1 x( _3 J4 Q+ @6 H
0 W, m, ]! B( n. `4 c) i
& B% q L6 ~0 c0 g, ys=s+2;
& Y" y0 G$ r" U' `" \5 H T7 v4 w% c2 {* f+ U; @
0 f# ?/ ^$ v: Q6 M
end
) p3 H1 y+ {0 n% _9 O0 v
" d* K! B9 @$ ~0 t7 P. j. l
8 Y( V$ ~; W: c+ W7 S! nif White_num(n)==0. {3 E# x3 q! L4 I. h5 H: F
! q' p! Y0 S# X, y! f/ C5 k7 ^/ }" }' v4 p2 k
barcode_M(s)=1;
% E4 l/ h* Y+ R+ ?. W8 _. Z P& D
- E# H# X6 D* ]8 A, J5 o
1 i* k. L' H9 I- F$ _s=s+1;
5 E: @# O6 Z& H9 `0 a2 f& n" o$ Q2 f4 L; ?& E" _" L$ n F" ?
* Q9 J( n9 L3 `) lelse# f: v5 J- g/ ~( r0 ~
t( F/ w) U% C# v7 g) J6 x0 y+ u: x4 w2 W2 [$ C. o2 x) t
barcode_M([s,s+1])=[1,1];* X; P8 c6 _% U: l4 t* t
8 w( X+ P) s& u* {; Z3 \1 k
, n6 e% U+ S7 t: M0 t1 D) D/ Z
s=s+2;9 i: J% W5 u( P5 D
C4 e4 F {5 ^2 L0 i8 y7 [- W5 a( f+ \- n8 U P
end3 ?. i' W& ]% w" d" q5 t2 f
5 O5 u# v! m/ D
* p. M/ W$ r/ J. Un=n+1;
7 V) \0 n- c X! z- B/ J! N3 ^5 A! b3 v1 x
$ h& d: N) K3 p% s0 C4 O% R5 Pend
9 F7 n" N, M( O( \
3 [! q$ z7 x5 K3 Km=m+1;
E' r) _0 y' E! q6 @! v
5 o$ M4 q8 h; k0 [! o* n) J6 Jend) `0 }* u! _) ~/ C1 g5 T- l8 h
- ?' }$ }+ W' {' N! [3 [* H
0 P8 }% `, z; V; mbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];) h% d* p* b7 p! F) c
$ b2 x" W- g+ D! h
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
* J5 X9 p9 j' u" P
Z4 t, t( ~7 U/ Y+ \bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
" R# V8 C; k! f1 K2 c( D; m3 y6 s# B3 r) `( h
imshow(bcode)%显示所得到得条形码& @9 a' B0 \+ |! \4 X6 }) [
, d- ]6 u& X/ y. z& g) z Y
%然后可以自行存贮得到的条形码0 Y1 P7 y9 c1 O4 [3 C
9 P a* B4 g: W%然后用PS等工具得出具有自己特色图书证啦2 G, E! E$ f! G3 C/ t U9 r
, H) H( `6 M8 W: ^7 F
4 o$ A# H. M" G
|
zan
|