- 在线时间
- 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系列之——某校图书证条形码制作
- N7 Z2 {; M5 S
. K% T1 ~' A; g. S* a4 j, V小谷同学 2011/9/252 j; ^4 v/ [; K e
( N) J: X( K9 W9 }$ Y- a" H4 L
摘要; \5 W' Z% L9 |2 S& t, L
: C+ p2 M8 a6 m g/ o关键词: 条形码
) m* L5 F9 a, Z& q, r
& v: g" B+ y0 M) f. ~+ L% K) |由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
/ P6 m3 |6 l& y3 ]2 Q. ~ n( z" B% }
目录% Q% `: v) S6 ~: a" i
7 X" g4 @0 |9 K2 [1.某校图书证编码规则
2 T- v% v: `: s1 ]" {% b/ S' S/ q ~
+ T) G* N; ?2 g; ]$ r5 B' f2.条形码制作的过程' f% y2 K# R8 A) E4 f4 I
& ]* O. N0 b% J
3.打印与测试/ R" e1 n& c3 l. p4 [8 o
% c5 R! \5 k) K; M+ X4.扩展应用% G' e9 Y4 |" I* |# N5 ^
) e" Q8 O/ Z9 `' W
5.关于本例的一些思考
! h, _6 y9 c1 [; K* j, ~% z: _ f
! e" B: Y* A: ?% {0 R8 N6.免责声明与使用注意事项9 T d# j; ]; t K- y; _* Z2 p! t/ i
; {2 ?' I3 U4 z2 Z
7.参考文献3 ~! \ z; ?4 B1 V9 v0 \, D
, o6 ?) U! e$ |
8.附录
' E, }$ Y. k% X G { {# `& Q1 T1 B, e7 M8 x8 J! Z, \
1 Q5 L8 A% U W1 P0 t( Y- U' c
) \; E5 G; Q9 @. Z; z) t8 h$ u: X7 ^4 ~) h
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
( Q. w7 v9 y. r2 z2 s7 |$ B0 C! U! U% Z# Q; _5 h8 `& Q2 w- s
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。0 C1 t, `4 N0 {+ i( \+ Q) E# T* H
/ o. y) y2 E( G* [' F. T. I2 H; ^
1.某校图书证编码规则0 f6 Q0 n( R; U/ z+ A% q0 U
* `7 y9 @, H+ L* D5 Z; N) D. {
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
A5 `9 b) w ~
+ O( M3 j1 ~ _3 A9 x①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
3 Y+ v' O$ k. u: Y% ^3 D7 s% W: a9 H" u- g" M8 `# R$ h9 g$ i
②图书证的白色条码都是一样的,分为以下三部分:
# {0 c* B; }! o; c: l! a8 \
+ y) G2 E) q# f* l/ ^/ s( G1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
8 p6 O0 N7 l& g8 e
. ]) f: W$ S5 z) j9 [9 u③图书证的黑色条码是携带学号信息的关键,分为以下三部分:# f+ _; o% c R) ? M( ~
) i1 H; u8 V- Z1 q1)起始部分:00110;
. Y! r4 Q3 G* t( k9 [( y3 N; b8 o, T5 g4 f3 z% D
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
2 R, ^' N; H0 d: e. _6 l
) z- D$ l- W+ w0 n3 F6 C表一 某校图书证号每个数字对应的代码8 c& D, z1 Q$ e" w" u) Q
/ g7 y- o' C5 a; e- y数字 代码 代码数字来源 数字 代码 代码数字来源
0 c' O$ t/ [( O n d1 10001 1:0001 6 01100 6:0110
e: }# r2 I/ x6 F2 01001 2:0010 7 00011 8:1000
& D7 z+ E) c) M3 11000 3:0011 8 10010 9:1001 " I u# A- {; b' {
4 00101 4:0100 9 01010 10:1010
1 m) M5 s- [7 s$ }! I5 10100 5:0101 0 00110 12:1100
- ~5 ~- r$ R3 l& z7 i. k i& p W8 o' O) n
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
- ~7 f% F' c4 N+ V, K1 z
/ s5 N1 T$ u1 e3 F e; w0 E6 Z- d3)终止部分:00110,与起始部分以及数字0的代码都一致。) a! U: K- D' L
8 D5 R( J( K) `4 v5 U2.条形码的制作过程, E! u+ u* d- B6 |! ]8 T
) } y: B2 U: n* m5 w# T$ A黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
8 }* R& ]! L L' \" o9 ^+ x
; G/ d# x& H1 u( d" d! Z定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。6 ]# C/ B. u& [, k
' C% l6 u# [7 ~: n条形码效果如图所示(程序代码见附件所示)。
$ B+ n' l L! E/ ^! S
* X4 H3 t8 K* [; I
图一 所得条形码效果图+ |& X8 L% a; N# V! f7 f
' ?+ }$ ], p& e# B. Q# {3.打印与测试+ F4 I9 a- P9 R
8 W5 j; B" r' u1 ]
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
/ r" w; w8 n2 E4 k
- E; ~* A( B2 O5 n: c" V因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
3 U* A a# M; y+ x. z8 Z) i) A6 {% m4 f; q: T9 Z& @
为了方便进行测试,本文打印出不同大小的条形码。
2 b' H8 Q1 D5 Z; Q L, C- d* K& k6 Y
测试一:将其用透明胶带粘在硬纸板上。
. b8 A+ } u& p9 e% j5 a0 H2 A8 Q$ h# k. w+ M
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:+ s' u( O+ _) L$ }4 i
T% h1 C( n, I O* ^3 t3 ^
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。% h \2 }' z5 o8 m+ ^8 {2 K; @: C
+ e" E3 q0 o7 V7 m# _3 s测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
, M& t: i; m- U y( J: {9 k9 D* a
效果如图二所示。4 S' S. n* u, L- j
! d1 X N8 t( o' A; E
图二 打印效果图. f" n% i4 v% G1 y
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
- L' M: [: T6 E* c6 c
8 P% z: q% g' j, w" u3 Y4.扩展应用: Z# r: Z0 q4 @5 N: i
) I0 W9 a& q" p# `
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
# P, X. a7 R* L! g [+ T
- e- Y( a" k( N8 N
图三 可供彩色打印的图书证& n; ^, y- ?3 _# p1 A7 W
: a- H$ h* t3 J8 A# c' O" U过后,我们会给出相应的网页版、C++版、VB版等等。$ C/ f6 `7 p$ ^3 {8 M+ k7 X
4 E0 q# C( B9 \! q) m% W( {5.关于本例的一些思考
6 a% r, O" ]9 {8 W( ~8 f
. O* S; t% W+ ?4 l% |由相关文献,可知条码技术具有以下优点:
, f! H$ X& J1 q, N
2 ?: Y% q7 g( Y: i) q4 z) T 1)、输入速度快;
. G& F" M6 Z5 B. y! w2 B
; w8 F/ S4 r! d0 N0 ]0 {# x* M 2)、可靠性高;
; g/ M7 ?1 {/ v) }
]9 s' G; h6 z/ B 3)、采集信息量大;" s4 u y* S7 g. L: ~
, h% T: {4 @+ x! z0 B3 `3 ^6 J
4)、灵活实用;* C9 U5 j, z: K" h9 @
- o+ E! }9 R& r7 q+ Y3 x3 d5)、条码标签易于制作, q" I( ^# l7 }, J
. p2 [* \& Q' e* M/ \) d4 R1 X4 t
6)、识别设备操作容易,不需要特殊培训;0 n! a* N. l( f6 f
. q) y# ?3 E6 ?) T: h% W
7)、设备也相对便宜。: Y" _2 j1 N* O0 j5 {
! |1 G+ n2 S' o+ J/ d( @因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。 _& n" P9 T5 I$ a/ S1 I. K! X
8 M, b( q+ j9 y* `9 V& _2 ?3 @ Y3 j由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。7 \7 p5 c1 T5 v6 z5 {5 R1 d; d
. L4 c4 e& b" o& G
图四:常见的二维码8 s8 h: v' ?5 r
W* a$ [* r" a
6.免责声明与注意事项
+ V$ o" x0 v* E5 m7 `9 E! Z
% r' f4 ^! E1 J6 C0 a版权所有,翻版必究。
! F: x. P5 n/ c8 M5 x, m) t
; o8 O' q1 I3 l( j3 L技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。$ u' {- a* t2 T! w( h8 l% ?* I
9 [2 Y, G4 J: ]6 V, z' X任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
* I% ~ ], b0 j) c) w
# }1 X5 z% W% r; R; `4 @7.7 B2 e# e$ P8 Z8 `4 k
参考文献
! Q/ ?: X5 }) H1 M3 i) C. E8 T1 I% ^$ q
" {' ?$ n! E' x& j[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
" J- J$ C; ?- p1 P6 U4 a; a8 w7 O- O1 o1 c1 K
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
' T: R6 N0 e0 w1 O: `' X
. O0 _% v+ V7 n/ y5 i/ a; j8.+ m& v# e7 B: Z* n3 M% f
附录, D0 ?1 q0 P0 J7 E
# A: h6 K2 k. S" s" R6 M相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
! K# R) @1 X+ _- {/ U% g" G8 I. v2 G5 {+ D) q8 t/ M( P
%barcode.m
" C/ F g& B% S c7 v" V- K" s" T& e3 m$ [# K7 \3 u! T- {
%生成学号a对应的条形码
. I& y9 ~1 N$ x
2 E% ]; _' G/ X3 Y; V# [# x a( m1 u& K%2011/09/25 13:24 BY小谷同学1 U e. i( x" m: N7 K3 L
! ?" M# W/ |( q! c* F& da='1234567890123';%学号,自行更改
/ e7 n# y! }8 U" G6 X
( G! H8 M- t0 \, N8 m5 d; sBlack_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 y3 e) ]; S- i# b
0 G* |4 N3 K9 b0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
9 K/ m) ^$ V" |+ J$ e" _. ~4 ^0 D8 }1 O+ p: \
White_num=[0,1,0,0,1];%插入符的编码
4 V$ ]# j5 Z+ r6 O+ h9 u+ G( N; g& b' i E O2 k7 U
%Black_SE='00110';
) r$ K( v1 }; b3 w7 H
& A4 Q7 _+ U! q%White_SE='10001';White_M='01001';
! F; @' D9 Q6 \* }- @$ w f& a1 N7 N! D
barheight=30;%定义条形码的高度+ a; c) _* Y- |& i) P$ y- {' k
( k6 f* x `6 U4 d% w/ Nbarwidth=1;%定义条形码的像素宽度
) `8 z0 u( e% C
$ g6 r! E* L' } V
) ^+ ~! q3 d( K; L/ _! P%可以对特定长度的输入进行控制,本文规定长度为13
0 r4 o; T, F7 a! U U, g8 z
7 a* F0 ?# F4 nif length(a)~=13% Z- e( G: V( E3 H; b2 @
! g6 C! ?0 ]% T- `: v+ i7 c* J
, n$ `' K& Z2 O7 Rerror('图书证必须有13个数字');2 v# ?( E# H6 l! r! w3 Q
! s Y$ l4 Y: s, d
end+ l8 ~: |3 ]$ ?0 U
3 m5 @: r$ ~2 k& R$ q) X: B, H8 L, }) S9 T
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
$ W4 Z' ~8 m1 M- J2 | m" ~
; S& T8 j: H3 J%为方便,直接人工得出起始与终止部分的条形码
$ s C0 A% a/ j8 o0 }3 m3 x1 Z7 `. [$ g/ w& F! z
%也可以由程序生成.
3 y8 `/ b. x" W6 T7 n0 y& B* u# k# ?4 h
total=length(a)*(7+7);
5 C9 ?+ L2 z t1 I
! s. z# k0 w! W9 B9 G1 w%条形码的总像素宽
. q( r# Q+ b6 W/ `8 |0 \
. s. r+ N0 t8 @5 \# `7 p9 ?%也可以不用求,因MATLAB提供的均是动态数组$ C9 x! G/ w5 m3 ?% u! j9 t
" K* I" P& J1 e$ a# y% t& {# @s=1;%计数,记录
2 f& ~6 K# G, ^! {
& n4 G% f& `9 J' @- U* {- s) e3 h' T5 i1 T, `% S! t
%由于利用for语句容易出现不可预料的错误
* S Q" ]! I# [ O5 X" |; {3 o
2 A+ @: h" }* y$ j%大部分是数组的行标与列标的调用问题,于是采用while循环8 ^) e; p9 G# \" l5 a2 B
$ g- R& b( i# e5 o" ]
%嵌套循环,得出数据部分
+ |3 t; [2 c5 X, @$ E \( ^4 X, [4 y; e7 v. w8 K
m=1;
: S2 r: s0 T9 |: M8 d: l- v9 ]+ _
% A S6 M( F1 k9 w: Z* r& Lwhile m<14
1 c. {* G0 F3 h- K: j
; R$ Q8 R5 o+ P
7 c+ O& F H$ s. Dif a(m)=='0';2 W' I0 t- h! X$ Q/ j
8 o5 j. x: } \, T, C2 q" Y
" |4 S! ?# k+ z7 R$ T3 P9 L
t=10;" Y. W6 Y8 @, F7 y( R9 t
* s1 v; S8 N) {! w c! b. A0 g5 u F! v' v
%若为数字零,应该调用的下标是10
# X& w# T8 w; b2 ~& F& k8 _/ V9 C* { w) B; g& X5 m' g
, H+ K# {5 V( v3 k
else7 ]5 o. l9 m* @. o/ Z& H' ?+ I5 E
# S x7 X! |7 ~' l8 f5 J6 U# |" v6 G! s! p- ? b1 T* b) a2 M$ M
t=double(a(m)-48);$ D! E0 {+ J) X( J0 t; A
/ Q* N0 j5 F3 N# _' _
%由于输入是ascii字符,转换为整数需要减去30H,即48
?) |2 o( N( Y+ f" f# m- t' D/ \' }8 h* }" A% {
9 l9 [9 |5 J# E
end) J; S4 l3 T7 C6 j8 w" r
0 _& P, L# V# x/ @; C" n" r' Z+ ~) h/ c4 I: N) i
n=1;%同样的while循环# x* t& N. W2 |; [
$ S: Z; z! \, Y7 v( J4 d' H
6 b: _, l9 M5 _. Y* U1 Z* Ywhile n<6
# v, R* ^2 W4 B6 n! @
. m% n, f% ^8 T: a1 j7 c% m. F5 l1 y) O. I0 R
if Black_num(t,n)==0
) v I X& @1 X! g
" h2 h5 r$ Z% c) l( C! m8 q% w* l% W, B4 S( ?2 G
barcode_M(s)=0;% O0 C% X& k+ G; c- o x
* t: H' v5 E' W7 L3 E/ \3 M) O$ @ q3 B' _$ w2 k
s=s+1;
* |4 L7 Z6 C! r: v
( i' H+ |. v$ {$ \1 r" @" u( _ D; u0 o) Y4 F' n
else
: t4 f5 w0 I, Q- O/ Z ? Z- b y! d8 \8 ?. i
8 V; y! I' y: H* Q$ f, C" u6 u" H
barcode_M([s,s+1])=[0,0];6 @: g1 @. x8 Q& T4 o5 |$ W
8 k( R$ y" J6 T
4 A$ I9 I8 ~/ @. `
s=s+2;
+ i; ~7 K* A! B7 i# J9 T
1 E5 i/ J' c6 N
- \6 {: b# Y5 Z: D: x$ oend
2 F% l7 x$ A" {. B& a! p) U+ h6 _ f! E& T% e' P9 a0 v( w
3 D# s' b. Z( p+ rif White_num(n)==0
* G7 y6 m& S# t8 b( i7 f# S
/ K) W e. J* p6 r! F8 X' m* r }- U
barcode_M(s)=1;
, r* L8 t2 K0 j. D( ?+ O# r6 J- u% |' F H0 o9 G5 w
7 d" X, q* ?2 I3 _- x( T, T$ Y
s=s+1;
/ W$ t2 k+ C% s* z8 h! s4 A+ L/ @! j, P& ]% i
, B( `2 \ c2 n9 T+ U$ A
else
$ p; K4 D, _/ L: z4 J) Q8 Y2 n! m3 j" c$ X& D; O
. V) |" N4 {" k2 T: l
barcode_M([s,s+1])=[1,1];
& ` p2 y; L' l- _, L$ N, T1 t9 L& ?4 ]3 k T9 z3 ]
3 v/ ~0 B! m; ?' y" h) es=s+2;2 j6 h5 I3 r M/ m7 l6 n
- Z8 s$ F u$ ?5 T" Y* D1 p2 Q
1 V! V) B$ v/ r+ M( G- Lend0 J8 B# [1 t% s6 p4 y c; |
4 i2 {; _9 e E- ?; q' v* A
# i% T# ?9 ? ]3 D% C9 p
n=n+1;
4 Z. c1 N! R$ K6 N5 E4 b6 C+ L- N
" i: m6 g3 {- `5 J7 ~4 A' X1 I2 s! @. u' Z, y% Q: k; ]
end, g# |; m! [- W( ^5 j2 K' Z
4 x( S% }4 F9 I, W1 Am=m+1;
. L2 d8 r2 p7 z4 p# c3 c2 z( K4 A
5 G: _" Z* ~7 cend6 w1 {! [- ~0 c
$ u- m" m$ r$ f( U4 u: ? @* H$ z% r! O' i
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];! ?) S& Z$ _: P( z
. q8 |2 I. u0 w%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
5 y. o6 \& [9 H: ^# C- Q
( ^5 n# I* [- k9 `# v# E8 ibcode=bcode==1;%将数组转换为逻辑数组(Logic Array) k" Y6 U. g" R
L: p% l+ ` H6 U+ X% q7 S7 wimshow(bcode)%显示所得到得条形码
' I# X8 s5 y$ c( W1 K+ N( ^+ j$ {- B' _, f
%然后可以自行存贮得到的条形码
+ o' y& ^, \6 L. w& \, k
9 Q4 [, k/ G0 R# I5 D: ?4 k%然后用PS等工具得出具有自己特色图书证啦* @$ E/ R) L/ z: B; V# p5 L
: j' |/ g& p) a" @9 W/ b$ C% C
. m- K2 i9 p% A |
zan
|