在线时间 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系列之——某校图书证条形码制作
7 {! R. t8 }7 B1 W8 h2 |- d& y, F 8 `, f3 L/ @' W& C# C
小谷同学 2011/9/25
6 @; O4 V- p/ k/ } + d" q/ T3 A9 c4 @
摘要# c {/ _, ]: a7 I; T: Q5 R
! L- V. ~) n- n2 [+ @! k' k6 x1 w
关键词: 条形码4 J( T. N1 {0 N6 p
4 C3 @& b3 O, U+ T5 \" ~/ A 由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
5 |+ k5 l/ @5 X& P
& X9 l' D" _3 C+ _ 目录, a, v9 ?" B3 \7 o
" E& w o' W- o @% @1 o* w2 i! t
1.某校图书证编码规则
0 u. ?% w5 x+ @0 g* X0 ^) |
9 ]9 H. x+ T) O4 o- C# I4 D 2.条形码制作的过程
( ~; w2 ^9 C" v ' Z! f: |% y5 Z& d
3.打印与测试
) R6 m i9 Z: P, _- W0 O; t - ]$ {# A( U1 Q) [: ~& n. i% K
4.扩展应用
1 Q P9 f H! ~9 d/ c: \" F4 M
% @# n0 C: I, q- T a 5.关于本例的一些思考
' `4 T7 c1 ?+ A; _. `3 j
: Q& |. S: t, T! f" ^ 6.免责声明与使用注意事项* Q8 S4 _$ |% a7 s" a6 J- ?1 [$ A m
2 J: U; T4 m+ A5 E. I1 \+ Y' d 7.参考文献1 D, r3 W" p6 o) E- H
5 Y' w2 J/ s: i* Y+ h" s9 U7 [
8.附录
: Q9 C0 f: X! [
: c! P- I- [' c9 t W 0 Y% {1 ?) w' O; O
' W; v5 p& g% h: A/ P- q H0 U
* r7 i( V6 L! M! f9 o# D- n& c4 n 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
2 u+ z, w C/ c5 X" G/ @! ^9 C- Q% u 9 P+ n$ T" B- q* \) I0 [3 k7 R! Y
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。) h' o( T0 N+ Y9 M1 b8 r
$ w) g% P s9 ]7 c+ G
1.某校图书证编码规则0 {5 K( r% w! L
1 t9 ~! @4 k! t+ l1 a+ L
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:' u+ g1 N3 b" n1 @" P c/ M
" k4 V( I4 A+ R8 i+ q% e ①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。" X% B5 F# a$ v
2 A# [5 `1 F R4 h ②图书证的白色条码都是一样的,分为以下三部分:
3 E0 T. d/ {8 Q
. |/ i j$ \0 M9 O' s; i5 K- W 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
. v7 g* F* s9 }, G* P3 C
8 X% ]. O8 \6 ^0 M ③图书证的黑色条码是携带学号信息的关键,分为以下三部分:3 m# b( @2 X) S7 m4 O
3 Q( {, z6 w/ i' v6 ? 1)起始部分:00110;
# O% W6 K' i. Z* D4 O7 W 1 |. R9 g0 W0 J+ }! p
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
# x' W/ v5 b: N i0 k. V 1 V c$ ~! _$ P8 l
表一 某校图书证号每个数字对应的代码
& x7 U' V) V6 A% n+ V/ Q 8 q0 W5 `, i ]# x* M6 I. s
数字 代码 代码数字来源 数字 代码 代码数字来源 - @" n$ N+ |; C, j, [1 x' J- \
1 10001 1:0001 6 01100 6:0110 / N. L4 G% k3 g2 m+ f9 @& s
2 01001 2:0010 7 00011 8:1000
& N# I1 ?+ ^6 ~' Y 3 11000 3:0011 8 10010 9:1001 1 c& \, R6 c: a9 d( u5 w5 ^
4 00101 4:0100 9 01010 10:1010 0 r) t" g) x0 F4 y, R# ]( R) U$ d X
5 10100 5:0101 0 00110 12:1100 - ]' g8 C8 D+ c( l4 S" u0 h
/ b u9 U8 d: B$ Z 说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。( _" @7 ^) s& B, B5 T6 G7 s
2 J+ t: m4 U/ W8 F) ]- t% K 3)终止部分:00110,与起始部分以及数字0的代码都一致。
R8 ~ j# }$ M0 Z
# r" a# X) V9 g/ X 2.条形码的制作过程
F! W6 R6 U. s9 X4 h2 o: Q ( H) Q" X1 w. e) w
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
5 ]- `# N0 O: Y6 [- R& v
/ E! ^) f U; S& A: i. f 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。5 |3 D' O* t# c+ C* ]4 F
& H) a8 \1 j" |) }( W 条形码效果如图所示(程序代码见附件所示)。* w* g" G" w, D5 }( @8 \2 G
m0 E$ W8 Z5 @1 P* X! s 图一 所得条形码效果图
. h0 E6 ~/ x( K j4 J r8 t1 M+ Z6 a l8 G& f# Z: V
3.打印与测试9 }* K/ N; [3 {
6 n( { g q5 P3 T( F9 \1 C2 j
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
$ A4 H1 _. z) @" c& r& c ) ^ y9 O6 G# w1 w: \$ y
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。0 _. s0 ?# j- d9 x/ Q: l
: I% a6 S, n/ q+ i) Y5 U; B 为了方便进行测试,本文打印出不同大小的条形码。1 g; m/ E9 k2 i, G$ @" w
" w: _$ E6 r$ A$ o8 ^1 O4 h* H
测试一:将其用透明胶带粘在硬纸板上。
4 P; l0 d0 l+ p, V# S; ^$ Z
+ J) N1 r# F" M 结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:! M' T: y6 `( {4 P. \/ [! d
: q2 z) Y( ^4 u! z, \6 N) `9 n
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。) |3 b# q9 @8 [& `& Z" ], k
) p1 p7 h. u# v d7 @ q 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!1 X) m. p/ i$ i1 O9 ]
& c+ @# l7 b( S2 z8 X" f, n 效果如图二所示。
2 S9 o6 x" r! n; U" Q" b. n
, ^) T1 q" N1 X, o* @- u 图二 打印效果图
/ o. F) U& ?: ]6 m% C6 a9 ^ 测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。& B5 s: R2 T6 Y" `5 y7 [
% T' L) T& F& S
4.扩展应用( q ]1 t- t i+ Z- w! S/ D4 M
+ S9 N# O; @8 k' R- B 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
! x) ?8 ^8 b/ Q9 k7 A
+ R2 j- ^: B. ^% C
图三 可供彩色打印的图书证
. q4 f5 x1 t6 H! N |$ j( `4 G- B
; d w6 T+ e) I& f, d6 |! F+ v5 K2 K 过后,我们会给出相应的网页版、C++版、VB版等等。, x4 h. y4 w8 u/ ^' D8 f# Z' V) V
6 F6 r3 m, w0 k" M: j) h 5.关于本例的一些思考" C: V2 y- G2 Z! |- F
* V3 z- g0 t' {' j" R- G9 ? 由相关文献,可知条码技术具有以下优点:- @( K2 `4 X" ]+ Z6 t$ d* y# d: F" `
% A2 l+ _. B7 l3 Y 1)、输入速度快; / w6 Q" O7 a* k9 I$ T
) D0 z" E9 N5 y9 y3 w, C" {; v
2)、可靠性高;, e8 `- |: j- N) A# H {- V: H
) G6 R9 ~. e" x: O% ?
3)、采集信息量大;
* ~/ Z; s$ u, B0 A1 U
2 ~8 ~2 `1 R2 T* F4 d1 | 4)、灵活实用;* |& y u: y2 x" E' V
$ a! y: p* s6 x/ }* d" N 5)、条码标签易于制作
( ?) v9 h- c- ^6 b9 {3 Y' }9 t
7 x! ^. S p- w6 \. G' R 6)、识别设备操作容易,不需要特殊培训;
}4 B: F, M; `0 `) ~1 W& C( x
7 A+ {/ u# J5 N; V1 ~/ m+ \; H 7)、设备也相对便宜。
) i/ h0 D$ d* w9 B
5 N% l: o) m* x( R! r 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
" W7 a' e4 v9 t9 e0 d / }; U( b& R( r) O4 m5 E
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
" Y$ R$ I& d4 Q5 F; g7 x
& e! n# c' @/ u 图四:常见的二维码! f" {0 ]7 T5 r$ Z6 _
4 i& I3 ^, w: H3 W$ M1 o3 R 6.免责声明与注意事项& v7 [0 N2 m2 d, ?6 x
* t6 `5 U2 [( l8 K
版权所有,翻版必究。- L9 C) T* I; [" Q" q5 |
8 G5 F) K4 M- h: [ 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
T3 N7 R/ [1 r
9 r/ |5 O* j$ F: C8 D7 v; E 任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 & z! G4 N7 P' @ N7 O$ ~& B; p9 v
9 |2 E5 `+ e1 F* D+ d( H& C& T4 x( G 7.
" g6 } L4 H7 e! [, d) q7 s; ` 参考文献
( G5 [' N y$ X" S/ J1 T4 l ( z4 V# U$ B: U9 _9 `
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]
4 @6 i8 Z4 X% X. y; _ : b; c- _$ v; [( F; f$ C* [
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]1 y0 T" |" _9 ^' I, G
/ C/ R0 K$ K T2 C
8.' G3 Q# U0 x' l1 L) X. H+ ]/ d
附录( F7 X1 }& D5 F* n9 a3 Z
& h+ g+ F) ]* }4 ~4 O
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
* R9 w* y) b, q! o( z * P9 Y" J0 I. f' ]
%barcode.m/ _9 ~% V* l% Y4 t
0 U* V3 w. o5 h3 t$ j: D %生成学号a对应的条形码5 e) V: J9 b' j9 H1 M4 M3 C
( F. _8 `$ k4 F) U t7 @( K8 Y
%2011/09/25 13:24 BY小谷同学3 M3 [+ K6 }! M+ P- y2 n' F
) i0 |* g9 q, ~2 E
a='1234567890123';%学号,自行更改: ^# M% ^- `3 u% t: _
" l! m; N/ k# d6 r) ^. v, L& W* d 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;; |0 O- p; ^* N, w# _2 h! r
4 b k/ q0 ?6 k3 x8 @; C- p" Q
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];%数字编码
' C+ R5 f: m' m9 N- f$ |: G
# P1 `- n! U0 H; s; L% ` f White_num=[0,1,0,0,1];%插入符的编码( L1 }% r3 d* j" k. C& M% I/ X9 k
4 _7 ?0 {! H" x/ k
%Black_SE='00110';
, O6 S2 Z# B; n5 a H
- z- _* L" V, {1 o! l %White_SE='10001';White_M='01001';
0 [5 Z6 Z2 G& Y! F+ H , D$ X3 {; a1 G6 U( ]5 _7 O9 c0 g
barheight=30;%定义条形码的高度( C+ V; \+ ^3 X& E- U( @
1 W* }" L% P8 h: E9 b: ? X2 }
barwidth=1;%定义条形码的像素宽度* @6 X7 Q+ m- m
4 n: s, g; X" X$ R/ @! W, Z$ E4 U* } 2 Z- |7 B$ [9 F5 J
%可以对特定长度的输入进行控制,本文规定长度为13
8 N' ^0 ?# I/ V" Z7 }
9 j7 C. a; M/ g# O { if length(a)~=13
& ^* f. r/ q" r D1 m$ g & @- o9 J2 y J7 W$ v
# L, N/ {4 q$ s- U9 i
error('图书证必须有13个数字');. o% z' \0 R* s6 E/ g1 w
+ O" c# b, K, X! z
end8 o8 G& b$ Q2 S1 \
4 m6 U6 @& r; E9 A9 ?5 ?
- H9 ~& @; r% ^9 K: v& J
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
4 i! T. G: Q* j; w. X G, r " H/ j& X( j8 [
%为方便,直接人工得出起始与终止部分的条形码
: p6 t+ y) x- J' |7 | 6 \, n+ g l0 ]; J2 g7 T9 H
%也可以由程序生成.
7 d# t- T, X' Y1 \/ U! P1 O: [! ^
( \) n, t1 i8 X" [% L total=length(a)*(7+7);8 O4 c9 @3 A. Q2 h/ A/ Z
j1 d$ ?# a* b) \" |1 Z! t9 n3 \: F
%条形码的总像素宽& G+ \" V; x$ Z( f: r- X
I+ }1 f- @$ @, `$ A %也可以不用求,因MATLAB提供的均是动态数组# V' i' t% `; D. x4 i
8 Z! g5 i8 S: I0 { s=1;%计数,记录
' A3 ~# D% E$ X) X6 z; C
5 M6 c) R3 {" q4 i
' H! W; V0 K# l8 o %由于利用for语句容易出现不可预料的错误
! D! q6 s) n) v( I/ `4 a
" t6 R; A0 \) S2 }% M1 p X %大部分是数组的行标与列标的调用问题,于是采用while循环2 T' v; U6 o$ R N0 v
! A' Q8 S0 O( A; y
%嵌套循环,得出数据部分
$ R, ~: R- C _) P: ^ 0 p/ |" ~, N4 @% ]5 Y* ?
m=1;/ e2 ?2 K( B0 U/ I7 W; ^( n
& k" A" {4 ?3 y: G
while m<14
+ Q# L% _7 W7 L 5 g# m& }, P* F
& [# C) Q) J0 n: F if a(m)=='0';# G: |9 D5 g; ?& Z/ }# l
+ ?" R \0 j8 C8 }% r A/ h% ?
" F* D5 z$ {* r! ?1 _" ` t=10;' l6 H# w! t6 q; t, w# t6 I" n
' Q0 h( T+ ?1 v0 n' U2 b! X
6 C( a7 Z9 m3 D6 U) J/ k, E
%若为数字零,应该调用的下标是108 F9 Q3 f" Y; c; a/ w( b
$ \9 X- N% A& d6 S4 ^# f # s" l3 |& v$ |2 \
else
9 H* J' \3 ?/ O; b N6 {3 [/ H
0 R. X& k6 a- i6 m, C' p % e9 e3 o% {! S2 F7 I( @
t=double(a(m)-48);: [7 G1 f; P" N( o4 s8 n- J
; ?+ g1 T6 E; k4 X8 E5 k7 h
%由于输入是ascii字符,转换为整数需要减去30H,即489 d; O) r# r& E: }4 m& t8 A5 S' l! o
; h" d( [5 V; _
3 i& W/ B' a' N0 Y7 C
end
+ E# A' |! e. ]) n$ n4 \& E
+ D% K- v' Q) m% x5 } ' L L( d: ]7 a7 |( v
n=1;%同样的while循环! t# n) Q+ G+ J9 Y' X! _
+ ~! e7 C' E* v1 ^
5 i& u8 q; H @" |
while n<6
9 p3 m1 M: K% u
& v- Z5 E9 u7 q- {: R2 w# B) x$ z
, |+ p& A/ m% c& X if Black_num(t,n)==0- d& I5 @- F) m" X# E! B
$ ?( t- Y- Q n6 ?- [
% e. l- K2 }0 O ]! U( Z barcode_M(s)=0;, |2 H" b8 E5 [8 o. `6 Z/ J3 ~
; @: _* l) f( @& |- i' K( K
4 q) u) [$ T' Y0 `0 c) B s=s+1;
@# C# Z5 G! ^7 S : x& y9 j' f9 B3 p) u: O; R8 G
G% v9 e/ z* j+ h4 V& ` else3 V. P6 m0 _$ O5 Z5 H$ }
7 u+ X% E2 c% Q2 U! L2 s0 C
+ @3 J2 Z. \8 ~+ l x barcode_M([s,s+1])=[0,0];
1 o; z0 n% x3 l& y9 t
: F$ u3 ~$ u+ I* r# Y
# ^, r9 j8 k& N( b. E s=s+2;
! t' N! ?: j# d ]: X 2 y( e4 o' L3 M* }
, C8 |' L1 { W4 @0 W
end
1 L9 I2 s6 l8 W
( b" m& o( b b4 I9 S
8 a) |+ e, q7 ?* U: R; R/ i5 t if White_num(n)==0
$ j, [, f! S# Z
" z5 b4 |( V* b3 p4 X 5 C U1 U7 |: D* G8 G
barcode_M(s)=1;9 A" i1 s1 J/ T) F3 r
4 ]" \1 N( b# e2 P% v9 L
& a; C! V! P2 A$ m- P
s=s+1;6 O1 k4 U9 o2 _! p
. ^* g( T+ ], t% H6 U ^1 e' n& ~
$ C" ^1 x: Q: [0 R else) l1 [* V$ z; j- |$ K4 W( ~! a
0 A, D" _' o4 A6 B0 P6 a: j/ F. A
! E$ O* _# J1 l3 _/ d
barcode_M([s,s+1])=[1,1];
) Q# X$ q/ T* o7 M- x! }$ X ; r% w* g9 o/ C- {- d) X
" G" }) U, f$ s/ {" ?" x1 ~
s=s+2;9 w: v& o$ I- G# O
1 g* R: E% h3 v7 o/ a- L7 y! H- |
# R1 g4 M8 d, K" Q
end. A5 I% m5 A/ L3 Z, ?, S& \
( @" m$ }+ e; P2 U: ~1 I1 H3 T
+ w; e' c/ R0 K. D! i9 v n=n+1;8 R( I' c' S* c* v
0 ^& c- J. ]. H$ d! { Y; l 4 K1 {: u; t4 n3 Z# q
end
/ ]: o! Q) d: s! ?& O) _6 }
3 R# p1 ]& ?: q! C1 S, }* Q, g, W+ J m=m+1;1 k ` b* E! e; |* r/ v& b& I) u; U% Z
# m2 n5 I: Q7 ?( a/ I
end4 \" S2 s2 w( E4 S
& G3 e( G g, f; `" |: u
4 p/ r! G/ H; P/ `. {
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
/ j3 ?) r: |/ t4 g$ t
! u4 g6 l. e, o' R %将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
( t' C. g3 W5 E& \" \ 3 K& b" i R$ Q. D& g5 j
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
$ T2 U; a5 g' g- C " v* p! W& y- ^7 k; p0 A K
imshow(bcode)%显示所得到得条形码9 m# X' M3 w, T. X0 N
9 H1 B$ d( p) f9 ]. w %然后可以自行存贮得到的条形码7 }( R7 D0 w. P9 T1 I( }& Y, p5 M
; t2 w. }8 P2 D* w: P$ }* Q
%然后用PS等工具得出具有自己特色图书证啦" E- L* _) {! O, ]4 e; c
5 z' K& |2 x- j; C: D' w( `; E
2 c& f$ a& z x9 v3 {
zan