- 在线时间
- 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 M) a; D2 {. L8 [: Y( b- G
5 r( f' G1 Z% U. C小谷同学 2011/9/25
0 m1 ^0 v Q% m- @( G8 l, ]/ Q& {8 q {2 x0 z! H. V) q$ N$ b
摘要# K) }( X: |/ `) \% s
x0 D7 P8 W& x- P% K关键词: 条形码7 S' v3 i/ W- O0 Y# o4 i
2 }& G! W6 d H- Z% {
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。1 k! Z# T" v8 \: t: }# |: ]4 ^% u1 Z
, i ]( w% D F% d6 x1 l% z j
目录6 l* b+ [% ]% z* M: N
' S2 C+ j a: _5 I
1.某校图书证编码规则
9 N$ }( X, b0 E. }( i5 D# I; b( ] q$ n
2.条形码制作的过程
, i0 N7 l1 p8 y$ Q C* T+ K& x: i* a7 ?) _1 G9 H6 i) \: I
3.打印与测试0 E1 g& f4 Y5 K3 q1 L3 W
9 W9 b! b/ r$ S6 f4.扩展应用/ ~+ X: S! u( T8 v* j6 O5 X7 |
7 u! X. @7 a1 |: g
5.关于本例的一些思考; P: a& h/ i. B7 X
+ @0 o2 R% C6 d# v6.免责声明与使用注意事项+ m: h, O6 F: @$ X
5 H5 j. ~) h# p5 i* ?' m
7.参考文献0 K* P/ d1 r& A' A' {0 d
% |' y; x: @+ H3 P( I
8.附录0 }4 F: k/ k& w
& X' m; _6 Z% D1 t& ` n! X1 n
& k0 @$ q" ~7 r( t7 U) K$ |
% B! y' w! I9 \+ k6 X W% ~6 g' b: y4 E+ _& U$ ]( u2 |
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
' C3 j5 y+ E+ J( K) `9 r9 Z. \. T; I+ i
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。) W* g# D; B" a5 a9 Y3 m
( a: \ M5 @* o- U. ]5 I1.某校图书证编码规则
6 o" Q; F: I! B9 O/ D. u* w! M0 ^% e% @
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:7 q: w0 s( _1 B
- X+ I: P' o+ e4 v7 b$ w
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。' q4 v4 n; i5 i( }" n( I
* r: T; O, a0 }' `
②图书证的白色条码都是一样的,分为以下三部分:, _; P( j0 {+ ^! Z2 y+ U: \
4 d& T! n2 r; n0 c5 R! u1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
. Z( c C& ]& S7 {# s
# K. p3 `* q, s! n! t8 Z$ H③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
, ]" T& H! Z8 Z2 I4 H! R! V; G% w& r- K
1)起始部分:00110;
; E. n8 R: v8 J
) c" H" U/ I$ O+ ]! G2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
! m6 }# J$ f& |2 {/ T( a; Z
$ N! N$ M2 t' b0 ?& o表一 某校图书证号每个数字对应的代码3 ? a$ e' K! m/ T+ f( @7 M
0 n# ] ~4 D5 m8 M* D% x. u
数字 代码 代码数字来源 数字 代码 代码数字来源
, x+ v* ]4 |, t' ]$ Y1 10001 1:0001 6 01100 6:0110
' a+ k8 q! { t2 01001 2:0010 7 00011 8:1000 2 h' Q( L# u+ n
3 11000 3:0011 8 10010 9:1001 4 S& [* m0 F/ v# T4 ` N) I* |7 W% \ ~
4 00101 4:0100 9 01010 10:1010
" D: w+ i& e9 o% U" @5 10100 5:0101 0 00110 12:1100 1 K8 r: S3 V$ e
4 q3 Z& @7 ?* V5 h. C# K说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。6 @& U7 g7 r& h& Z" b8 Q3 Y
# q3 ] Z' R! l- D# C! s3)终止部分:00110,与起始部分以及数字0的代码都一致。
C0 I' b/ m: R( F
# B6 l4 H8 o2 s2.条形码的制作过程" E' w2 t6 S; n/ K" v g: D/ _
) m, n% n4 e- D
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。& z1 h7 l* a1 m. f) o
, C# u' J# l( L+ y- n+ [定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
; \1 u: G- _3 b3 K6 U# B( t- s( {( P9 Q
条形码效果如图所示(程序代码见附件所示)。
. O( A/ J5 q/ {2 E. F: ]$ A
' R* Q+ G: z1 n6 d
图一 所得条形码效果图0 s7 w1 c1 n: r6 k) T. B
9 N# Z1 K! N3 V$ l5 k3.打印与测试
0 l8 C$ i4 t+ B; Q- Q* }& t! Y
5 z9 h# O/ d9 ]3 W7 G' W# E有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。; ?: I8 N( `( h4 k8 L# c7 n) s
. V$ x8 ^( v. t* @ f) }
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
Z) d+ I- ^' T$ W' G0 I' e# ]8 M. `# W/ [' F& k* ~" x% T
为了方便进行测试,本文打印出不同大小的条形码。
1 u; y: B8 O; O$ k9 Z* O
9 b# A9 D( ]* b' { e4 a5 {3 L测试一:将其用透明胶带粘在硬纸板上。2 w( [( y% e; C; T
3 W( E$ K6 Y9 d; D7 H; y `# b* Q
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:- W/ |- x7 y+ C% e* J H
1 X0 A6 L) T d! F* Z图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。' q! F3 J/ C' h
, n% ? \' l1 P; U6 i8 ]
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!2 g- S" N; N& S' h& _
! M/ j- O/ _0 S5 {效果如图二所示。" X9 s) z* j. v0 R% W& O
$ x; L1 y4 e3 B
图二 打印效果图
& Z$ E# N$ [& F: p+ D3 @测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。: ?8 y% d. E9 i
* J" A8 d" J, r ~4.扩展应用
- V3 L5 x) e+ T5 P9 W) \( Q7 ], U8 G$ o X1 Z- S) j4 c
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
* ^. }; m! b! n7 N" M- k0 ^( f/ l
7 z" L: P8 y* g9 [图三 可供彩色打印的图书证5 t* W6 h# |$ b5 e4 Y( D
" o) p& D6 _ |1 r% ?3 K* R过后,我们会给出相应的网页版、C++版、VB版等等。% A5 j. F: V: c: k4 k
) m' [" Z" ^# k3 }4 {6 ^) j' L5.关于本例的一些思考
9 M( L- ?6 A! M! ]( h, _; O/ y
5 w7 U' L# w- h由相关文献,可知条码技术具有以下优点:; r2 q0 y+ ^5 a+ U) Z1 ~
$ Y, f( Q0 d/ U' o. r3 N4 _
1)、输入速度快;
* I8 c+ q, j& S% O6 i& k* F( N K2 x; P. h5 N
2)、可靠性高;# n! Y5 G( i) |& g+ o
4 T, l$ M7 c" N4 R5 a8 f
3)、采集信息量大;+ O/ y# ?7 P- T P
* }. B! l" [* F0 t 4)、灵活实用;! \4 I- X0 {+ l2 c% Q
0 {& x% R, u) k+ a4 _3 r
5)、条码标签易于制作
4 \. H2 d5 b& ]0 A
/ f3 T2 x1 _0 A5 z1 L8 G& a! l6)、识别设备操作容易,不需要特殊培训;
, b3 f1 Y& T; `+ R9 W, L; \! N0 m z8 z
7)、设备也相对便宜。$ g, H, g9 \' m1 B
* a& l+ U( M5 L- B0 q. a0 J因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。& B6 J: [$ P Q4 N/ [' a" C3 N, b
1 M1 e: n* e1 k+ o由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。: Z) c7 i4 l1 x- t D: F
* c Y7 `. l( M3 Q8 w图四:常见的二维码& J4 E! H" g J2 r: I1 D$ R# l* b
0 A4 B! F7 F8 y
6.免责声明与注意事项- ?: x* }0 ` m
6 }6 n6 X- R6 {, n! U# H S% P( f版权所有,翻版必究。
; e& n' g6 a' M: R1 V. R. e
0 A" h0 Z8 x+ |技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
, B' z7 K4 f5 A
& w% E( o% q, C% | w! y/ S$ O任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
4 u6 F. T5 c& b
2 M6 c9 F4 K$ C( C& \5 D" s7.
, A3 n/ J& T0 e( c0 b0 m3 O* a参考文献
& r& z7 X1 a( H$ P, i5 k
+ d0 ?+ K% V( k) E9 [6 u3 i" u[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
, t+ J* g' ^" e/ H
. L6 z( z$ s! B" K4 ][2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]/ a# {. |- M, E3 j
8 a6 n# l! C& ~3 e, c- W& Q8.
+ {$ ]+ M% W$ Y' y. E附录2 ]) j0 ^% R b* e# q1 k
% }8 W# ~9 d+ J4 w6 x l
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):0 o6 a8 s7 n% Y1 m
) N& s) J: l! _, e%barcode.m2 U" a/ v& [7 b. T3 y
% q( ?! ^) ?9 Y9 T/ i$ P" H' J a%生成学号a对应的条形码
& u j) I) t; k C% M' D" t! ] r6 E3 s6 Z5 u
%2011/09/25 13:24 BY小谷同学) e1 r U$ X0 k8 }( ^+ |
, H7 C5 i- J- r0 k
a='1234567890123';%学号,自行更改2 \% L+ Q0 S4 z
8 G% @+ n6 U3 _& |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;2 G1 L- a$ u5 A6 x
4 q6 F4 G# f' L. }
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];%数字编码, k- V6 m3 i6 p# T
& K# S) ~6 y, O3 @
White_num=[0,1,0,0,1];%插入符的编码2 B* Q, R7 g3 a5 M
" ]& [7 A# R. V# j5 d+ O! ]+ ~
%Black_SE='00110';/ ?# q% y8 v* m& }$ R
; y& W- `' G+ z+ a2 }%White_SE='10001';White_M='01001';: b$ r/ d8 F! K6 X6 x
4 E9 f5 J" z. r% ?9 tbarheight=30;%定义条形码的高度
/ c6 x+ w g6 S3 b' D6 G
5 f2 k/ ?) B% r3 Cbarwidth=1;%定义条形码的像素宽度
8 c1 j# R% O3 f2 s* ^
3 J I/ K2 P8 }, `8 i; @6 Q8 ~& w; B% n6 K; p# K
%可以对特定长度的输入进行控制,本文规定长度为13- d4 l" W& P) H# Z
' R( \# u; h9 c" x: q8 V5 r, ~* vif length(a)~=139 Z+ x; k: u7 a, z8 _/ S
+ u8 B% n7 \8 P0 \6 i
9 b2 I% p2 q$ t$ c; V0 r% F
error('图书证必须有13个数字');
: s" f6 A2 f- q( [! _' z
1 W$ ^! B0 @" X7 b. xend! t: [: Z0 t. z* V0 C Q
' |6 p5 f. @% z. J& I7 B
- k7 B8 [" Q2 `. g6 Hbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
2 h3 }# S, B- U* C+ D6 h% }/ p0 q) {. z% y% B, L1 V4 O V
%为方便,直接人工得出起始与终止部分的条形码
4 _- c+ C2 W& m2 z/ A; B% m" {' K# d* {
%也可以由程序生成.
- @+ r* I/ B& e6 J: x' d8 j% R$ Y/ I3 V/ ]! r# y
total=length(a)*(7+7);
) j1 a, ~5 ?/ f* @8 A# r. |
2 C; B% E2 b0 Q4 t' ?, M%条形码的总像素宽
9 ?/ s, g. Z' u
1 U- Z2 s% P' H q%也可以不用求,因MATLAB提供的均是动态数组
5 C! l$ u, [9 W5 G6 F
* S2 X; k; v: Zs=1;%计数,记录
0 [( \9 Y" l- B! u3 y. C7 V# v' n. T$ G5 s! e
. A" w3 g3 G, F- w i* J" p
%由于利用for语句容易出现不可预料的错误
[( F/ j( `2 {$ ~6 [
$ Z" v9 r- c4 j/ c; N# V" ^%大部分是数组的行标与列标的调用问题,于是采用while循环& [0 |) I/ U. Z. U- G: ]8 `
9 {2 B5 U% ]4 U+ i9 l# s/ @0 T%嵌套循环,得出数据部分 g8 a+ @: S% q) q( ?0 J6 D
- |7 U+ Z' P) `6 q* u6 bm=1;/ t- R. V g4 I( A7 d& w+ f
3 {" {# ?3 |9 t2 Vwhile m<14 - K0 F+ e2 F) I& _% H- `0 [
/ T4 P( H M/ u. b6 k2 ?7 A& a; R5 c
' J" E! G0 [$ J8 M; ~if a(m)=='0';
6 n) N, @5 p! g- u3 Z) N
0 Y3 r1 M* G9 y! Q' r3 [) h. h6 }2 h7 d( s
t=10;
* l7 q! i+ S; m a: z; E' g" o; E: N
9 K4 ?* X1 B2 L: s; A0 C# O3 \%若为数字零,应该调用的下标是10+ \; B( }1 _: m [7 F( m
& @" g6 M* t! B+ J
1 e+ v6 X @; C* `; V+ N/ l# Ielse1 l5 \: r6 p% o L
$ A1 M; l2 X+ M; F
% p( Y6 [( m0 Ht=double(a(m)-48);
/ k+ L# l) e6 p2 ?( w/ T. E
$ t, l) A& Z9 s: K) v/ z%由于输入是ascii字符,转换为整数需要减去30H,即48
/ _) [# v5 W- p- `4 ]" c( ?% q
; ]% U6 |+ m: X8 n9 o: \7 d" R; o! ~0 f: A. s+ v
end3 O: A/ V4 y3 H: Q8 _, S3 u
& J; N/ m0 _+ D) k
- N, D, W! Y$ q( E% h; I, a/ o
n=1;%同样的while循环
" g& E8 d/ w3 Y1 g7 ?9 |7 D; ]6 ~! Z' f: H! l9 f$ Q. l2 M9 x
9 f/ A9 r! M; C
while n<6
1 D) R8 T1 Q8 h. B E/ H( M6 Z. _4 C' g4 s X. i" X# ?5 A. s
4 _& l Q& {1 n2 r6 {& Pif Black_num(t,n)==0
+ m) j! c- v7 R+ i6 w+ s- d
2 T1 I9 l& R- a
; [9 ^3 Y! W: dbarcode_M(s)=0;
0 O$ c Q$ @7 x$ p
# |1 o* a/ G2 n, x6 e) M4 A: Y) @: {5 G3 j# s8 L
s=s+1;
- {) e0 H# Q8 J* N: C5 }# P
2 E! @0 }3 B+ @7 ]6 X
& d' `9 w# a. x+ J0 zelse' w# A% E5 K! f
" [/ ~8 V$ a) B4 w3 O" \
7 N/ |% w9 W* c! b P# }barcode_M([s,s+1])=[0,0];; u L' Y; U, x- @9 C" F" M4 Y
5 L. I7 F" N. r4 y! e
3 b) D! _) ~7 ~3 ]( f) P6 G7 @s=s+2;0 z' f. `3 |, |1 g- z+ z% ?1 K8 n
! A8 H* T) ` S( Z- X4 E. C1 h
, {# D, x& T% Q
end
K% b& y/ {) E/ c
6 ^* t% |) j: B) Y6 W- _; m( N: E8 n
if White_num(n)==0
3 s+ q6 G& s% i* r8 ?
' d3 p4 M! ~2 C) C
* ?0 h& A- q3 e; dbarcode_M(s)=1;; L( Z+ D/ B+ m8 h: k
# d/ g8 t5 _; Y" Z; N! ~- S j$ c4 v! S+ ~3 v5 a* Y. c9 t* a' ]
s=s+1;
6 { d n, F! H7 n2 u4 K
3 v/ W0 E/ X/ C3 M/ x) c# r, @! w/ y8 ~) X) |
else
: [1 ]9 O8 ~( c J; O
$ { P0 H' U* L1 a( h2 \+ ~' ]) C A$ v
barcode_M([s,s+1])=[1,1];
( ^* d$ L9 R/ J7 b+ U# I$ d9 ^. q- j Z* c
2 f6 a2 U* m4 N/ L; }s=s+2;
; [; H' e" H5 M( @2 e3 ^5 Z# X) c; V) g8 [
. q) D' M; h i/ @: i0 k% j+ X& {
end
( i! @9 F& K' e' p* `
0 g" Q ^+ N* s9 t @) [6 i& i6 h6 h( |
n=n+1;
3 | `/ p3 ^% G; _( k* p5 Z- i- m8 j( s/ ]
5 E$ q$ H* x& a2 y* x' n% a- Q) G& Dend
% _* M% ]2 _; F* p
& {' ~4 e5 q6 am=m+1;! N2 a8 K2 q; |* @. T9 }0 C
( M4 ]; F8 B3 b2 m0 D( `2 F0 h$ a7 r
end. R6 i: s" T! I- s$ b6 Y
2 h2 e y; d3 K0 n) X
' E. u# l8 H4 wbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
* }: s! ^4 M: P) e2 Q0 L# l( l0 ~0 V4 k+ F8 L; ]8 Z" C4 g4 V
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵# ~ ]) V% H# I
7 f5 @ t; X2 d. N7 o$ W4 Y/ A& Ebcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
O% @" g) |$ Y& M' U, q
: ~" O. |+ k- ` y" u, Cimshow(bcode)%显示所得到得条形码
" s' H6 e" w9 k% X0 r& j) l _' _: V1 L7 s
%然后可以自行存贮得到的条形码; Y* `' E3 Z# H, M% c: g
/ i2 X! G! a' j
%然后用PS等工具得出具有自己特色图书证啦% u( x4 Q- |7 |+ r; M# y- C
1 |8 R, r5 H: t# a9 F. ~
# |$ l s& O* p6 M$ m4 f+ m |
zan
|