- 在线时间
- 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系列之——某校图书证条形码制作
]5 d, ^6 [7 G6 u* N% v
2 x% Z/ l7 T; J6 W- p7 u小谷同学 2011/9/25
8 ~; A7 u1 c l9 v& @, L8 n. t2 k0 _9 c( u# S( |$ Q' Q& U2 d
摘要
: s2 K9 m, U* b" k
" M' S9 @2 m; s( \* O! K关键词: 条形码% s, J0 I. p& c2 ]( w
8 ^% u8 k, J( K9 n/ z* ]由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
% q# s% [8 W6 F1 h& V
1 t5 {) E# m/ O: ~6 I目录# d7 ~0 N8 D/ O k
1 [/ D# A) l' B Y1 L1.某校图书证编码规则
; [9 U: {8 w" B- G1 b. w1 Y4 u! @ z, i5 U! D
2.条形码制作的过程
0 U2 z5 B% I; N2 C0 G. M' m& J/ w4 J% E
3.打印与测试
5 q5 X9 u/ c$ d
7 o. R) o9 L+ ^; |& E9 v4.扩展应用# D2 _/ h" j6 v' S% y: }
8 W" j7 q, g8 p/ W3 m5.关于本例的一些思考
" K- G! T2 Z q+ m- D5 n$ T" u$ b0 t3 `
6.免责声明与使用注意事项
4 T+ m ]5 o7 A
% N2 r1 [/ u0 y# ]2 g5 Q7.参考文献
" F- J! Y# O5 f+ t! k3 ~1 D2 }/ d3 q( ]& H0 o6 M1 \
8.附录) |9 w- \" u( t. d
! b; L* K( ~6 U* [" _) i
8 Q2 F2 X6 _$ s( t- q8 c
2 }6 b p: b" _) R5 j' e" M. V& d$ {- Z: l+ H4 I. x, _
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。3 z2 H: i( ]/ W. W
. n7 G9 ^: L V; G1 d
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
3 D" [/ h* q: t" D; ^' b+ I2 a* o
1.某校图书证编码规则
z0 y8 c5 |" Y L$ d+ i0 {8 H4 B& c1 D+ t
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
. U, z5 Q, J( c: `( _ H
1 @- e# v) V! j, m3 r①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
9 m2 G' \7 ` Z( l1 U4 N5 H% q7 I
2 r! N0 h- L0 l# r( U" J K0 o" d②图书证的白色条码都是一样的,分为以下三部分:
; o+ [. I+ h9 w6 J. s% w" }: Z" P! ^) B' P
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。) W/ K3 d7 ~4 v% u
\( c5 T, L, _6 Z% G
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:3 `2 |3 e6 R6 K0 F; j5 K" R
, |6 C, m/ x8 a+ a
1)起始部分:00110;
; H% C. E6 \- m' Q: `$ K
6 y$ N$ O; i1 r4 |5 {# k2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
# y3 n+ E# O+ } [ F0 u4 ]8 T6 w: R
表一 某校图书证号每个数字对应的代码0 H1 s( w1 b7 B" N. @) @
% D$ q) F- |+ \ s数字 代码 代码数字来源 数字 代码 代码数字来源 9 X7 i7 D7 F7 X/ l
1 10001 1:0001 6 01100 6:0110
0 T' j2 Y& Y! r% m/ J7 a2 01001 2:0010 7 00011 8:1000
% _, B# h' P% q/ ` c3 11000 3:0011 8 10010 9:1001 2 q$ [$ i j( y! R- H/ w
4 00101 4:0100 9 01010 10:1010 / F# S4 e6 @( f& Z$ i; H; o
5 10100 5:0101 0 00110 12:1100
7 X" [5 K) N* }1 _, q9 Q* a
' _! i# R6 o$ V; F0 n8 @, V说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。) J* ~2 F& g, V/ Y7 M. G
1 [, o) v- T( s2 u# |3)终止部分:00110,与起始部分以及数字0的代码都一致。% _: s& h* H3 ~
' [: f% X' Y* p
2.条形码的制作过程2 p; ~' F& K, v) M+ w- E5 y" ]
) C3 D/ w( w! h6 X黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。+ W3 u/ d) i8 t3 ^5 S* ^; u
* H f) h# n* s+ Z
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
Y9 ~) m+ d* S# y$ D
" o% i" f: t8 [' M" m* H2 n* l2 N/ s条形码效果如图所示(程序代码见附件所示)。5 N2 x# D% K7 c6 e2 Q" B& O% }
4 z# s" w, v/ q8 @: v3 h# A
图一 所得条形码效果图( I, G! l+ Y% C$ v0 x6 _6 j4 B
_: O! a# T8 u( c- i
3.打印与测试
3 |+ B6 j1 s- P& C8 f# r" w( s9 Q, C; z. _, _) J
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
8 U" S0 b, T: S
% E1 v2 v' u7 H& p, e( z因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。1 A; I0 v9 f# p/ e, ?5 {
- \) n% g! A0 q7 p7 d2 E
为了方便进行测试,本文打印出不同大小的条形码。( K t# p, g, F6 Y
5 _$ v. x F7 S! w t) F3 X! d3 D
测试一:将其用透明胶带粘在硬纸板上。0 a& n3 H5 ~0 u' B3 L! c
$ s. i! _# g" @) v+ E
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:) G& M0 I- q. V5 Z1 n' I
3 ^. A1 M" ] z- c图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
7 R$ g, \7 A* w9 v6 c0 Q3 e: x0 f. ]% }* f; a! V
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
. C* B; o; L) e, x4 b" g ^6 x* q* u: }" f4 F- n( X0 B, u7 @: Z
效果如图二所示。
5 k6 U) k" F7 W% l. b
+ ?0 s6 _7 g" C& c! G. N4 i4 f; F图二 打印效果图' f6 C$ z0 r7 m7 z
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
; P0 H, ?" X+ r7 ?, B+ \9 ^ d: m; Y- I, @! q: G8 k! P7 A* w
4.扩展应用6 o' s% T5 A- W: A5 V" i4 n
6 U* [9 h2 ~- Y- W为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
( E8 d% P3 a4 ?/ }$ [# z
! b' T, {% a( `& ~# v. ]图三 可供彩色打印的图书证1 @+ _3 e6 y- ~: ?9 [$ x0 a/ N% Y" F0 R
3 ^6 o8 U2 o' H+ D5 A; w" \
过后,我们会给出相应的网页版、C++版、VB版等等。
2 Z8 A9 A: P6 L+ Z
# z6 F/ v3 B Y4 B% \. P' o# Z& U+ K2 e. V5.关于本例的一些思考1 {3 g; X \% I; ~
1 Z$ U3 _5 n# v$ f$ t; R# W/ r
由相关文献,可知条码技术具有以下优点:
& P( k' h+ r! J' D" W* a! L
$ b4 M( O& m- }, `" `6 Y8 Y2 B 1)、输入速度快; + S4 T+ u3 v8 f1 ~' V
" y9 m* f% u, ^8 p 2)、可靠性高;
# l8 o* V2 d7 N+ M
6 ?4 E1 N' G' q+ N) a: f) T 3)、采集信息量大;7 N3 P) L$ }. E _& ^5 m2 P
: L1 ^ J! g' G* ? 4)、灵活实用;; d b" [0 y5 h
' V; _1 k8 |+ N6 G/ q+ P" R
5)、条码标签易于制作: E B2 @ v2 X( _( O$ y8 Z. U
( L# C1 w! f, z+ j! K( |+ l' v
6)、识别设备操作容易,不需要特殊培训;
2 n: D" I7 j$ U) W/ f) h% p% b; U2 }# Q7 P# ~$ M6 j
7)、设备也相对便宜。
: p w7 q: a4 z' c9 `3 T9 ?4 k: u6 `
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
- ]& f" l) Y/ {: F U& n) U r+ b3 d8 o) y( q5 K4 C* Q
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。5 S& v$ D; Q; w6 G q3 O* L' S
5 d' j9 z S. z% B* A7 m图四:常见的二维码8 u9 u/ S+ ~: I# z T& ^$ y
& M$ C* F1 Q6 p3 V
6.免责声明与注意事项
Y* E/ j L5 w/ |: R$ H1 W% ^. k9 C* t0 ]
版权所有,翻版必究。5 `9 e. j' o5 x) s0 j2 w9 D
+ e. ]7 F& ~6 j R
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。1 U( A; F0 A7 F# B+ n/ ^
: ~. |5 @8 b( b) D
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
+ a' L8 H$ o' K8 y
! n9 y% w8 ?' y0 j9 Q+ p7.
9 h6 S6 h/ _' c& U! E0 I参考文献
) K: R H& p# P1 D1 L9 g) y3 h6 y9 {7 D9 J; t- o, Y) P
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25], F! v3 }: ~, ~
" i$ @; c- q8 \0 u; a
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
! s) v0 b# Z9 n# \8 H( J3 Q
9 r2 F2 v6 J. G8.; p8 r5 @9 _- u% x5 t; p+ o
附录/ g- N& A; O: a) @- x) b; h2 z
3 g/ Y5 O" S4 u. V/ J
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):# M" v, j1 S" _- g& _0 E0 }
; ?4 z2 h. z9 l7 J4 _
%barcode.m
1 r; g |. ~2 J; W# n) y2 H( k2 E8 q9 y
%生成学号a对应的条形码
( m: N* I- `& j
- e; F: M/ j' t, }5 a6 B$ p0 K%2011/09/25 13:24 BY小谷同学* @4 Y, D/ J3 W/ u. ^
& s9 C( c( A, y# w! z0 u% g
a='1234567890123';%学号,自行更改1 } P2 T& k2 _8 R# c4 ]
[& ]: o1 L. Z' o
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;
7 d7 s; N- M+ \/ H0 H3 z8 v8 ^/ ?; r e$ d% `& k
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];%数字编码' [$ f/ j4 ^8 I0 I0 A ~
; n7 r( R; @( L, c# S- @
White_num=[0,1,0,0,1];%插入符的编码, V- x6 O* }+ l6 | e# R
* g" O/ l1 C& {%Black_SE='00110';) ^* `# V2 x3 Y. O# A
/ n- ]' P3 L, C%White_SE='10001';White_M='01001';
) m* M) u3 \9 O# Z, M# f. @
; J i( n, B( ]# q) J3 xbarheight=30;%定义条形码的高度! G3 {& S3 ?: |/ p
" U1 A0 d y4 ?barwidth=1;%定义条形码的像素宽度9 x9 v# \2 S- {# J8 w4 x2 }
4 x: [. c9 y, D; e1 M3 [8 o+ E
. I9 _4 E$ R1 q3 R# r- X%可以对特定长度的输入进行控制,本文规定长度为13# i% C* o, D* r$ ^# A8 ^
% q8 q! F; {0 `2 Eif length(a)~=138 Y6 j1 q' x' Y- ^( h
$ j7 M6 f9 [# A H, e. y6 l8 K3 U9 y
" b( [+ F$ ~9 R, [9 y# P* q9 E
error('图书证必须有13个数字');" {. B" ~% }- q) H) t. s, U- G# x
' K+ S9 T- _; X A7 C% x: ?5 o! ]end
4 {+ M. q) r! V+ Q5 e- i
S6 q- K3 n I) _( x. i
" h1 K+ C1 J: Tbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
5 W& B" u8 W6 F0 K; Z l8 x* B9 h, N3 ] v
%为方便,直接人工得出起始与终止部分的条形码
) ]# V0 ?# }4 ]" z; T. F% w$ e; Z# [; l
%也可以由程序生成.8 B7 \; s, M& d, i3 Y# Q
" b0 M& ~4 K$ r
total=length(a)*(7+7);" A" v: }- O/ M" g3 I9 W# H
- {% @. [" k7 \% s; j, U" |: G%条形码的总像素宽4 |- J) m$ |2 u5 o2 l9 ^
: K C7 A1 k$ d$ T
%也可以不用求,因MATLAB提供的均是动态数组8 z& B- z+ }1 O8 c
2 V" P* t- H; R
s=1;%计数,记录5 C6 T9 I! x) H
- ^ \. w9 S/ _# a- j" z3 H" T: r% ?- |. k" f
%由于利用for语句容易出现不可预料的错误
- L& Q1 r3 F& E2 c- R& B
; F, q! i0 ^. g }7 I%大部分是数组的行标与列标的调用问题,于是采用while循环$ d9 p! Q* b/ S0 f) v
, m" w0 ` d$ L. t
%嵌套循环,得出数据部分
: C; w8 U- D8 w, x
# r; {5 F" w4 M( Ym=1;( c$ T4 A7 P$ l1 N6 i! s( W+ U
' u8 R* a6 h% V' p
while m<14
+ l0 r: S' }. ^& ^( S K4 C' g* {9 L6 f; A/ L) ^
1 c; {8 U+ x$ [" Z H& s1 n
if a(m)=='0';/ X. G5 t6 r/ N
) i# C' g$ J7 Y" w1 e2 ~- V" j
" ?3 T7 e" y9 l) h; a: ~t=10;
9 \! N& ?0 @' j7 l- {% Y' r' |& Q1 N
( V6 m& Q9 E3 F& p& E%若为数字零,应该调用的下标是104 `$ g) u' e9 w* g
5 H" t/ ^, a/ z
3 {% v, x( \) D Q
else
' v; X# p) A8 Z' i, K/ G% Z
/ V# B1 a3 `# k( S9 I" C* }7 C) n" ~# b1 @4 N% n
t=double(a(m)-48);
. ~# P0 W; K" B5 z: V- q$ R$ d) e. G$ } i4 L' S. U
%由于输入是ascii字符,转换为整数需要减去30H,即48 o5 y" S% G- K" ]
& i7 g9 Y. P0 Z! [! }" ]+ v4 v$ _3 ], {( d
end
, g9 R" f% Q \* g2 F2 i' h
# a0 }& ?* J9 W5 Y3 d d7 F* ]% L) l7 g6 K
n=1;%同样的while循环4 f( a6 G8 H' x9 y* i* Q; G6 X. e
2 D" J+ q- e6 X
" }9 w! ~" w/ W; W
while n<6& r5 _+ m7 Q( @; k
/ P2 A7 o% _& P; v. j* }8 x
. Z9 D. k" h, a A3 S' p3 E6 jif Black_num(t,n)==0
" `5 `3 C$ R2 \
- h% ?( f2 I. [4 Z
: N* N$ z8 @* D- Tbarcode_M(s)=0;8 b: J0 B+ j+ R
, j1 P, {( M- L4 ~& ^2 C; A: m: k+ m' `$ C( u" O7 _; M
s=s+1;
7 c; u; g0 F5 v2 c2 s! S# ]9 @0 O$ `: X$ j( m/ U6 Q# u* |
1 g- d) X- F5 @% U( i$ J" X
else
! E9 e% t* j. I6 Q2 p
5 K0 ~$ c! N5 ]! q& [( @& u# T% a5 C/ ?6 B7 n0 }3 |% h
barcode_M([s,s+1])=[0,0];
8 d/ f" f- f* n+ g1 t- U# e( r
4 n a& Q: h2 ?5 R* P. W7 o) d2 V2 Y. z. h
s=s+2;8 c9 @! z9 ^3 n
$ [; A. |; e4 o# n- N' ^3 z
0 u/ Y; C& y6 tend
" m: w- z; t# k: \2 e+ W
% k. U& W b6 W; c, G2 W$ l
: M$ S5 k3 y# H4 n' cif White_num(n)==02 n; X4 U' Z0 V. q( Y' Z2 F
2 G$ {% c( u( ~0 v9 l6 L
/ m( ]# u( O0 t3 \& Lbarcode_M(s)=1;. s6 d1 c- f" r w
$ m1 \' ?5 ?2 }; ~% k# W, d& M8 ?
# C) G0 i8 B+ D+ K2 g. R2 }s=s+1;
# |; W! b, F" D
# ~. E# d4 ?: Z. k0 A/ f ?( B$ p' _& T
else
2 O% Q6 |6 z! [. ~
6 e5 I. G/ b3 Q" O5 j/ i3 P! W% h" g6 o* E: @1 k+ s
barcode_M([s,s+1])=[1,1];
9 z2 g) ?6 e* }1 u7 c4 W# T( s* u9 i8 k- c
4 ^% T3 I) h! J1 Z0 S' ~) Os=s+2;# X0 p3 \1 E& S& D# }& K$ k! k
. M9 Z0 U2 p: m" T5 r) y: p% N' ?7 a4 Z9 @4 \. l/ E! N
end( \& b% J0 Y. F# [" |' o% o6 ^
1 ~0 Q2 ?5 {/ e b. r @0 J8 }6 P& ^- c9 P
n=n+1;
7 Q) J& Z9 v1 k
, ~& V# l$ L: ?% J& d
) |, K9 Q+ @; ~ ?+ ]' g5 pend6 w# J/ t ?( q- j$ O% ^/ [
' {+ p4 j2 {/ d0 o5 B( L8 k
m=m+1;
8 P5 Z; E/ c3 D& Z6 B: F" f% Z; C e a l. a
end
8 w( M" B1 o/ P6 k/ @! p- g* } j% Y1 b* t
; H4 R+ s6 m ] B2 M. d! w4 O
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];5 I9 j7 ?4 J) k2 u: D+ Y& U
1 h" F6 t( s; I6 W5 |1 l; k%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵8 e. D0 b; a6 ~9 u2 t5 F% z+ s
) {, w7 n6 E+ M* U r" Y, L
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)% |( y* J, F+ e
. K' c3 I5 C k9 y* I. F6 Rimshow(bcode)%显示所得到得条形码) ]' L5 q; y# P/ p; a9 j$ j7 F
% E1 ~5 O3 o+ P! {& [) U# N+ s" E%然后可以自行存贮得到的条形码
" e4 r1 _* `) _2 P* T2 T0 G8 R$ f
%然后用PS等工具得出具有自己特色图书证啦# ?3 L& f5 m7 Y( A" B# k6 ~
$ q" z" Y$ P1 V' x+ U2 g! m' ^! [7 N' l
3 W! y9 m4 H; }7 {6 L/ | |
zan
|