- 在线时间
- 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系列之——某校图书证条形码制作* ]1 ? i) v: Q1 u/ ?- n/ n0 y
- M4 e2 ]. H& l: V3 _* v. l8 [
小谷同学 2011/9/25
6 F# r# L+ j! \2 Y, Q* ~4 P# P3 M
+ [: I% n7 y" a* T摘要
$ L# U4 K, `; I% U, s" Q9 k0 U2 M/ F- V0 K1 \8 M
关键词: 条形码+ h% r' f% r9 q9 l, t3 Q6 i4 I8 W
- P. [2 r7 O' q3 D0 D" _7 U由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
; |3 Y, K! f4 o5 L, H/ B$ @; G3 N0 _. f# B3 u: z- T( L4 I* |# z; {$ r ]
目录
5 e" \/ _- `3 ?" y0 f# W! {
* O& J$ Q: i" Y9 T( h. G7 s$ z1.某校图书证编码规则8 L0 c9 ~! E, x* F! x
. e1 _' b- l+ _' k% w& Z' u2.条形码制作的过程
( i5 g9 v. P L, h' M/ U
' t: ?% e1 E7 z! ?6 \: V0 {3.打印与测试
& n4 T- `0 H2 ]7 ~0 c; r0 v7 l6 T% C' T- O' g
4.扩展应用" d* I% r- o3 M& m! g t M
) L: F& M# P v: J+ z+ i5.关于本例的一些思考# r: Z4 @9 _0 J2 R h/ V7 B, F
$ H5 a; X+ d$ t5 l* e( E5 C" }9 |6 q
6.免责声明与使用注意事项* b# r/ M. M/ L9 q( X* |
! D# i( Y/ S! Z& p% x X7.参考文献
( W r" D* U4 Q7 U0 k$ J5 f( z& I6 p# F! I+ j
8.附录
+ U2 ^/ e: @+ I2 b) S5 |) G2 }5 V) O3 S1 i4 G7 W
' _+ F: o- @5 V6 d
e2 ^; M. {7 i+ c. k7 Y
% a# [8 J9 d4 n! w条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
2 G8 u5 z: ^. W& @% O% [ y, ~% i: s" n( X. D" { {" k# e: o
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
! X# M+ m8 F3 ?" D8 d
0 x" J; w4 g0 `! Q: p1.某校图书证编码规则
6 | p+ t( r: V+ m4 w7 N& J0 B2 q
2 {! C/ o1 {# `9 E8 } t) Z+ m由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:6 q# `3 @* {4 P, ^- V
3 h' k% R! ^0 c& s% V8 c* x①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
m0 T; r4 z& j. U% i$ O2 B5 w/ e
! u, @* g8 y9 N3 B# u$ _②图书证的白色条码都是一样的,分为以下三部分:
6 n7 p7 S' n0 h$ @) S0 p
. o( S. e) Y# |, v* I7 w1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
6 @, g4 ~# }$ M& K7 A
! ^! T5 E5 R, s2 c0 g③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
* p3 d/ i0 u1 ^
# j, G5 ?) {6 X0 h1)起始部分:00110;
7 B, I" Q. @' I
h: \0 H2 O" ]& e# h2 C2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
& b5 n0 j% D6 Z7 N. t$ M. N3 u* X- [2 L! F9 n
表一 某校图书证号每个数字对应的代码
7 k9 G! r$ l5 E9 L2 E! {
& ?+ `' _2 n4 m, H4 y! i }, b数字 代码 代码数字来源 数字 代码 代码数字来源
% V0 e$ g/ o- x8 ~' `! f1 10001 1:0001 6 01100 6:0110
; V; T1 c7 S1 ?" J+ H; ^: [2 01001 2:0010 7 00011 8:1000
6 o/ `$ w3 k" k x4 c2 Y3 11000 3:0011 8 10010 9:1001 $ o ~) O, c6 \* U) p3 L' k9 }% K
4 00101 4:0100 9 01010 10:1010
0 z5 f$ {9 x9 D% M/ w5 10100 5:0101 0 00110 12:1100
0 G2 h8 Q1 \+ L( M. i$ y: l7 z* p* ]* V+ X2 X
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
( |6 v$ P; F5 @$ R' M6 i$ t$ U
& ^- @$ A% y3 _) |( f2 D3)终止部分:00110,与起始部分以及数字0的代码都一致。
$ @) t O$ Y; J/ {
) g4 {, w. s% _2.条形码的制作过程6 l2 U0 u) n1 Y0 y$ b" p: `
- V; m$ @7 o! J6 N* |黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
( g1 z0 y1 C8 G- x3 C7 k
, i/ M. ~) w$ F$ y定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
* w" Z9 K7 K' ^% ~+ }
* B8 I" f" N7 d7 E条形码效果如图所示(程序代码见附件所示)。/ i2 L0 ?1 J# L Z' ~
; N9 r; \+ h# z+ p3 e图一 所得条形码效果图
0 w' V9 q5 T5 a& w8 w+ ~0 i$ J. m
3.打印与测试
' T6 L8 Z1 ]9 v1 Z* |
5 u) P2 D" i/ ~0 w; M8 {有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。; W, V0 |) w: b2 v6 n
% q6 ^+ W' `4 h0 h; E% T- z因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
/ q3 n; D4 D) `3 D, D- ]7 F' b4 b4 f( U: K
为了方便进行测试,本文打印出不同大小的条形码。# u# C; g( }2 k1 A6 q5 Y: y9 Q
# O) Z5 i6 f- y& U9 Z% g2 C
测试一:将其用透明胶带粘在硬纸板上。/ i& Q. C. f1 I- ^1 c6 a4 J; ~% y
) t# G4 ~8 \& i( b6 p8 E4 g
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:. Q' P' `8 G l& N1 \" i& f
7 l6 `. N p6 \6 i' \5 r图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
, v+ J5 J9 [( Q# ?$ r- I& I$ [' h& H9 c) o5 v
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!+ z, J; q- V7 u1 a( Q" U' [8 U
! z4 B2 s( J. W' O6 y# u! v4 {
效果如图二所示。9 B" t( S0 Q4 ~( G( w* G
: R. s; F! D. r1 }, B
图二 打印效果图
/ d: c# }3 p8 L测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
8 m* V4 J" [" o: J$ t
8 u- M/ N/ E$ P5 t1 q4.扩展应用
4 d* g1 s4 Y$ S7 ]9 c& |1 a' |' ]
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
" \2 @2 y. f) C
' x7 R3 g$ j8 B+ k) n! z' Q
图三 可供彩色打印的图书证5 t( ?* q% c n" m! T0 [" W
L' ^+ x& W2 T' q' N1 k, H0 Z' S
过后,我们会给出相应的网页版、C++版、VB版等等。2 O' D8 s- U& f- `* I# p
- S% c8 P' z: m! A
5.关于本例的一些思考
1 Y2 D& C: A2 U+ q
( {2 g, H3 B7 S7 }" y由相关文献,可知条码技术具有以下优点:. Q$ b5 V& [6 _) Y& l1 o4 H& B
' q% [* p ?2 A 1)、输入速度快;
8 z" c1 S) I1 G Z6 |
, z3 _/ }2 }) H' q0 |4 D* C) ^ 2)、可靠性高;
8 s! Q& O# L/ C6 K, l7 I7 ?. e- _4 `8 d
3)、采集信息量大;6 b5 o, F) w" w) Y- V6 l. Q1 d
9 N, t2 `* E9 e- o( R! l
4)、灵活实用;& G/ ^. ]. c! O) `1 @$ v3 a F2 v
; o: o' N, d8 ~9 Y$ u
5)、条码标签易于制作2 A; J! s- Q- i1 ]2 ]) J* y
) H3 _& z. y! ]( x3 |2 b! P6)、识别设备操作容易,不需要特殊培训;
% M8 O3 Q! U. O' b( F- G/ S0 O
7)、设备也相对便宜。+ T& g* s0 c, i9 i$ n/ H; C
. G7 d( s3 g* e- [$ m& s$ v7 Q3 V7 w% Z
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。' |% H" g) l5 i4 r& k! X+ h0 U7 B
7 Z9 R( N- H6 _. _5 i1 p0 \由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
3 P0 k' D$ h2 W( A$ H
' m1 m. r: r2 _8 {2 i- M图四:常见的二维码
- P9 G5 V0 o- b. e1 a( x6 B/ M1 ]/ F# w& ]. Z4 _
6.免责声明与注意事项
9 C6 }2 c3 M/ Z9 v
4 V2 ]: ]4 G( K版权所有,翻版必究。1 q' x4 t a- R4 S
/ P$ ^3 }6 O6 o/ p8 C+ n P# ?, @技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。3 }# z% ]' d* Z
+ f7 Y! u6 e0 l$ x C任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
. i V9 W. F& ]: w, b& R& }
5 j$ n5 i! w5 b7.- O1 M5 o/ @, l" L- n. u" v) D- @, q
参考文献' q$ i0 Y) @9 q
! P0 b% w8 R5 V `7 c5 K[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]; `# o8 i7 x" @0 A$ `2 A
; T. K% z8 h: \& J! _
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
, o5 e) z& k8 G. ^1 X' C1 J
4 S0 D+ L8 C* \ W; x. W, q+ X8.
" o+ ^: `5 R, N# [+ F* x2 y附录9 F0 @$ j/ N' L6 U( i$ R
2 Y" m9 Z1 V1 Q' ~4 |# O相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
7 K: [ w1 o6 u# y
5 K/ ]' R& g! N9 t: D%barcode.m) [; `, |0 H2 Q! l2 c. E
. i5 ^7 A. [5 y* @%生成学号a对应的条形码
0 a1 ~8 n' [9 \/ f
4 g5 r b: a: B+ I* l, V%2011/09/25 13:24 BY小谷同学2 h g7 f7 d: w* d" l; l
& j' h8 a% z) E7 q/ {a='1234567890123';%学号,自行更改
; L! O) v" l" w6 M& ~' l% T5 }' _, E8 U! {3 r+ 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;/ d& H1 O5 g) ~% c) J1 s X. d- N
& y# ?0 E! k7 e6 X0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
/ i# s, U- C. R
+ ?4 \" P* {: w/ IWhite_num=[0,1,0,0,1];%插入符的编码; _+ t& l: n! M
' K5 \$ n1 t1 @- J' R$ I0 h7 b%Black_SE='00110';+ f! M" i ]$ I" N
" s; ]# \% h% W0 s, Y g# [* T7 ]
%White_SE='10001';White_M='01001';
( v' O$ s: ~- ]: ]! C$ U6 C3 I, a4 c% }6 H- G
barheight=30;%定义条形码的高度' p Q D8 G/ |9 j8 \
4 p: L* ^' m. P1 Q4 `
barwidth=1;%定义条形码的像素宽度. u3 L7 h# i! b6 d! ~* {( N
: e b& G( u8 q1 c" O c8 w5 W6 C' W
+ T, V3 v& v6 w) U/ T3 u%可以对特定长度的输入进行控制,本文规定长度为13
( N) h# ?% N/ Q$ X9 _& u
7 ?) Q5 \8 i8 \! U- \* n( l; Y Fif length(a)~=13
8 o7 ]2 E* X5 V- {( @: _8 [" Q
/ e. y4 ~2 G" z8 ~% I) E
# a4 l! t L% Q8 Aerror('图书证必须有13个数字');
% \ R3 r! o9 W) d* \* e
5 N6 g/ d# x2 A+ Z3 tend6 |$ _, S/ v3 L- ]7 D
3 J& Z! c6 _& n% f; g+ q' s7 C
) q7 n+ L \. E( F4 |! a3 O1 [barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];* N$ O$ k7 g j9 d1 J8 s
' t3 C3 k( c- M9 O. [%为方便,直接人工得出起始与终止部分的条形码* C+ P2 V0 g4 p/ f. J
) O' N, ?% |. {) R* }: J/ b
%也可以由程序生成.# y* L$ N( q) ~# S2 T! a2 ^. t, V
. x; r) f6 k; T7 E0 @- ktotal=length(a)*(7+7);
* k& B8 R% n1 T+ x+ w
7 [# \6 c. ^7 O& g, N3 U {5 S%条形码的总像素宽5 H4 v6 Z- s( K0 s/ {( x, z
) K4 k) T* v( S9 ?0 |%也可以不用求,因MATLAB提供的均是动态数组- U4 @, Y' \ S3 u8 Q' z' ?9 K
$ S( o* v; j) D8 K) xs=1;%计数,记录8 U4 f; Y2 C* P1 G( U( G4 `) }* `
4 N% T9 {9 d+ p/ V1 M; g
. r: N/ y, O" Q6 A& _) ?. Q%由于利用for语句容易出现不可预料的错误
$ C2 C! Q x) X1 D+ `9 p+ Z' a
! l4 @/ o4 c! L7 p( i$ {$ ~%大部分是数组的行标与列标的调用问题,于是采用while循环
: e" u* c# A: d% c, G Q P; Y4 P) O, n) C3 @, s
%嵌套循环,得出数据部分
2 u, N" D% s8 p6 ]; g3 }# q3 k: A6 s* }
m=1;
. k- p# T" z& H- z" o. t0 C
0 x( k$ y! ~9 N: h: |! J& | Iwhile m<14 4 Y# }+ @. ~7 [$ x
6 ^! x# ]9 M$ Y% Q' D9 z: X
' v) N0 K% S) N4 _% Jif a(m)=='0'; ^3 `3 @0 [" q) L; w$ e9 f! g
. J9 U2 @( b! j
' j$ v' M( l/ c* h3 z! ot=10;
. i8 \. ` \* Q; D7 M5 ^6 J1 q' b8 q. S
8 j# Q, p7 r9 }8 p# `7 e/ o! t( Z. I
4 x6 l9 w- @- D z4 E) b _+ @%若为数字零,应该调用的下标是10. M/ k6 s# J/ V! P3 I8 a
* N( O2 [& ^, j) L. W
( t/ T2 Q: {/ X: i& _
else
& W3 G, g ?. ]% C% V% T; y/ q
6 x7 w/ D* A5 q) j- E
t=double(a(m)-48);
. e% j+ m* C5 e1 h% s8 N! k) G8 }. Y& b* k" D% h( ^* @
%由于输入是ascii字符,转换为整数需要减去30H,即48
) \% V9 S) X. {4 O$ _6 a
) o, [1 e8 w. a0 y4 J @5 p k* O C# {$ a# ~$ F
end; ?, ?, l/ {' f4 x6 q, T
9 Y: _/ v8 g# K1 T4 _
: }0 `/ c0 { s* Nn=1;%同样的while循环
% |. M# F' |% j# ^
' ^" s. k% x R- p! V* r. n
0 [, ^) w$ U* j7 {2 r9 R3 ewhile n<6. M' f8 l$ u8 m! N) O
( o# Y: `; r3 t, T$ Q( ^5 x% c. F* ^& T: q
if Black_num(t,n)==0
( C: s; u$ ] T- S3 w. A3 m4 D
; L) S7 {4 f) D- s* j& @, o. O8 s
& Y7 o. F9 F+ ]+ A$ X7 pbarcode_M(s)=0;' F C# N1 v. b* v
5 i3 |9 R9 K7 {" e8 ^# a/ W3 o
! f; y6 G; J) W2 N8 m! ^& E+ ^) ]s=s+1;( A2 B1 a i. ]9 _. ]5 Y
. X1 E( w) P" ]
* x$ g$ c; Q) ^7 f& g+ l6 i/ q
else
( Z7 h6 t8 N0 T
4 T4 w' K- U) O% p" e
, p" J9 |. p S1 Y) d9 Z* B* sbarcode_M([s,s+1])=[0,0];: z$ x, j+ j1 d/ a5 J! i2 p* ]3 K0 L: ^
9 A! b$ m( g) ?, n+ N
3 _. V2 [3 Z4 x3 Z: i- H3 |3 b' Rs=s+2;
3 P* F* A. E0 j( _# O" f2 T ^: G6 g- ]; d
; H4 z# Z" o3 p- u) r8 I" @9 a6 Send. m: F0 T j# P3 j
5 U# C, m* E. F+ _3 v4 i: R+ |; Y
if White_num(n)==0
+ n! M2 |) W$ J( e. V: a6 o2 c) F) k: ^. P
) y! F" i6 N! C1 z% f4 K" O) gbarcode_M(s)=1;
) P8 b+ W y0 l9 B! k: X4 `) E1 k f6 H. h/ U9 V" h
. @: L+ W" {. }1 r: Q) ?
s=s+1;
' g4 t v2 C# z- o
v9 h! c4 a5 h8 l$ r* ] W) J/ M, N) u' K$ D# U. [8 q( U
else( x7 S( [9 U# v% K8 v) p: W
6 L0 H. u# e3 W+ u
3 {5 l' R: o; ?. ?" R
barcode_M([s,s+1])=[1,1];
# y. i6 p5 m6 _2 @6 z6 U4 s$ t" Q# f! s5 L9 v- o
: t& X6 L0 u' L5 h: l$ i) {
s=s+2;% q/ ^) [7 p. {
) p3 J, E7 I* k, r
4 F/ N" E7 g: W! j `& kend; k8 o+ L# L; O) O
( d7 N/ f& X1 d. k9 H B2 B J
D* v1 }: T( }( ~; l% K: I: h
n=n+1;1 P+ Y G* x' l
. O$ ~- p6 f; Z2 Y2 i2 Y1 N
5 a4 T/ z/ j2 Z% z; I6 G6 l7 A
end1 Q: Z2 i9 I( H6 D" P9 F( Q0 N
+ c2 X2 _ T; V6 ^' A- n- Em=m+1;2 t' @- a$ x) e+ f* i/ z. I& a
& t) L+ w4 C' w& w
end7 _1 V, N" W" @. l3 D& F7 U
/ `5 k6 ^" ?" {: n: a4 O3 b& E* u3 X! b$ ]' ]# Q$ |7 d
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
- I& i) D) W, c- P! H6 r
# d: g0 c9 C# c$ m7 J5 }' M%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
- ?) \; _! @0 e: `# e+ j, _4 L$ _$ y$ F* n, _
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
) J5 @( ~: L# h+ B, P) z7 f
# k5 H* S" [9 R! u! ~8 k4 Bimshow(bcode)%显示所得到得条形码4 E7 x K3 X* f: `, b; a; A
0 `7 d+ `0 O8 y6 n! g%然后可以自行存贮得到的条形码
: ]4 x# W# O# w* U U7 G, h# o- j
2 ^$ E" J. I! U3 b: x! f$ o) b%然后用PS等工具得出具有自己特色图书证啦$ K0 ]/ @: [% k
0 E1 Y3 e/ E; k& ^* w# W t# ]5 @
% c2 Y3 ?0 M- W8 O8 W |
zan
|