在线时间 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系列之——某校图书证条形码制作 o- b `1 A4 g! M, [: s' H
3 _8 l( {9 F8 t) V
小谷同学 2011/9/25
3 D; l7 f6 K. U F. ], s4 {
* o# {! L& k2 x8 [/ e 摘要
" p5 g# ]: w& O4 s. c) l3 ^/ l1 E . z5 h8 t! f% N" H7 f* x: L
关键词: 条形码! h5 N( N% y% h/ U# l( f3 V1 U
& f5 _$ g' X0 `- |; g7 q! O6 l 由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。# h( n4 U: u: w4 d
/ X o2 L, U. z+ H
目录
0 C- u. [# m4 N0 g; n ! B( ?. s) `2 t, g9 a" n' J
1.某校图书证编码规则
, u& v/ R0 g# E4 `# e: L$ S4 b6 y
( r4 a3 H; p) [" a) H 2.条形码制作的过程1 U6 a0 m0 m/ N/ y
) q9 r4 H3 c, H, t5 } l 3.打印与测试5 n v! V5 L) _/ b
+ t& L: ^4 n; i 4.扩展应用
$ G5 a5 Y2 [2 l + ~$ _! F9 m) m8 N4 j
5.关于本例的一些思考
' G1 Y0 J' n2 w( t0 f: v" J1 ]* l
8 k1 o# ^/ b* K w9 H% a- L( b 6.免责声明与使用注意事项3 e' g& i$ S @8 f: L
$ y) v. {2 Q6 p5 d. ? 7.参考文献+ E8 p$ v% G/ M9 N6 K& M' L9 d. G4 {
) M3 c9 [; b! [% A 8.附录
) c& X" Y: v1 W* K
' a- \& B1 O0 k8 U" t9 s2 H1 `! B8 a . V, S5 @9 ?3 b' Y |) w
! ~6 n) |# w- Q 4 Q, U: ~ p1 B' L6 D5 a2 N% N& V1 T
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。) ~" F5 B2 K2 N# W; O
. h2 ]) }, M" x3 @ 在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。2 K# o" {2 X6 ^3 c
& j* M# q) ]: |/ x% J 1.某校图书证编码规则
8 C! E9 i6 o6 m" s+ K2 n
$ p( \7 d0 ]/ W' P/ N6 B 由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:/ S N8 y% b* e& m6 B& |
. @1 H; k& {; t5 f: }% p, X
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。) V1 \" w. {5 Z) t8 o6 |
9 K' \! n2 m* q3 @
②图书证的白色条码都是一样的,分为以下三部分:/ }+ ^' q0 W8 D" j6 L( R
- p" d- ^* Q7 y3 C4 a 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
' \9 d1 v% {. L }' A $ ?) h1 h. w3 \4 f9 p. ]) Q- h8 T) C
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
, a% X+ H( \2 V- E$ d3 X
3 A' z! E' `5 Q# [7 a 1)起始部分:00110;3 k% d7 D0 d* P3 g
+ m1 b; ]. X3 u. N2 Y% O2 a8 r, U' m9 P
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
; ^9 d9 o7 h& P0 y & ^* s5 V) w2 S8 ~
表一 某校图书证号每个数字对应的代码
2 K2 v6 \+ I6 N" ~
. h( m7 O" P. J% K1 p' ^; O 数字 代码 代码数字来源 数字 代码 代码数字来源 ' R5 A* E4 _: [
1 10001 1:0001 6 01100 6:0110
* B' s! x" u* E1 f 2 01001 2:0010 7 00011 8:1000
2 ?: E' K) I* \% R 3 11000 3:0011 8 10010 9:1001
* Q% W2 G) g/ N 4 00101 4:0100 9 01010 10:1010 ; T. l' i2 O6 i. e& n8 S3 @ X7 ]0 f
5 10100 5:0101 0 00110 12:1100 1 \2 h# s! K9 S% g2 ?, i
8 R4 [ G# P4 n! g1 H
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。& d, q+ U, T8 a+ B, g
8 ` @- a2 b. b3 B3 `) j1 k
3)终止部分:00110,与起始部分以及数字0的代码都一致。
/ k3 Z( q% P" v* P; I! t
3 E/ v7 j; N8 q1 S/ B: R0 @ 2.条形码的制作过程1 O- [; k5 T' {- n6 p- Y/ p
9 a% Z# a# V; w) d 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
$ K5 _9 ?5 `$ H1 q) I
/ ^+ k8 I" {# F) P5 t4 K; S& S 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
, l) U6 J2 Y5 A2 \( O# z- g $ ?0 c6 A4 x0 v7 ~. v
条形码效果如图所示(程序代码见附件所示)。- ]2 h- E4 Z' s( T6 W( s
) K/ N- s2 j. L: P1 r1 F& L
图一 所得条形码效果图! ]3 _9 |3 d+ _% k* R8 P7 h; I0 G7 [
$ \; o5 D% G6 c4 I 3.打印与测试
( L& i$ ~" m( t- _1 f$ n6 |
( m. N+ A" [( Z. r& t2 B/ R2 { 有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
" z3 I! J; o3 A- L( {1 ?; x3 g ' \3 |" |+ ?& X9 N& K
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
, _6 Y K: D/ l3 {
/ M9 X3 O! G% [: C, U 为了方便进行测试,本文打印出不同大小的条形码。
/ O' M7 ?) D) v) @- n0 h
0 N2 S$ S% D$ X 测试一:将其用透明胶带粘在硬纸板上。- d* ^; a$ H; K2 a
; x8 g% w; ?4 T' Y
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:& B3 A# S* \1 s5 K; P
* k6 o5 I# k: u0 n8 D6 q 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。$ ]. d& b5 j" o* h, A
3 `8 H) g8 v, ` X) [: \
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
3 j' p* T% T% `3 J/ S4 n ( W( V; \/ f& T
效果如图二所示。3 I2 \9 [; Z5 N1 Q% f5 H2 } H
0 E1 ]! y4 t/ p! A. { 图二 打印效果图/ r2 Q0 }0 r1 E/ z
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
+ G- E6 d2 O8 F. s+ s$ _
% ?# S0 E5 W* t+ j4 @! G; w 4.扩展应用
$ [3 I' Y% X+ x M8 E; ^. K& F
% b& [2 {& O& v" G! r 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。4 _# s8 { `1 ?. b7 q$ S
/ C8 j' A+ A( l' T, h 图三 可供彩色打印的图书证3 _2 o. I( I2 q5 h, q& y' r
' n$ G$ a I c# Y9 a- O% C! B
过后,我们会给出相应的网页版、C++版、VB版等等。4 o1 _* Y2 G" j" F3 Y% D
6 I; _$ j# J/ d$ x, g0 d
5.关于本例的一些思考/ w! g2 U X) f( k `5 \- h
! M+ J, \9 ?. ]$ \' f
由相关文献,可知条码技术具有以下优点:
$ ^, ?7 Q! h* F; S H# r: a; Q
! B8 [ k- X8 L$ |1 G& b 1)、输入速度快; ) [0 o# L/ V, }7 V% K" w7 v
5 ~% a- S( P! B- {5 t: W: ^
2)、可靠性高;
: g2 G J/ c) u% v$ d6 d. Y' V
: b- y+ ]& }" g8 y" f6 | 3)、采集信息量大;
. x! q- G% T6 u+ f+ |/ o3 K/ o: G 8 s+ G2 A, m1 W; S! l
4)、灵活实用;
4 S) ]9 A" Z3 s
7 H& W" M8 V7 [2 p/ L 5)、条码标签易于制作
0 Z L0 r3 ]+ D" G" l
' v2 A8 X% ] ]2 j6 [& v% T 6)、识别设备操作容易,不需要特殊培训;; t6 K% u; j% N( x
; H. m' Y. t) N0 C( v7 Y
7)、设备也相对便宜。1 O9 _/ F- H' l/ I% ?9 N+ x
3 o: U. h% A9 t! R$ g1 K
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
8 x( G( G% u; P4 p. ? . O. D$ _' g ]7 x
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
# j$ }" D+ u6 n2 I
9 g# a7 v" o& G) C
图四:常见的二维码
. q% n; L2 f7 w0 S- k , R" y# P( A+ n
6.免责声明与注意事项
# N9 b. @/ ?% U' ?9 M
+ }) u$ q5 O: K [0 A8 H' ] 版权所有,翻版必究。
9 l+ u9 E5 @. \) Z _4 _- N
% b7 \& `1 N0 l7 E | 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。# I/ \! @! W0 V' \3 B1 [
' ?+ r$ y/ @6 _( e- h- Q9 z3 O 任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 : b. s$ N7 k/ E7 \5 G5 y, f
. L0 G5 x! Y+ U, ?% Z 7.
. e+ \) K7 T/ z& y 参考文献5 T5 `$ u& S3 U/ _1 }9 n0 o
- z- F" O% T# K& j; }
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]/ p7 M I5 ~7 H5 ~& e8 @6 g2 b1 X
4 |# u: U) A' ?
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]; y& H- g# o& _' n. X
: z& m' F j" N& k; [0 u 8.9 e& X$ n; }3 R8 k4 d
附录" ?3 A- q$ R; |+ ~: L1 L! w5 ?& e
+ d. ]# H) V' W" o0 q* j( I% f
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):* {' ?+ g% u3 J4 ^, p% i
M4 d) t+ [9 H2 o %barcode.m
* C$ V& }+ l/ Q2 {( y, p 2 A6 u- ~$ w2 p) F* ^1 g
%生成学号a对应的条形码
: \, U. @& M1 p- Z; [ ' M0 K' f1 O$ o4 r
%2011/09/25 13:24 BY小谷同学7 N9 b, O; ^6 B8 L7 x9 K5 z" h3 G
4 i/ C: |' z5 v1 [! T7 y9 D- c! t# s a='1234567890123';%学号,自行更改& W [, _( @" A `+ P- @" F; u; n" o
* S' _) r T/ f
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;6 F* ]. B& u, Q" k* u9 q
7 V7 O0 K* ?0 _4 f& {3 e 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];%数字编码) I& A" J& h7 v- X Z
. H7 a. u' t. n: ^3 Q1 `. d
White_num=[0,1,0,0,1];%插入符的编码3 B) y/ x9 ?* K/ m- @8 a# Z4 U$ C
& ?! @4 J% U4 S$ F% g9 A
%Black_SE='00110';7 s3 Y. {0 c& u$ A# D$ h& U
3 U, o7 E4 @. V v, F1 } %White_SE='10001';White_M='01001';
! w) E6 r3 W6 R( u( Q/ e7 z
) G, M# I9 w2 q0 G3 S barheight=30;%定义条形码的高度# l8 J7 j# w* D. X Z2 N6 L
; h* V+ ~2 y$ T& ` barwidth=1;%定义条形码的像素宽度 y/ }7 F* b" k9 W: M3 h" E
0 o5 @: N7 B$ h2 d1 N' Q' a: ~; r 4 q5 o! @1 g. k
%可以对特定长度的输入进行控制,本文规定长度为13
4 R# X, \7 H* y5 _9 y ) T3 X# Y) I* M( I% d
if length(a)~=134 y' x# i0 v b* k! _- e
& T: S( Y( x0 W( ~: V
$ b+ y8 g# t. K2 q' l
error('图书证必须有13个数字');
7 b* O- F. H% m7 R& H ( P G$ w0 X3 a( Z) ~7 T
end
7 ]. ^8 b+ g# y& q' {3 i+ H % q H- V7 w8 L5 G' |# ^ Q! Z
/ a+ G8 B( {! a7 }+ y
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];* J5 j( m3 U4 b8 a; o
& E; P3 s/ x8 t8 u. g8 k; c
%为方便,直接人工得出起始与终止部分的条形码! ~. z; U6 d8 `4 G5 }
! c8 g" z( a& j/ [; e& e: ]8 ]
%也可以由程序生成.
, S! L8 m d: Z 4 w" S5 {/ U5 m# X
total=length(a)*(7+7);# \( g6 @% q% @! ]/ n
- W6 z( j2 q% k0 N$ r %条形码的总像素宽
. G. [2 q; ~) l) u
. g* [- p% t- R& y& O %也可以不用求,因MATLAB提供的均是动态数组
2 S# K, j, E3 c. r & u( t* d8 W( ]& x/ z
s=1;%计数,记录
% w: z) h w# f* R! ^/ h: G
& w0 a9 i2 A0 ?. I3 U {0 p6 Z* K% E
* K* k6 J+ ?9 ]1 {9 V4 f %由于利用for语句容易出现不可预料的错误 @/ W, {: F& z* O
" c- m" w0 U9 b. |5 Q) ^
%大部分是数组的行标与列标的调用问题,于是采用while循环
Y) u9 Q z% J' b0 h
' j- \2 U; i9 n7 G9 m: }; A %嵌套循环,得出数据部分
( w1 V |) V, L) G O
8 | v# ~1 P+ l m=1;
& E8 a. P3 M8 Y( v; y) l! s$ W
6 J1 o2 F: S' y/ \4 p9 i- r while m<14
, b ~& ^% `' ^4 {$ `' n+ ]1 n( l
; o$ u$ _ w6 F% I
& P; s$ w) @& D) Z- q4 M9 o6 W5 B if a(m)=='0';
7 f- s8 |+ B! R7 d % { x1 P6 Y4 C
' ~ J* U I e b `8 ]
t=10;6 ~7 k9 J* {( S$ R% B) o# h
7 S$ g$ ^! b8 B/ ]( q) [+ Z: C& w
, L; c C3 I2 Y1 M %若为数字零,应该调用的下标是10
7 W9 {" e- e0 W+ i& Y9 y [ 9 r" p% e+ J& @# p$ J
; W# E# m5 m5 G6 \( c4 l0 U else
' s9 X j/ ^4 n+ H) v+ l" G# K8 {8 p - ~: j V$ r) h/ Y [% Y+ r
0 _( D7 R% ?8 _0 t. M) g t=double(a(m)-48);, I+ V: q! H5 m, u6 K2 U( H
$ l! v) y# `* B6 r %由于输入是ascii字符,转换为整数需要减去30H,即48) b0 y, \2 z @1 { b2 d" G
; o+ d# P7 T8 L, ^7 ]* a \1 f
6 v/ `. C, }# Q) W- K0 [$ t8 L9 Z0 b end
5 U# w, |2 l1 Y0 k7 @+ g& E. Q! w
|: D |, @ G- y6 B0 i. T 5 R" @! ?6 T6 x" j* z: M
n=1;%同样的while循环
3 U4 ]! v" A" c ]$ i0 C3 D
# G4 [$ j) G; ~ Y: a 9 Q/ y4 i8 z( I, u8 _) e
while n<6
7 M$ I+ d2 u |2 p5 x
% d! U Q% S1 ^, |% p# [* F 2 X/ R1 |+ u+ O1 J+ k& k
if Black_num(t,n)==04 G7 h% n% F. E
9 S) V8 J) U/ n- c3 T9 j$ q - P( Y0 l9 A& T& _, V1 ^
barcode_M(s)=0;
. M& y6 c: C# a# k' x
' q# k# |0 |8 |* U2 c: W3 w. j6 y 3 Z3 t9 S2 S O2 N. ?% h P0 |2 s* g
s=s+1;
5 m K& ~0 ?- Y3 u* z
3 h, u% |8 w4 y. s a8 e
( ^ ^# D6 d1 W7 A( T else
: X( Y' y8 q. {+ V 6 T- f4 I z3 O2 n" Y, q) M2 V
! d' w2 s! _ _! j3 a9 Y* Z' }+ B
barcode_M([s,s+1])=[0,0];4 Y: q6 I& u8 f
7 g0 u7 U6 D1 |' x
# Q v9 P p" Z7 S) F* Z I s=s+2;
1 e- N; x w; e; x6 o' r6 q " e! X- t0 P) V8 X& r
/ ~0 g2 U& \' W- ?6 ^7 |! Q& O
end4 V' ~( S8 K4 t2 Y0 F* \
# k+ B: [# z8 G. I0 Q* s' U( m) @4 a
8 C; m! U x; g
if White_num(n)==0
4 Z& ]4 z/ K+ `. d* k
. r N9 V: \ W- n) L $ a2 w+ \+ R7 I r2 t- h5 T7 _9 v8 N
barcode_M(s)=1;
9 {! c6 c& B5 C+ y: ~1 e/ o; X+ w 0 q& l+ `: x; R3 D: c
$ p% U- T" z9 [) } d$ J
s=s+1;/ q) R2 x! N! @4 |2 `6 }8 K7 ?
+ }7 G6 f) g1 c: b% h
( n7 d2 Y8 i7 `9 A$ j
else6 q5 h: d5 [0 Y: S* K$ G. Q
4 V( {6 Z: d5 j# W. S) t$ C 8 N* G0 p+ I. [8 K3 W. Y5 t
barcode_M([s,s+1])=[1,1];/ J1 N2 v* @. c
- b% J8 y6 U2 S- t% o7 O
& {' z' @( V( N3 J4 R s=s+2;
# v! W7 @# G o' B7 I% @7 m
$ L' u: z, Y+ \7 h . E, {) q6 i% c4 X
end
! K; C! m* [. x l" B$ c' P" M / K& Q3 M4 W$ B) Q: J
# s( r2 J7 w' A% v! `* W% { n=n+1;
, [" a' R% ?3 `; F+ g& K% V
' v$ D4 M* n7 e# U. t8 f* E* H . Z) |3 }2 \* p$ B
end- {; ~2 W: u. h- w6 n* M
. n1 e( [6 V: J2 f
m=m+1;
" Z# L5 L$ M7 `8 @; c+ K / }- ~: t0 ?) u- }5 U
end
: W1 K! w' D% c- u2 Z# B) A ! l+ p, B3 L' k
4 P& s) d9 `; G8 n" Z# _- r
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];. c& Z! j) V) V
% X2 {/ E1 b4 @0 ^1 M/ J %将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵: ?9 O; B* P% }, A
; `7 R3 y+ Y. A' b9 Q$ ^
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)2 a. P3 s( v* d3 z K3 q0 f
! Y7 Q" h0 C! l& _, U imshow(bcode)%显示所得到得条形码
- q8 D5 D6 [* F# |5 |( ~! l; f# ]1 x
0 N' c3 c; z, B$ G0 G! r. f) B %然后可以自行存贮得到的条形码
; B5 M# o9 t( b2 v9 A2 X ; d: g9 v, s& ^' v! |! C
%然后用PS等工具得出具有自己特色图书证啦
4 y" R8 M" K/ d! g' i- K & @& L n/ J+ Q5 g- B
4 o' `, M8 ]3 a$ E
zan