- 在线时间
- 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系列之——某校图书证条形码制作
, P* z9 v# i3 m) y5 Y$ v4 }' w. e5 x: ]8 x3 @ L" s
小谷同学 2011/9/25- S$ t5 w0 o; w
# Z1 N+ D* ~) z3 N摘要( n8 N p5 Z( H: b: w: F! Y
! y( ~3 @- M7 K4 ^6 ]) G. g
关键词: 条形码
) m! M2 y* c$ L& S0 J
* p7 I R0 c3 u3 t+ F/ B0 p由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
# E% [3 \7 r, y6 o
, u2 ?) p$ n7 I6 l. }$ P+ A* D目录
/ r, |/ r0 ?0 e) B/ w/ f3 v7 k4 ~( i' r
1.某校图书证编码规则( g) }# Y7 I' D+ s& D, p
9 m: h4 A! S; x5 y' [/ @( X2.条形码制作的过程6 j' y# U& u: u, v! Q. Y: N! T; n1 P
2 s& y6 o* y$ B4 {3.打印与测试
5 c0 {* l! D! l0 E
# { H; [1 R+ w. m2 s4.扩展应用. k* E8 q3 l5 `2 _, |3 b
3 ?: I1 | T& G; D5.关于本例的一些思考
. Y$ |% e+ ^6 m4 {1 w% J* K: ]) H2 @4 y- h a9 U1 J; x
6.免责声明与使用注意事项* Q; n& c3 O" u K/ F
5 g" x* ^3 o: |6 ^5 O0 T
7.参考文献
4 ^, L5 z" i) e7 S. \# J* `' ]- {# Q& G4 |/ S. y- Y5 e; ^
8.附录
: D8 ^0 A7 s# S# n* D) q5 K0 i; _- g
. Y7 |- s# p, r8 a2 E6 Q! X/ O
* [7 `* x! O7 w6 U
% y a% {5 B: p# \% z
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
& j1 F* P: {8 V6 r8 U9 ~
. q8 X, V! M& v' s; w; @在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。- ~6 b+ r. z6 L1 U
8 f$ t# t$ Q' z
1.某校图书证编码规则' V& _/ L: x: e
: s% h* d7 d$ T0 q
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:1 ]4 `$ X1 z/ W
" v2 K% t9 U6 t) X# D" [
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。' |! p6 Q `/ ?7 n; \: i: t4 ?' {
( F R- a& }$ e, V②图书证的白色条码都是一样的,分为以下三部分:
9 b9 [& T' a* X% Y; {4 {) w
+ z0 g4 M9 ~- r! Y1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。* j( S4 [1 `0 W9 W1 a3 e# d& }! e/ i
4 k4 ~4 l( P& D' `
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
7 c- V+ M4 {* X2 E
5 y a( Q/ Y% d/ A( L% {7 p( g) A1)起始部分:00110;% @& z! Q r* H0 R* g1 G+ S! A
' _ |9 p+ E; C9 V; k" {/ h- K2 @! r0 k
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; ; i/ J9 t, }# _, ]
3 x& z- p# B- j$ k" A
表一 某校图书证号每个数字对应的代码! z4 i* A; f* Y
, X& K' K# J5 g+ w
数字 代码 代码数字来源 数字 代码 代码数字来源
7 q" }) L/ a5 W' _3 r1 10001 1:0001 6 01100 6:0110
+ J' y- k" j# ~0 ~2 01001 2:0010 7 00011 8:1000
6 _8 N6 G$ M$ E8 ]$ ]3 11000 3:0011 8 10010 9:1001 ! v! S4 Q5 n5 {3 k
4 00101 4:0100 9 01010 10:1010 0 D& U; w8 p4 ?% L
5 10100 5:0101 0 00110 12:1100 . n" m5 K/ u, ]; }$ h, P. F
$ A' B6 V# d+ L4 L* G4 A# \" G( J
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
5 a% M0 W3 O3 r# v- ?% ?2 w/ ^- d* e, y U. M! P
3)终止部分:00110,与起始部分以及数字0的代码都一致。
1 d5 |5 f+ t2 R' I& h+ B
% L$ v/ |0 u/ T8 Q3 L9 G2.条形码的制作过程1 I) f" l( P$ ~; K+ h2 L( J
+ { R6 C6 z0 j. K. X. \
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
, T3 W- D: Z0 q: ?' L1 r4 }5 z1 B% T: Q; z# O
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。5 v. W; \" r- V0 X# |/ _
/ g) y z! |8 y. j) Y条形码效果如图所示(程序代码见附件所示)。
- z0 R/ M, o6 Y) A+ h
0 i& V, s* D6 m9 b+ D/ K6 K* b$ n5 n
图一 所得条形码效果图6 Q' I& s8 v0 y- l6 ~7 e( s Z
' [% \4 S5 J+ B. R5 n) z& l3.打印与测试
2 U* u' E8 ~' B5 ~" x( k" c; Q9 _# u% V: g9 N
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
, e3 c2 Z% R- I0 K6 t
( v) t4 W3 P2 k/ u/ }$ N+ o因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。* j7 S0 T1 C% {2 U/ L: J7 T3 o
' D. l! j* M5 C' |: P9 _! U2 q1 ]为了方便进行测试,本文打印出不同大小的条形码。
, E; n: t. x" E* u+ g2 k4 h; E* u4 t& K- D. n' B
测试一:将其用透明胶带粘在硬纸板上。
7 y$ [: I4 w; i3 T3 e& t9 @& \- N
" @) _. K: b1 Q% O( Z4 E8 f* Y结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
: X4 A# F( ?9 h2 H1 T& c2 @
: p% ^) L" e! F7 t( Y+ J图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
2 G& V* F" k/ c. |( n' {8 O) k4 _/ p& H6 ]- b8 H7 t# p9 m; O( S
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!! y* |! }! J: j8 o5 e0 z# P
) Y$ f9 [$ u' w h
效果如图二所示。
R0 ^8 v5 X( R# b* k
* c4 O: P b) l! E
图二 打印效果图
$ c' m) i( \- d+ i- @测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。1 _: H% x) v' W4 t% d
" y% v& d9 Z8 I, \1 h1 K) v! j
4.扩展应用
" }) ~6 p* b! }% B) F- ^3 [ u& d/ ^" q9 V( s4 ?& P8 V2 h. Y
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。1 p/ r8 q: Y1 K$ I
; {) U' H% J* f# g图三 可供彩色打印的图书证
2 g- {/ V, U$ j
/ Q5 j5 ?/ r' X5 S4 T& t( V8 q! ^. b过后,我们会给出相应的网页版、C++版、VB版等等。( Y( P2 T8 {" m4 f% i; }& n
1 Q3 M3 b8 K5 J: ]$ T |5.关于本例的一些思考1 c! ]# j/ A5 G6 p+ _
& x8 `* e% e$ {* m% J
由相关文献,可知条码技术具有以下优点:
% B' G/ ?# F, m. K2 `" w. V
0 U$ C: g* u* {! I 1)、输入速度快; ; Q5 Y/ `( K. E1 p
& a" H+ D5 a7 _+ r
2)、可靠性高;
; n$ h( ]4 h- _4 \6 H! _2 F) ?/ c7 [7 U& U4 U0 l$ S
3)、采集信息量大;2 n+ p1 ~ Y) d% V
8 s& w( b L4 e! Y% k# ^" I
4)、灵活实用;* }# e! ^% }) B
4 U7 k2 s: a& d X% ~9 R5)、条码标签易于制作
' [" A) @. K7 A# O/ {) B1 P: Z6 ~) j% }. Z. M: A# ]- I4 G
6)、识别设备操作容易,不需要特殊培训; X+ i" u, R2 Q7 j
2 t* ], |5 Q2 h
7)、设备也相对便宜。
: M v' ?; f. O. c) Y* r9 N" g& d2 G8 W7 G& [2 l2 Z' [. s f
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
3 K' V" X) W2 @2 B: {. [! m! g6 @9 ?; M( B% C
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。6 w( h9 ~0 E7 {9 e. ] |
- g4 I. \: D' o2 i0 |0 z
图四:常见的二维码
6 ]' m c# w n1 M' M
* T, {, g" a3 O% _* ^* {9 l6.免责声明与注意事项
, Z; |6 Q! N3 F7 Y! A9 K9 P
1 s" ^: {: C$ b! U8 c版权所有,翻版必究。
. V2 T2 Z- F B
: q2 d6 P K, f1 {" t$ [技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
6 C% `) v2 b4 H. }- C& v
; ]( H7 U7 K- u \2 P任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
( w* Z! R5 x8 V# `1 n& n! ~& u2 A |0 ]2 H" l$ H. I4 q F
7.9 j: Q" E p5 H2 \' q8 g+ C
参考文献
8 d% F* v, `3 u' d# a9 }* N S0 U
, E% }5 X! ~/ U/ U$ [[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]* X% s$ X. Y' q; R' i% Q
7 f( v% |' k( x3 f) Z1 W[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]1 `! w9 D# t3 Q) V2 O2 p2 j
7 F/ R8 X; C: A, O, {# ^. N; M* Y8.1 k0 h2 W1 S- f. N2 r
附录
9 J$ V0 U, [5 n" Z1 J4 g6 v z- @. v: K
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):8 J3 j; f# I- w2 S5 M
, |7 l) h9 Z& j" u; D5 O
%barcode.m
# [; D% ?5 g' s
* c5 h7 t6 K4 C$ W. ]) I%生成学号a对应的条形码
- m, B7 V. s0 J0 C
; Y* a1 u4 R+ V6 u0 Q2 Y0 a8 }%2011/09/25 13:24 BY小谷同学
$ c; _/ G6 r* U
0 l6 T9 w: |, Ua='1234567890123';%学号,自行更改2 N; q: H. J; {+ R `& L
1 d, z# Q+ E1 gBlack_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;
. B" S8 i5 v1 ^, ~0 p5 e
9 Q3 J) E+ M4 k. ~0 W* V' h0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码; ^! `: b' v& e/ d; V" n
( E. Q& J5 q0 A& ^
White_num=[0,1,0,0,1];%插入符的编码
7 b$ o/ j$ n2 u: ~4 a2 k% P7 v# j+ I" c( ^$ u2 ]0 {6 s1 ?8 A
%Black_SE='00110';8 D a8 P1 X) M
4 {( t& ~5 O# n. W* _' D
%White_SE='10001';White_M='01001';* i }+ P$ x" a9 G
4 [% @, B: \) N, D8 }5 Wbarheight=30;%定义条形码的高度
9 k8 v+ K j( \0 v+ L4 a0 \8 Y
1 J1 t: g; f9 I' y7 c8 s" Nbarwidth=1;%定义条形码的像素宽度
: O$ s1 E% c. O4 [" p% `7 }" n! }. ~
2 }. n5 V- e7 X* }9 N' w5 z0 ^- ?/ N0 v) J! I
%可以对特定长度的输入进行控制,本文规定长度为133 X4 l# Z& y) W, K
0 l* L( ~$ P6 h
if length(a)~=13( i+ L2 x2 ~+ }8 w
) m& J& k2 d9 c3 w
; N& c! a- f; s, S, D: Werror('图书证必须有13个数字');
7 X0 K3 W0 W* S+ i8 f- r/ X9 m \8 j( M
end9 N% }. U$ f- R/ s' l* N
p, T' L- w# s* r
( t( ]4 S$ Y0 W# ]1 C5 |+ w
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
' P& X7 ~# Q* X5 }9 _ S4 }/ _ M' ?& b# b+ x* i- U% K$ @- s
%为方便,直接人工得出起始与终止部分的条形码% U* t1 X/ Y( @: s
0 p" o8 ^8 ~- y- r) S( F
%也可以由程序生成.
2 u S+ O1 Y* x$ m6 c* f3 |, U3 ?8 V) o( M1 @
total=length(a)*(7+7);
/ q7 [0 t2 n9 N) J: c8 r0 e( P7 r! \& Z( v
%条形码的总像素宽" b1 o2 N, v; u4 ?+ B
7 i' e$ x3 q' Q% x: Y+ R% o& |( K%也可以不用求,因MATLAB提供的均是动态数组
. ]2 a5 B/ x7 ?+ ^$ h
" ^/ x# R- d/ W, m/ e$ w. ks=1;%计数,记录
& H& j7 q9 l$ M/ B% ]* `& S7 ~1 G: U1 o' {5 N% _$ M: B% e m6 K
3 A5 T7 R$ W6 h%由于利用for语句容易出现不可预料的错误4 Y1 o: i, @- e& l- g4 B4 ~
+ L6 z% L1 R. N% [" }9 Q8 S/ P%大部分是数组的行标与列标的调用问题,于是采用while循环
5 n" v. f+ ~1 e7 A+ c% _: f& j' y6 a1 R' W' @2 q& I
%嵌套循环,得出数据部分
6 u" W% q4 g5 B; P: M6 x
$ \* {5 x4 V; k9 k: A% e" tm=1;
7 d ~+ ]# U5 U8 w! W
9 B, e4 \; _7 E# O' U8 Cwhile m<14
8 L- Y7 [0 ~) b% q+ C9 H6 E7 L
7 g1 _& n" h- f1 Q( ? W- w/ A' l
3 z @0 e4 M8 j& vif a(m)=='0';6 z; F) c4 o6 s7 A6 q
7 @; k: e1 {! i# q3 P0 O8 S
+ q* }: j" ?8 o% J' l+ tt=10;
1 f+ M: V/ K- [! L% `
; p3 l( f. x/ W3 G3 l: b) @. ?+ C& B7 E. a# E+ C( E- i; Q V7 I
%若为数字零,应该调用的下标是10
5 g5 W7 l" L- i2 r& A9 P
: o3 V5 V6 x- `) g
, r9 a% n$ L4 Xelse
1 K. s; f. Z- E; e; E/ s
T% b/ |5 b8 ?. X2 Y/ w2 Z' n4 M2 D
t=double(a(m)-48);3 `. t$ _3 d, ]
( I: s3 [ j% f9 k% ]4 C0 f
%由于输入是ascii字符,转换为整数需要减去30H,即48
f9 ~. e. V! o; O5 r
7 c. Q& C8 h t# P# B! B* K/ k: u& R& ~8 x* l+ Z0 H4 g
end
_ O* G& E* c. g1 k/ G7 R/ ]" M r1 t8 a3 n9 f
- A, ^9 Q5 i, |- O7 |7 T
n=1;%同样的while循环
1 n1 e/ @* h3 z6 M4 _: g* v7 s& E; b( P6 ^
`) B& ?0 u6 v7 Q
while n<66 Q' C& o/ b, ?
" x4 ~* E0 g4 q4 H; }2 m7 [/ h& C+ V i9 U! `! ]0 I
if Black_num(t,n)==0# u9 F' a$ ~6 n1 D
3 l* ~; |$ @0 x: B- v
# d5 f6 ~; i" F+ j% W* Lbarcode_M(s)=0;8 h( l! Q3 X( I9 D! y' @. ?
3 ?/ E/ l4 r8 r' h. |0 F
E8 p2 g4 q' O8 [- W& o8 ^! Vs=s+1;
$ ^+ w _4 B" s0 P& j
* q" |/ @) @5 M6 i( q7 C; x3 [ c" Z9 ?0 }
else
4 H1 e, \2 O2 M2 ~" x
- N& ?1 W) L* a1 i/ d! _. Z2 f% h6 R+ ~: w& q
barcode_M([s,s+1])=[0,0];
+ A# y6 E: c0 n& H; }6 O$ c2 e7 E+ ~ g
: \- x8 W2 c+ N! ~* t( D4 as=s+2;
' k0 K/ ~+ A) q% v$ [2 K. A( m% S) T. F
' E- F. S7 ?* r
end
4 p. K( k% T. [: E n0 M6 q! Y
" @! n8 ~9 o/ z$ R0 @
if White_num(n)==0
5 M- }- w; q( C1 c& N- `' ^+ S3 ^# i' b6 e0 d
6 S! I( j& R$ @1 K- h
barcode_M(s)=1;
3 z' i0 ?: C. | \7 }- x
1 U, X/ v8 l" w' H* \+ h' `/ d5 Q6 i. M
s=s+1;; J% Q8 }( ?5 \7 w9 r
$ _0 I& ]. [& x; X8 _ Q5 \0 _
else* o8 i2 q: }% T: C y, I4 s7 Z- V' J
/ ^5 A6 K# F, @. N( d B L1 A d q! O, F
barcode_M([s,s+1])=[1,1];
) o2 f& Y* w) E- m6 N% j9 [* A6 S5 d- `/ F F
9 o" f2 t5 j1 |& I1 e/ y& D
s=s+2;& M5 j6 B( Q6 j1 `, ?- |" F! p0 c! w
6 {% \- g4 z) [* f8 |9 R; I9 I
) p2 R/ {/ k. x2 C0 |- w- v; p6 lend
$ ^1 f, u/ ~3 b. t2 u- q/ [5 z3 ]3 V
3 q' X3 w( R" u) {6 I& c0 A8 n
n=n+1;
0 i; ^+ b9 W) t: {; r
, \/ e5 J' v8 r/ q3 l4 o d( e: S% A) D4 x. b3 N4 J$ K
end' O. L" T: w' b% W2 E8 N1 u
1 A/ b% s: k. |( ~) W* \$ e9 S3 u5 Pm=m+1;2 s6 r, ?0 j k, L( e' i! a6 S
2 n' k5 H5 c1 w' b4 F9 |$ xend
; v* A: i: i& T9 }; d7 F L1 D7 @# _# \" O
, i$ G: g" y" L* Bbcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
& e% _7 C* O0 n
/ E! e* I, n$ s%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
7 C1 r' B& _ J, z5 W" l, l5 _! q- U1 F3 O0 |
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)8 B( o0 b, ~; {$ L
: h% W2 j* }4 U$ J- H
imshow(bcode)%显示所得到得条形码
1 |) e' N& w! H9 l" S6 s, A7 Q, g0 H. d& F3 Z# ]- b
%然后可以自行存贮得到的条形码
+ Q. v9 O) a# t' J3 I9 s
8 g7 t+ a/ Y9 @%然后用PS等工具得出具有自己特色图书证啦# B9 t2 Q0 E9 w u
/ M: g' i' z: ^ T3 t* C, m' K( A* E# @& E. I# s
|
zan
|