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