- 在线时间
- 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系列之——某校图书证条形码制作
3 r4 e; g# l6 O* w1 G4 r* m, e0 x' r, C. m+ i* d* A& R- I
小谷同学 2011/9/25) `# y, C% @) ~7 {& ~" A
1 j# _5 i+ ^4 @& Q3 \% o
摘要: j( E2 ?: O+ E
( @: k9 y4 K" p; O1 v0 y3 m0 C
关键词: 条形码8 J5 n* I. v0 O' l8 G6 b) M% c
! y5 ^6 d2 ~* s h2 n) z
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。1 W2 Z( P$ H! Q& G
1 d' q. \/ D( R2 L# n目录
) U, Q- }) s6 D# ~, ~& x8 d6 ^ e
1.某校图书证编码规则! ?, J$ o1 d( o& b
( _: d" N/ M t9 f0 v9 ?
2.条形码制作的过程
( O E! \' ]3 v% {7 g" Q/ Q
o" s( A7 `1 K; ^ |. G1 u2 b( m3.打印与测试
6 ]0 Y; C% T" @' J9 q' y; O/ W
) K& r$ A- ?& n( D1 {1 k( l4.扩展应用1 A) J1 d8 K% x% y m8 h* [! e. ?
9 M( `/ O8 J+ S2 y" R* G! {
5.关于本例的一些思考
8 I: i6 G1 T+ T x0 y8 c9 P: m; y! K$ D) k
6.免责声明与使用注意事项8 [: q7 ?+ l- d" Y( F8 y( E4 C2 E
: `( r# }& C5 o Y7.参考文献1 p3 S/ L% u1 x' P# B; w% a9 l
! p. h* v* N( J: I; s7 I4 Y8 g8.附录. c' K. w! }+ a
5 H; n) z. Q) o1 C( I% Y' m9 b
7 ^- }3 i9 ^8 r- H
, W! ^* k& O9 k5 j* L
9 U, a. K4 F/ Z; P# N3 x- P& ^# d条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。" `0 {8 ?7 N* i' x( ?9 F: Y
* E. V3 w+ O h5 K4 C/ A& {8 b
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
. C; y5 M& [9 h( E
9 a- u; S1 x( Q$ }7 n. C/ G& j1.某校图书证编码规则5 O, C5 B# A0 @8 \. a1 p
0 Z% k- T2 D ?1 H- R由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
& U2 P3 R3 h) _* G+ n( h5 b, ~; g3 O; O" \& ^
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。8 C9 k4 w S; \# m: j# `- k
+ u( A8 P( Q. |3 c2 t) \
②图书证的白色条码都是一样的,分为以下三部分:
! `: g* i7 `& D$ O+ N
" H6 ~, c( b$ j3 f* |% G1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。: G. ^3 o% k& O! ]: Q; e
# U1 P3 c0 B7 Q: O
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:7 \' @4 ^ A- o. [( B1 H
; [/ {5 l. c6 c- o; q1)起始部分:00110;6 R6 h; V p$ {
! Q4 ~5 r+ j! Q2 l% O9 m2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; U, {" G# ]* \7 P* g* B
6 _; K8 H. T1 s9 g$ c) O6 W表一 某校图书证号每个数字对应的代码1 s! U- R: M7 Z; {, n# M$ [
b. y" p% S7 Q9 T0 i& v
数字 代码 代码数字来源 数字 代码 代码数字来源 . U! o" a1 z' y
1 10001 1:0001 6 01100 6:0110 ' }- |7 B. S! w% b! m) S$ d$ u2 [" ]
2 01001 2:0010 7 00011 8:1000 ) z; L1 A% q; Y
3 11000 3:0011 8 10010 9:1001 : d$ W% e8 o N% B3 A8 B; Q0 S) O% z
4 00101 4:0100 9 01010 10:1010
' P- R2 _8 D4 S( \" w1 {5 10100 5:0101 0 00110 12:1100 0 K8 J$ a# {# A$ J3 V6 B0 L
$ h1 f0 H" i& t; l# b8 u说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
8 I3 A' e* a" t# \# T: q5 @" n8 A! j8 g5 X4 Y
3)终止部分:00110,与起始部分以及数字0的代码都一致。
% {9 m% Y$ Z: I; H
* r( b/ F% t0 P5 W1 K/ [. a: w1 C: ~2.条形码的制作过程) ^, h4 C+ D$ }: {0 o
. r; u1 `/ q: x黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
, e1 C& E* T) K. Y
$ [8 f, u/ _' L定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
+ @* I/ i+ G. o: H/ x5 K5 R% q# ]
! X! r6 o2 R8 [' ?9 E$ s1 r. p$ p条形码效果如图所示(程序代码见附件所示)。1 Z& h8 [8 i- z0 o( {8 w
' z; \6 \1 R0 Z. Q& |
图一 所得条形码效果图# z1 P/ Y5 R/ m' h
" q& H8 L" u8 z
3.打印与测试
3 y/ k' h4 I3 t: Z+ D" b; h* A" J( r! n _% m) w! |; b% |
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
% h% r" Y- s3 L7 d& _9 ?7 I
. U8 v3 @/ Y' E7 \! v) z因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。) y. F. q; H. r3 e
( P. z. ~5 P: z' L: F* s4 v$ P
为了方便进行测试,本文打印出不同大小的条形码。
; n' l. z( n0 n( J" H" Z
7 V4 Z4 Z/ `3 L$ _# N1 R测试一:将其用透明胶带粘在硬纸板上。3 [- G6 Q* K" N" ^- c% g! R
) [% a1 C# S1 {) q
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:5 q2 p. x$ f, |
1 S1 Y' S3 l, W' S- _图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。2 a; K6 p. ~- U( C6 j. c
6 h( k3 e2 s9 g' Z! s! U' O7 [
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
* L1 H4 v5 q6 P) I1 O. i. a! }
: `- L0 K2 h# c. n效果如图二所示。
) K3 c2 R8 `$ S- \
+ g s" L# H5 q% ]: `( q
图二 打印效果图
( f* S7 m6 `7 ~/ v测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
) Y* U. ^9 x G! {( y8 U' \% a/ H0 v! o
4.扩展应用9 P1 e0 \3 j3 F8 C* b( b" c, ^
4 ?; u- x2 U+ ^% ~' r
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
1 d/ P# E; m' V6 Q6 q
- P5 M* h: ^* o) R. e图三 可供彩色打印的图书证
0 d a! w4 \- ?7 m; M$ W
, m; D! x6 k- |7 {$ M, F/ F9 S过后,我们会给出相应的网页版、C++版、VB版等等。
4 ~/ ?5 v: Y8 V! n1 c; l5 b: r& J, T' @8 u2 D2 _* l, P
5.关于本例的一些思考' p: q0 l/ g& x+ N
$ T. W$ u) |4 R' P( x( l" E
由相关文献,可知条码技术具有以下优点:, s [9 k) R- V0 e' T# _6 E
, a0 C4 D; _& o! L8 S# J! f 1)、输入速度快;
3 J6 v, J( u8 Z! |4 I( n: J% P; x6 n3 \
% K: e0 L, X6 T" A- V7 ~3 m9 Z 2)、可靠性高;8 j' F$ N& D7 p" G5 B S' N3 X
' W) V, Z4 x' F, k 3)、采集信息量大;7 u) m8 t7 T) h0 Y
8 Z* ~. S6 r& X# r2 f' |( h+ ] 4)、灵活实用;
2 K: ^. k9 }5 \
+ i7 T& a5 r% `9 E+ @( A5)、条码标签易于制作9 B% g, J5 v. F0 g- [3 Q, [
: a2 ^0 M) K! o" q% U6)、识别设备操作容易,不需要特殊培训;
( |2 n ]9 ~9 ~. v! B
5 m& Q7 p7 H' J3 V, y7)、设备也相对便宜。
L1 d* {3 J; |- i% r3 b
# z: Q" I; T( C. E# ?! ?4 w因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。6 j; F' F% P. i# Z: F
$ f9 A7 r" f8 L/ l" t% K; y
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
9 |4 S/ w. j5 V7 N9 C* n
' w& e$ S$ | L! ?" r图四:常见的二维码
4 X: I% n9 w/ _/ w# A3 i1 ~
" k N2 [) _% ?7 T6.免责声明与注意事项
9 V+ M. c. D6 r N) Y* y) M. i8 _7 M7 X5 `' ~2 K5 v& g
版权所有,翻版必究。
6 z2 H" e4 u. f% j) q, l, ]2 e! e4 b: d
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
7 m1 \) s; m" s, N
1 K$ M* s2 V! v0 }8 [任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
& P& g2 W2 c6 s. d/ w
3 a5 [ z% b' Q- h6 w( r7.7 v% d2 k: M& B1 X
参考文献1 \. u! s# ^& ~/ W" s6 [: v
8 r' K/ `! j1 v4 F
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
6 f& Y& @* h$ e$ C
; x& w4 }3 C- L/ C* x8 f- u% ]0 l5 p[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
9 t0 D: e/ {" \7 j4 N6 m4 y2 G" u6 u5 s! L7 p/ Z
8.* z4 u1 w$ ]0 S9 j2 c# ]: b
附录
; V3 } ]) t+ z% Z, |% K
+ E) J8 N* q6 e9 ^* N相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
9 X% ]! D y; A3 p; F5 S, x2 x' O- F: X- T! F! F
%barcode.m4 d# ]3 T& {: [6 I
3 \) F( B$ ?- Z/ P%生成学号a对应的条形码
" r- x; Q0 n6 [% p0 }
& u7 O" g( t, A' G% _* L2 j%2011/09/25 13:24 BY小谷同学+ k! ~- p9 l3 F0 U& r( w) @$ T' X
% X4 c6 w6 j3 Q0 u# G. ?( s) m
a='1234567890123';%学号,自行更改/ u7 f. F1 Z& c, g; W3 N
5 [8 p. L4 ` C6 \# S4 y
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;; r. a2 X* T+ c4 Z0 l1 |/ N
- b! m# V: }0 ], t0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
. `6 D) X0 S# q" S' [& X1 U4 ~$ Q% J+ G7 b$ V/ g1 S1 c
White_num=[0,1,0,0,1];%插入符的编码
2 V; \1 _# I2 o, z% E7 e& ?0 j% B4 W' W" P3 J. w# k. g8 v+ K+ E: B
%Black_SE='00110';+ r4 n9 I4 d+ F. s0 z8 d- W
+ B8 S$ L5 G7 v8 O; _" Q+ D
%White_SE='10001';White_M='01001';
9 t$ ]) s% g: D' W
) `9 ^+ }6 o6 h9 y3 ybarheight=30;%定义条形码的高度$ F6 E9 z5 ~' U0 F
: ~6 P# X% V. p3 N5 e
barwidth=1;%定义条形码的像素宽度. E# @# H0 ?+ c! N$ j
$ K4 S' v( G* @: o5 w
# Y* O# M+ M1 N8 ]%可以对特定长度的输入进行控制,本文规定长度为13
) L7 y5 [7 J' r4 I4 ^ G3 Q) A. R) y9 {) L0 q
if length(a)~=13* X- X" C* l2 x9 g5 R
0 d7 m$ g+ ?( M1 c$ z+ ^
, @1 _1 b7 I- {error('图书证必须有13个数字');* C0 A( B5 W) d) T# U+ s
, h/ [6 y, J" R* f0 e
end/ m/ W- l, @: q# S' ^6 j1 x
9 K/ R) X( e! j' e" p2 E8 @" n$ K/ T2 h$ o
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
- ]3 [+ A( n) [
5 ]+ H2 e5 e6 _%为方便,直接人工得出起始与终止部分的条形码
- C1 z* D$ c- F/ y. Y' r- N# e/ M( P! s" z$ C$ K6 U
%也可以由程序生成.
/ s7 A% f- D$ M* }$ J( h& k) h3 e2 X! f y2 z, C5 Q( A* v
total=length(a)*(7+7);& v! Q, Q8 [, `% I% t* ?* m; Z: t Z
1 E6 J5 S$ a9 Q2 N) R& }
%条形码的总像素宽
8 K/ o9 ^! C f7 \1 \" C& o8 c
%也可以不用求,因MATLAB提供的均是动态数组) Z9 w, S# f& \. B% R9 R
9 y2 A& r. T: t2 Gs=1;%计数,记录
" h) L0 a0 a7 G; N7 M% z4 [ I- q2 K% C# B9 r7 y
1 u1 x# P0 F2 p/ _( H! K$ N3 |
%由于利用for语句容易出现不可预料的错误9 O- V6 A' x- w" r8 ]# p* q$ _9 c+ y% k
5 S% ~1 \! `* Y5 U% p8 H
%大部分是数组的行标与列标的调用问题,于是采用while循环
" F* N1 y2 M% G0 D
1 r/ J+ d, R6 P; Q% d0 `0 s%嵌套循环,得出数据部分9 n1 J$ C$ x4 |9 o& b. R! h% w
& ~# y( ~! d3 q) A" ~' l* e$ C
m=1;. {* L! I. ^( X; ^$ n: l
$ \8 a+ _ J1 e, c4 h K/ B
while m<14 " h1 h# ]. c& ]
$ c. C; [2 C k+ E* |4 n
3 P* D' n- n' _3 _
if a(m)=='0';
5 T; L5 |+ L% k9 m5 b( P/ ~( t% H( U, @' Y4 N; J, k6 ^
, G* K5 n$ L# t8 P
t=10;
' c- P% V" o6 [2 J$ T8 A/ Y8 r7 e$ ?2 U( `) g& h4 r
3 j' e5 i4 H! a' ?! E& z; H5 n%若为数字零,应该调用的下标是10
# P. t0 x) i* e& \" O6 N& J8 ]9 `% a$ @
. ]3 x' B* P' D/ O2 k
else
: m5 R8 M+ Z2 f! R; l5 @' Z: T! |$ e, c$ q) A$ g9 d) C2 j$ \! B# n- R
$ N, f% ]# G% d4 W6 \/ g1 L" Ht=double(a(m)-48);7 ]& Q- S2 r# A4 Z( ~
# f6 ^8 ~; c/ ?2 C
%由于输入是ascii字符,转换为整数需要减去30H,即48' \0 u/ J# E- \8 A0 F ^
; s( T) [- i; H% I6 z9 w# s! W8 G' G& O
end
" x/ x$ p; b! W- i' o2 E+ E' |9 O
+ E+ `9 L/ f* o$ j, Bn=1;%同样的while循环
4 Q, E( ?, M& e$ d* z6 M
7 r# t! A! V5 L9 \( d& F7 w1 }) ^$ ]" L! A6 A
while n<6- T5 N% ^6 I7 {7 C/ ]1 f& ]
+ W% x; ^, O" {5 |5 D7 @% Q& C' C' l
if Black_num(t,n)==0: J- o5 ~/ A1 t& |
& a, X b" A% r9 w- J0 Q
9 \# h8 m1 ~# `' J. Kbarcode_M(s)=0;
& y* ~! p% Q; i/ A0 h% K$ e1 K, S. p) X7 K
' Z- z! Z7 H' A3 ps=s+1;5 T+ h! F* L# C t, H5 d
) M& a) B5 \, h+ v0 |( z) l5 U! a# `7 }+ N/ G, z ?! P G# E5 f
else G% B5 O5 y) s! \
& ]/ o, _/ ^& C# j9 W0 l
# ^( e& b) v v$ Z0 ebarcode_M([s,s+1])=[0,0];
9 D; z6 k5 w# W: M# _' R8 O5 ]
3 k% V3 W% B4 m' L1 e& e4 b
. ~0 w5 w2 s' `s=s+2;# I; f, M( ?7 Y0 L
: l- ?, R/ O- |, [: \ d/ R4 X9 x. K
end( R6 ~* p- @2 [
) d* k0 E( |$ c" G
9 p: m$ [- @' Z
if White_num(n)==0
& E: P8 ]' e! d5 h$ T: R) G( ^- C
& X7 X2 E2 x% M; ^5 e* c3 ~8 g
8 l. e" g2 F7 Tbarcode_M(s)=1;$ u0 R. j$ w0 \% L9 t
- d5 v6 U: B+ k# _; Y
. O3 z( E# Y8 L: e+ C0 R; J
s=s+1;
7 ^7 d5 F: Z- M$ u
& v: c. N; l' ^) i& O3 O! s9 g p' g; L! [' t8 T' O
else
- e+ w3 ]; D9 {# l; C% N5 G6 V6 k3 C7 O1 p& E% `" e4 ^
8 Y; N" O9 d2 H0 W$ {3 F+ |+ }barcode_M([s,s+1])=[1,1];
0 ~% s, N# N/ t% @# _$ c1 r4 \1 K# z, I; a# k5 @
' ]9 _4 ]8 D! o- S b
s=s+2;
1 W- x$ g3 ]/ B2 e6 c5 B
4 ^' c0 A7 K0 x e
* q( K& X0 Z$ w: b* Kend
7 J0 T0 v; B1 c: |" I. K) ?8 q# i3 a, [$ f) G
+ I& w$ Y0 {$ P) a& P5 H9 Hn=n+1;
- s0 o* L5 J$ j- p4 I" J( X) Y: z- I6 \. W$ F6 g* Z
2 e* o7 U7 K& s+ ]6 lend
# C, l- w4 V& V# N, f; h! a# o" `2 Q+ W1 @
m=m+1;# G7 p) S8 Z7 O
4 z4 U5 p5 S* S1 fend1 i* H$ A4 P, o: |! B9 C4 d
4 d" j) i7 \, n `* l
& s$ O* i1 w" N! ^, ?6 i
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
4 { S# T) E1 L; d! `8 W: v
/ ?+ l3 G/ ?+ T0 c1 N0 f%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵: J) `) T3 E- g" Z5 A
% ]1 A2 A' R" L) s
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
0 u# H9 g9 g9 p" }$ u0 z
$ I; E! H4 O5 ?) ]/ c8 ]+ A5 Kimshow(bcode)%显示所得到得条形码& V) c: X- a4 }, R- f
6 v2 f( K' g1 j
%然后可以自行存贮得到的条形码
. u. B; V( i1 T/ w- ^& a8 D2 E Z
%然后用PS等工具得出具有自己特色图书证啦
% R6 C+ P4 D: B$ Q4 a) t" _ L8 o9 J% x
c. c C1 [$ |7 M
|
zan
|