- 在线时间
- 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系列之——某校图书证条形码制作
* c: d5 T! H2 q% [7 k1 f) W
) _7 A3 T0 F- C3 i% S% i. \小谷同学 2011/9/25
0 u6 ~; X0 C4 D. _" ?5 Q( P2 I8 m, i# n L$ [
摘要
) M2 K/ P# W( u+ M* a0 x( `4 I% d
4 a* O/ y2 k' K" c6 n! E$ g3 f关键词: 条形码. {7 I. ^. d y$ D" j1 y+ c0 H
9 d* Q# s% \ A- K4 M h7 W6 d
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
1 m+ U) o$ x; M. M9 N
9 Y& b$ D$ m: D5 W3 m4 f目录
`4 _# R& c' y7 p1 y3 g) l& H4 z7 x! c# p" h
1.某校图书证编码规则
. B) o+ l! L+ R0 Q
) s" ]* u. b1 n/ v% N/ m2.条形码制作的过程
1 _9 U: I' B* n9 Q! t* g k: a+ r- s0 E/ v$ ]3 ~
3.打印与测试# w8 T# U6 w- W
, [9 v. _) z2 i4 j
4.扩展应用; K8 u9 J& M0 e U& H
~+ ~1 T$ d" N+ H8 r& f7 T$ v
5.关于本例的一些思考
" j% v- X; B) g a5 U: j _7 V
# ^: [8 A, @/ F* M$ T- \6.免责声明与使用注意事项# [+ i5 r0 ^# o3 |' r: Y. |
5 @4 R+ c8 T+ A4 p* U7.参考文献
6 \4 y1 j0 d, ^) }/ U
' v3 c2 Y# d/ ]5 O0 N8.附录$ m# I0 T: E/ K1 e& m. V
- x b u V; j+ ]: W! W+ G( l( C- g2 Q4 `5 E& t% {
8 E7 L5 K0 K3 h. E m( u8 F4 m( V$ m5 W6 x
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
0 O+ ^1 i7 j% B! H" q3 k# }8 [+ m, a- R B; W/ Y' p2 d; h3 p: v
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
3 j$ c4 i# a% L2 {% N ~2 S2 @$ D# L% v4 w7 P# ^
1.某校图书证编码规则
6 m- W2 _' h- \; [4 g1 I. i, e6 L% q4 e6 p; E( s# O
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
# T$ {. G# Z8 V/ E! `* B3 Z
8 b" N9 X4 b# |+ s0 \①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
* X' W7 {$ }5 z( ]
* k! Y5 E& `1 Q2 y& s7 n. h) M②图书证的白色条码都是一样的,分为以下三部分:8 T' M$ i& L( ]( _
0 K7 t+ H2 L1 c1 P4 N1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
1 {; ^" j& {* d& u/ d- O6 q8 X3 Y2 _ y) w9 a: N9 p. D/ [
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:8 S' B" Z3 e: L1 [: r3 b
; H: [ ~# B, L$ k% o; I8 c/ g
1)起始部分:00110; g* q5 u6 C; s% d8 z
9 u* \9 f& S% x) O
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
$ n# X3 v& c- A0 u7 B- _: L- q7 F& X* O% Z5 z
表一 某校图书证号每个数字对应的代码
" o+ u) g9 K- W/ L
$ r2 ^* z) c# c) M: x/ N数字 代码 代码数字来源 数字 代码 代码数字来源
6 U6 i) N% q9 X5 v1 10001 1:0001 6 01100 6:0110
& [( f& s# m" R2 01001 2:0010 7 00011 8:1000
2 Q. G' |# i& p- v' i, Z1 g3 11000 3:0011 8 10010 9:1001 0 S. W1 N$ u7 I& z: Q% J
4 00101 4:0100 9 01010 10:1010 4 v* C8 b1 i5 @5 d& V7 O8 I
5 10100 5:0101 0 00110 12:1100
4 d- c! m# n3 P; m$ [: h% @2 a S' G2 a$ n' p9 v
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
! I/ p2 H7 w% X# J9 V+ R) p) V2 p' J3 f8 D. u, A- u
3)终止部分:00110,与起始部分以及数字0的代码都一致。; u2 @: T/ K2 R2 f6 f. V0 L1 Z
( s: V, _8 L: K2 f
2.条形码的制作过程
: D/ E0 m$ G) t
8 c1 ?+ h1 a. h: Q: w黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。/ ~5 e$ ~3 R# T" a+ D
# e( k9 N( m4 J
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。7 \( L& ^$ E& M. G/ A
+ b( x1 O) @+ s& h: t3 s
条形码效果如图所示(程序代码见附件所示)。, ?9 j" U# x% Y2 \2 E* R
+ _1 E9 B) V5 d图一 所得条形码效果图
$ z7 ~! t! A- @) ^6 v6 Y1 x
! k7 a2 I' t6 y- g# d5 \3.打印与测试
$ w3 v' O4 T5 H+ n* U
( h6 Z2 ]* x3 B有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。 u' t4 E) G# f( Z% P
7 y( ]$ ]* y9 F& w. v7 W因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。% I0 P* `0 _9 M1 K0 i2 [( j' Y
7 Q0 ?4 T* Q6 ^/ j! e1 n* R% ?5 g
为了方便进行测试,本文打印出不同大小的条形码。5 B o; v7 @6 F. T4 P+ w
8 T! n; |; f4 C测试一:将其用透明胶带粘在硬纸板上。+ s' O/ v7 \% c! ?1 v1 U! D/ q
$ q% V2 [& H" `7 e/ b结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:1 N7 b, R5 ]5 _4 G
4 v% y3 X) q9 J' l6 _2 e9 `图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
; \/ c U) m1 K% y3 i
7 a5 e% ? x+ [: G测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
# _, T/ w( F# D2 y7 b7 R2 y
) C0 L+ A! a/ ?" K2 a' l0 @, D8 ~效果如图二所示。, F5 c' g4 M% d$ q* W$ V- \
7 k5 y5 u6 N/ m( P图二 打印效果图
6 N2 S7 L3 M" f+ d' k测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。" h; b1 n. p" n6 y# U) B" o. S8 ~
4 n# g3 Q( r9 Y6 ? x/ e* ~9 S( ^- O9 \
4.扩展应用8 ^" Q1 h: S0 z9 K4 q
2 z' @7 J% C7 Q' j3 M
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
( q O- V" a. s. W* o
& i& l8 }1 Z$ {3 U- `
图三 可供彩色打印的图书证
. U8 y, J) w, z; l) P- V
9 S( `) k4 {& V8 {& R过后,我们会给出相应的网页版、C++版、VB版等等。9 e E+ [5 e& S% t
3 O+ D. m5 y, c5.关于本例的一些思考; I8 y! g% B& a
% e' y% }# c; d% N' s4 C# r) }由相关文献,可知条码技术具有以下优点:. _+ [7 j8 I2 u% ]9 j1 \
" Q' H) b: ^ }$ `' ~% @8 ~. [, ~2 z 1)、输入速度快;
+ t5 `/ V2 a# K/ n' h# ~1 p: n& ^* O
9 J# S7 e! \6 }" ~+ m 2)、可靠性高;
! g4 t) a) b( d( w! {4 z
( ~! c" W/ H4 [9 ]; t: z% k! f 3)、采集信息量大;
6 p! c2 v: ?8 z5 H2 t( q0 v
4 t! x0 ^$ ]5 Z5 v( I( V 4)、灵活实用;
; q9 ^. z3 ?$ [ a3 v7 ~& i4 J( x) v1 Y" \
5)、条码标签易于制作
: S: c' N2 T/ C j; d R i$ j
6)、识别设备操作容易,不需要特殊培训;; P/ ~7 u( b7 \: c) y l# v) e
, I% |$ o" \# @* O7)、设备也相对便宜。
E! L2 r9 S- p. K9 I* ^ q' S2 N- k7 ~
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
3 k8 a% C: p+ a& B. F# E
; h6 Y, I! @1 X9 \由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
7 f3 I c) S, a) g) m: A; C" y
! w0 i4 q( s: P' `6 `9 w
图四:常见的二维码
7 P9 [( W5 ]3 [. ?6 B. t7 H
s1 c, A7 N( d) R6.免责声明与注意事项
" M1 u9 _+ D7 U
" r$ p: y/ ]0 }5 W }$ |4 g P0 I版权所有,翻版必究。
- N0 @$ q Z* R2 g$ b8 W3 f* D% ~+ G4 C
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。7 W- Z4 O3 y5 S& A0 E6 v
) R6 z! F* X9 }$ K任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
r/ K4 r5 r) L/ i& r) ?2 X; q0 C7 p8 q% u, g/ s0 p5 r! U h7 m
7.) b4 g, h$ R6 F3 C- R. b+ u
参考文献7 ?3 H& O8 y+ M8 `
# _7 t. z/ g) d! f0 O
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]5 Q; x4 r' c+ @) }
/ o1 F% M- V& P# e
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
) g, g. N1 N. \% v7 o) v
; u1 y, l7 A& L% F1 f+ ^5 z* C8.
0 r) u4 h/ R! B- q) y) C附录# x$ s2 Q/ v8 l9 s" _7 I6 U
^9 X' c2 d( ?9 d2 \! K# `) q F相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
6 e" Q/ m3 c* K7 S G
/ `" m0 i$ n K( s, ^. l6 L+ {%barcode.m
! z- }6 V: e6 e* [( v/ a( q/ e+ o& @" P% j/ N) ]+ f' ?
%生成学号a对应的条形码
5 u" R+ x# D. t2 [" |
% c2 P R! i3 l# `# `%2011/09/25 13:24 BY小谷同学8 v, l" c5 Z& ]+ v2 I4 b' v C( V
3 D3 s% K7 V# ]; ?2 E# c' S
a='1234567890123';%学号,自行更改
3 y7 y% C; f3 `# _; Q) Q; b$ Z* d$ o8 Y- S3 D7 c$ B
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;+ c4 j+ T4 a( K% {% k, A, p% u
) V# e4 n, j" h( Y. p( 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];%数字编码
- T5 `% O# d; p S t
5 G, u0 g2 h+ o- n% s: Z2 A/ CWhite_num=[0,1,0,0,1];%插入符的编码/ @' ^8 f5 _/ P
2 y- ^2 a) @7 _7 a( A& \& g
%Black_SE='00110';
, i% l' e. I/ w( X% J3 s* g+ R( i3 F7 ~% j3 o9 W [( b3 k7 {
%White_SE='10001';White_M='01001';6 A8 ]0 f6 T! i+ }
- V3 w) L* h" w8 P* h0 g; Mbarheight=30;%定义条形码的高度
3 j0 q6 b3 j6 P' x, m5 W% H
5 R; `/ U/ x/ `% w- r* B8 Rbarwidth=1;%定义条形码的像素宽度! k. W5 s" B: D+ T
" H; J# X2 Q0 ^: \- }$ H2 u) }, z) M; }. n) d; n7 k" \" g! C# @7 a
%可以对特定长度的输入进行控制,本文规定长度为13
& w1 m& E1 ~( {' K, C) a9 S" Q0 x7 e1 ^3 Q% o; E2 J
if length(a)~=13
) ?1 ]- Z3 O; R+ ]. c# u
3 l. T) [5 z( S* ^ B5 ~7 ?! v( [# D# E8 y8 f$ q% I
error('图书证必须有13个数字');( t# q! K1 Z' f
3 `9 W/ @% I& T" }# P7 `. h8 {
end
& p0 ?- X/ d0 Z6 ]
- } d5 a8 B; \- \4 d8 G, p6 A' f3 J! J0 e: i
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1]; e6 L$ w) z, u- c8 L( T
! Y$ H0 T; E) J1 P1 ^$ p! _1 k2 L%为方便,直接人工得出起始与终止部分的条形码
9 I! B: `& {) \, V8 p9 y3 M- \4 q5 S$ z" y) C
%也可以由程序生成.2 ~! {2 R5 M V
* \; f' l' M+ P6 ]total=length(a)*(7+7);
& b8 J* T: _ r. d+ U4 Y& ~7 X9 W, B) `' n) R
%条形码的总像素宽
3 }) b1 \, v- y4 `% X5 }# J. H& g% z+ S
%也可以不用求,因MATLAB提供的均是动态数组
0 X! ~# v5 b V$ h/ u- U* V- S1 ^+ H' N0 B+ I+ \
s=1;%计数,记录4 P8 |' j7 O! C
) R7 n S0 h( [9 c G. C f& _
, N9 B7 F8 S- F; I* F%由于利用for语句容易出现不可预料的错误# v, C* v' c" y% I2 u0 E; d5 f/ |4 b
$ |' L, \7 Y, n2 X5 L) @%大部分是数组的行标与列标的调用问题,于是采用while循环
4 o: ], W# I a _5 u% J: M' G8 p: w( j7 R' M R
%嵌套循环,得出数据部分 V9 b4 W* [4 R( T `( d7 X
9 @! q% l! Y' Z0 Q+ p7 A) Vm=1;
6 z7 h0 }8 d1 r% e' v: H3 Q2 J/ B; V u/ ?
while m<14
0 }( D# q1 u( P: ^: m0 I# m* o; k& U9 c1 w' |: f" T. t* V% y
/ o5 u! x# o* G( x
if a(m)=='0';
' _* w/ y% j4 j: h5 g$ C5 {
1 D* S$ Q+ O; r, ?9 ~5 K/ A
~4 E+ D$ n4 G' A2 C, m# Bt=10;
1 C; ~3 Y% F* z1 ?4 ]( O7 E9 x- I, z8 t0 Z8 I
+ ~0 g+ l0 T' l) F
%若为数字零,应该调用的下标是10) R0 @! I8 n( `/ j; M
4 E" y& }. w f$ z
f$ `7 O' ~4 o2 S" Telse
% Y; t9 I5 z9 v
4 C6 Z7 |% C# |
* ` {" M( o3 [9 V% J; qt=double(a(m)-48);
& L/ y2 e5 w! S9 A# K4 O7 F: |
) t5 ? a3 U2 J% b7 j. i5 V6 W%由于输入是ascii字符,转换为整数需要减去30H,即48& H" p9 t: K2 b3 ]5 c4 f5 U- [$ y
* Y6 D9 I2 K0 y1 Y/ k' S1 J3 |/ \8 y: }; x
end) K+ g9 W, D/ u7 g# ^& `/ J1 a
4 J; V0 W) `& W G9 S" S* C7 H
+ c& B: U- O! K9 A% z
n=1;%同样的while循环& \" U; }3 H( `7 A( }& ?9 X: f* w
6 l8 I- Z# f6 T1 i% C9 c" @# j& v
' `7 \1 O \4 Z ~while n<6$ C; Y1 u+ H a8 C; `
& o2 V1 y$ }6 M
" B" G3 X5 l7 I: J) I" Wif Black_num(t,n)==0: T6 C, _ _# t5 J9 @0 c
; `) G3 q8 t" T' {+ n* b
& d. k& z/ Y( w. Jbarcode_M(s)=0;
7 M E, N! [/ V8 r5 l, w* X% h* Z) S: {! z( _5 @: k* A7 k
' P' N! x+ E% b
s=s+1;
3 O' ]) [2 C# b# S+ f3 j/ S2 J. _6 k* f/ p5 c3 m: D
- f u% Q2 e, V0 q8 a) Q
else, Z* h; ^ `6 ^* s+ {# g
( [: {4 h/ K" m
( x( N5 R9 U7 _3 a1 V
barcode_M([s,s+1])=[0,0];
+ x" d& K: m/ v X4 A5 Q( W* y, u8 P
1 p. C$ ?1 D2 Y5 z: |4 ms=s+2;
& X* Y9 {' r% Q) b. n7 \! g2 D" |6 z' @
4 h- L3 R3 m' y5 P3 H2 g% r
end& {" {' z* U( S
" a: L2 x! d% f6 x5 ^
. B' t+ h9 E' T n8 Jif White_num(n)==0
# B$ i1 X( a& q% n/ t6 l
4 U3 i* c, I# n! `' B( n1 {; d" p0 e; }1 w* U2 w' a0 N2 X( ?
barcode_M(s)=1;
' Z8 p. G; q. `( T2 q* i1 x( _, L( H4 N9 m; F$ M; X N
* K, ~- @1 x% ~" A4 [! n
s=s+1;
: f- m$ _6 J" k4 M3 n1 C- g5 r+ K6 T- D! [
+ n) b" r3 H0 J& P- U/ s- d3 V
else
) l F z8 z& v( R) Y
* P3 j+ S# y4 T7 {, N4 D5 R& N
2 t8 W6 F; r( k( x. N' l- ^9 p2 tbarcode_M([s,s+1])=[1,1];' i) _; Y$ P W, M* e3 B. o( \2 R
# A& j0 v E( c/ q! {# U
% k/ |8 I* {& I I+ ds=s+2;( z3 S0 V$ x+ v
# K$ n( S, m9 c3 y0 t# L" K% Q
6 h5 r/ o! _& R5 \, E7 nend
4 S- u" w1 ^" R8 h4 U% ^$ p
5 U% v% L& A7 E3 C; L
0 U% a$ d7 @8 J) w; @n=n+1;; A) @6 ]+ v, w5 E& ], I7 ^7 r: a. _
- w0 \! F* H) Q5 u, S
( A/ d" M; X0 h( eend( `4 s6 @$ }8 {" y
! p" P5 i1 w7 `# tm=m+1;
5 k% h$ y! E8 W: [3 B3 [( L
. ] j+ ~, W+ Y) Nend
$ a1 g9 b, r3 l5 X
5 d! s: H1 `) I1 A
! }9 Y; f; d& h! \$ jbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
( Y/ d: \1 p) ~( U& G Z- P, N. r3 n" E# T* `; L9 d$ Z5 Q; Z3 C
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
X, \# M0 d8 w6 U+ O/ S* s+ c2 j0 o" O. [$ p
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array). c: Q: [( F% i( d
! a1 ?4 a( B! l+ a
imshow(bcode)%显示所得到得条形码, R7 U- G$ b: `1 p$ g, U
$ V3 L* d! F8 R. b) `- v%然后可以自行存贮得到的条形码 k1 L7 n. V# q% H r1 f
! R4 C$ P9 j. J
%然后用PS等工具得出具有自己特色图书证啦
4 \! \5 c8 H2 H1 F8 T
+ e/ T7 K6 _4 ^+ j+ {& D& X8 B5 [: f/ E' F+ ]/ u8 O
|
zan
|