- 在线时间
- 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系列之——某校图书证条形码制作
( O8 _. I4 A* u6 \3 q# E/ a3 P9 W" D* E8 O
小谷同学 2011/9/25% r7 I9 S: v7 E1 t$ w y# T. \6 w
0 f& J4 Z0 L# n* }5 ~% V
摘要
" P, k2 u; s Q: o# [# p/ f* J* m. Y
关键词: 条形码
: `3 T4 g# m0 F3 p* J( z8 ~ Y
! h% W3 ]- P' }5 j3 M由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。; d( @9 A; e9 d; I; r2 E+ Y
9 U' l/ u. f8 \" o7 O
目录: J9 D. ~& e9 t) E+ {+ S @/ z
: g) g! h1 x9 x. F+ ]8 G$ `2 ~6 X1.某校图书证编码规则
9 Q1 S E5 k% d/ u
U* @ f3 P T$ d! A4 M; X2.条形码制作的过程; n* Y* \" Y: I% Y' m+ U# p
1 j8 R* v: g5 k1 _& a
3.打印与测试
/ X* Y9 C& u3 R
5 R, v. o2 ~1 U+ |, h/ x* P4.扩展应用
- k* p1 n4 W0 z* ~/ r* D/ u& v( D2 Q Q
5.关于本例的一些思考. R4 y" h$ F# v- O+ L/ V/ v! L; ^) O
# W7 \, I3 s% ]! F+ ^5 [% r( T6.免责声明与使用注意事项* L$ O3 _$ g& N. Y6 y
7 a: _# s5 n P' `/ }( x
7.参考文献1 m: w" g0 _) c1 _. L6 f" _
|- z8 ^$ X* w% G; }$ y, e2 L
8.附录
9 D- F' w( o0 }! b& ]( y2 G( U7 F7 K2 W! s+ h! `1 B' o; ^
+ o; @/ u; |- ?. u# ?# B
$ C7 \3 a: S: \' L" s# ~
7 v; i* g ]# h条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
& }6 A' Y. H' q& x) V( Y W% w3 q
! E% V6 D" c- g7 b在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。$ P. L, A6 a6 K! B( n
" F* G& V- z( w1 e p( d1.某校图书证编码规则
' n4 K6 E7 |9 Z+ f$ j* Q/ w8 `( R5 F
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
. A2 y8 H" f) f) O. \) }9 S4 v" g, q {8 E; H p
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
+ h5 H; D; I. S! V6 n$ J% o
1 @" N6 x. G4 i②图书证的白色条码都是一样的,分为以下三部分:4 D- ~5 e' P# p) r
9 Z9 P% e- @- c& D
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。9 E% A4 u4 ^: V. }+ s
+ K; ]/ v# l) n# s: |) U
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:+ i$ L2 K. E0 C4 d6 A
" ~8 \3 C; e3 y" @4 I1)起始部分:00110;
; [* Q. a' N, w3 W v7 d& H1 ^, x' B; \( G9 `& U% L
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
4 G w. @/ j* D1 F
2 a) i; Q; x3 l# m. i9 p$ q表一 某校图书证号每个数字对应的代码. k- t* |3 _/ F U$ F
0 Z! x) P& j3 u! ? O8 @
数字 代码 代码数字来源 数字 代码 代码数字来源
5 S4 {% _, }. _1 10001 1:0001 6 01100 6:0110 & M% y- M* R/ y- m
2 01001 2:0010 7 00011 8:1000 6 q: h% z0 M$ V
3 11000 3:0011 8 10010 9:1001 " t g; `7 c1 @% e0 ^
4 00101 4:0100 9 01010 10:1010 7 P5 h$ [. X5 [4 b1 @
5 10100 5:0101 0 00110 12:1100 5 K+ `6 c" u" o3 S
3 o) O' U1 w1 d3 W说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
: T1 p8 [+ K% Y* ~% N. v4 s- m8 {3 X# `' ^* p# _' y! Y2 P
3)终止部分:00110,与起始部分以及数字0的代码都一致。, o% C, J6 C2 x; s7 S% h$ C. C
7 ?( W8 N$ X: g! |2.条形码的制作过程. ]7 a, r( x) w" U2 j7 T
' }3 f$ g9 h, E8 Z' j! r% S
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。! B) J7 d: w; Y5 J0 W4 J
' g; W- G' F/ z) u! n( K定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。! L* \: o/ A# T, X/ z
- B; Q" R4 s* C% L" J) P+ i
条形码效果如图所示(程序代码见附件所示)。
) c; i1 o3 Q- `5 `& ~
% P2 C1 {/ P# u& ~图一 所得条形码效果图( S$ t& @$ l Q
; t3 O( _! y% W* s5 u
3.打印与测试
, R( z7 M/ r+ S* |9 L( v! S c' f
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
! g6 {+ S7 I* Y3 V% B2 }1 z( Q. a: d+ R- W/ K
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
" ~2 B% d3 ~$ X: B6 v, R4 I7 V3 S- ~2 P1 f2 c- Y
为了方便进行测试,本文打印出不同大小的条形码。, q! y& ~! a9 O' V) k9 ?) U1 {
, Q+ P9 H1 E* G% p测试一:将其用透明胶带粘在硬纸板上。. Q* \( a! T- h! d1 X
: J" ~2 H) Z, l# m+ w7 D: U
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:7 Z! `# n* x( r7 D7 L
, O" h& N) r7 }
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。6 L, n) A6 W; g1 Q
) N6 ^ }/ X( F* Q& p
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!4 B) W" ~8 Y# @ c* p3 B4 P
9 x& {3 }, { |! D3 a& \. H
效果如图二所示。
( \5 S7 z/ |4 s" m
, `! L5 c, n8 B8 |* J6 j图二 打印效果图( Z8 ]5 H% _; B: q1 w& z
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
0 j0 t* ?" W9 l2 V" ], h+ B* @0 |2 l4 i+ x& p% K
4.扩展应用! k2 ?( U8 X$ U9 v# n
& Z5 e9 X: _0 Z/ o' D' V% ^$ P/ b ~
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。; R8 _, i. v4 h( l) i' |- e* X% l) {
* c/ [! t0 n' ]$ H
图三 可供彩色打印的图书证
# d2 I& G+ V. }& f" ?5 T7 d
6 d# R' [' z5 n Z过后,我们会给出相应的网页版、C++版、VB版等等。
" C3 A* k4 N: ]% l' b: H
5 r, Y$ `4 D& x" ]5.关于本例的一些思考
( u; p) n# i$ F7 _ C; e8 C; l8 W' g. S& l0 W6 D
由相关文献,可知条码技术具有以下优点:1 [' N- D0 D, k0 j6 y/ ^7 }/ A: p
' e) J7 t7 W: a: G9 R h- `) C4 d- C
1)、输入速度快; % W8 T3 g! _! J5 ]
6 v) J2 _6 ?4 _/ g3 D$ d
2)、可靠性高;
( g a0 W' k5 i* ?0 B; U' I' p B3 N `- c8 o- k; j
3)、采集信息量大;
8 s/ ?4 m6 p3 T! v! x
: P; I8 R1 @; L/ @2 U2 \6 H 4)、灵活实用;9 G$ l* B$ I- Q5 i
1 [1 S3 M9 g0 m w5)、条码标签易于制作
% r3 U: {9 k5 w: L/ ^, w
, f# Y! Z0 s6 b0 m6)、识别设备操作容易,不需要特殊培训;
4 V1 r2 B4 m: Z+ I. l, u4 y9 b9 d' q3 S1 B/ s/ i
7)、设备也相对便宜。
, R: Z* @( N! D5 t' k: o6 F+ V v5 L: g( u
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
$ ?" d5 S! \+ t. F; u0 r5 }7 t) G0 x- _# G. z
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
U9 w, a4 y9 y/ f6 O' Y4 ^
$ N6 U- d$ t$ i" o图四:常见的二维码3 C) h: G' d2 r( P
; G# h$ O8 x- Y. l; d9 X. r
6.免责声明与注意事项: j3 }3 E, f4 T% N6 T
; i" W' V- V& S ~9 ~' H5 d
版权所有,翻版必究。
^ v# g. }% z& J+ W6 S: B" }) J) F
. y, @ T: W- p技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
: @: e, @0 t; p8 G6 h/ a* O
' c7 c3 E; }4 Q任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 4 }9 B4 b x! a3 O" y0 U
0 t0 K) T( K" ?# r4 f' y7.
2 U9 f X! b0 [4 K) T5 l参考文献* I; [+ H' `# ~, I/ H) w
# j$ U, v) N5 i/ z7 G' {' m[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]& g) N9 f! B: q
5 O( o& |0 J2 a' X
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]/ g1 r0 S! p/ h. Q' b# m0 U' i/ D
* ]4 p M# J9 f8.6 L" p7 z+ `% L
附录
8 g4 p- ^" X7 w( F9 q
/ ^5 n6 \) g- d/ }, ~0 ~相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):3 V% }+ M% K. J% r, r
7 }! Q* l' J8 E%barcode.m2 m8 Y4 b" _( k! Y2 V# Q- O, Q
- z- M8 \) N: H/ W
%生成学号a对应的条形码, t. f! Z- K9 \1 F) }" f* H
' L5 `6 d- V# ^1 G9 Z: f6 a2 T* @
%2011/09/25 13:24 BY小谷同学
' ]+ w& L1 p" R, K% M$ j8 I& d: }! @! [# D3 R" v- E
a='1234567890123';%学号,自行更改 D- y5 E1 c ^* P1 l9 e) n* ?' N
: N& `) A8 _! X, l
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;% J0 a# V* y& H, X2 M6 K6 j
+ |9 q4 K1 d9 z
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];%数字编码
. _. n0 L7 ^) g0 }/ P( G Y, y9 a2 a- z" q# P5 q4 V8 e& e; u
White_num=[0,1,0,0,1];%插入符的编码3 J. N: O8 [1 k- H/ \( F
. u4 C. ^) Q5 H. v3 g
%Black_SE='00110';
& C9 p% k% ~# m( B: _5 A% I# N
& T) G9 y" T# f" Y! @( ]%White_SE='10001';White_M='01001';& F/ H3 D' E# V2 f8 J7 V- T( y
2 G1 w1 x" o# {( W% U4 ybarheight=30;%定义条形码的高度
5 d6 w) ~' k7 p1 k5 d$ @1 @- E5 n% k. I
barwidth=1;%定义条形码的像素宽度! ]5 D1 N3 q- @! I* i7 B E
, j# T( l, `* }0 X
6 b; D. F. ~; R2 g2 D" t+ y
%可以对特定长度的输入进行控制,本文规定长度为13
! n% T. z1 x- z- w( g3 g i, C: E2 a% u; K7 f. Z' o/ p2 C
if length(a)~=13 y6 U7 u+ S1 ^& S( W
5 R' y' ~% a1 y( I# O4 f+ p' w, W" @4 n* S3 H
error('图书证必须有13个数字');" i! e% r% {6 a. k
# | W) r) S/ V: E& o9 Qend! T/ G$ f+ e- c! \" R
, T# M* C. _5 {
* J0 o, F* h1 U0 _7 Dbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
Y: v6 L. _7 m9 Q0 s+ l# r
5 b3 t, ?1 Z( L/ D%为方便,直接人工得出起始与终止部分的条形码, m8 V& a3 i3 S) [. @ F
# O/ N! ~' C# ~) L
%也可以由程序生成.
+ b% l# G( Y. n1 h# X, N( I
* ?- T. l5 n) Q* {. o5 ~5 e( J( o$ @total=length(a)*(7+7);
( t) y2 {/ @7 k: M D. c- z4 U+ P
9 Q& d( ^% T( E# L& I K, g3 ^%条形码的总像素宽. y. m7 ^4 g; e7 A! A& x0 A5 N6 q$ A
( N& E, r2 R$ K
%也可以不用求,因MATLAB提供的均是动态数组
5 g2 g" p( I$ m8 ^& N7 J( l, L/ v" P8 |
s=1;%计数,记录
c- U$ [, L3 v/ [: R8 c7 I; J( G. c4 b5 q( `( u# N
% i! m& O( a4 ^) K6 E) `3 _& _%由于利用for语句容易出现不可预料的错误
! ]( M7 R* T6 \2 }& @) E( Q4 a9 V8 j. f
%大部分是数组的行标与列标的调用问题,于是采用while循环
2 Y8 v7 A! Y- k8 k% E4 T! V" F9 N2 ~ H3 h* |
%嵌套循环,得出数据部分% e6 w$ l2 Z1 m" \: r1 b: W" C; |0 {
6 `; [; N5 W; }4 T
m=1;
" O4 I0 y; e% ?8 h1 V4 c7 p% M9 x3 a1 e4 ?
while m<14
* a) _+ z# e5 |0 N$ [3 p- d) ~ b h( K5 |' [: s6 g/ A2 F
) t0 j. ]; Z! f7 C6 U! P
if a(m)=='0';' G' d+ q/ G5 y0 P2 B
& r& W) ~, L+ {, ~
/ a" F. f1 j" h! N) K( d# A/ m
t=10;
9 p7 ]5 U2 ~ J! T; _/ A; a F: J' a M1 V) \- o
: h* o) w' e$ |) W% {. y%若为数字零,应该调用的下标是10" n5 Z* R5 G/ a* j' y+ j0 ^
& F( y# R8 n/ {1 ]9 e u7 B
' z4 v i7 _7 \else: |- s, M e+ M) e6 F- H" G) ?% t& X
" J3 a# b6 Z) X# R. A
; M' l# }/ ]9 ct=double(a(m)-48);
" Z( w' {2 `& n: q% {7 R2 u h# E& p0 V1 ^/ Q! Q1 f+ e7 P
%由于输入是ascii字符,转换为整数需要减去30H,即48
0 d5 c& P9 S4 U- J" k3 g% z* G" O0 i
, \& ^, [. V$ A0 i! X: ~
end" \" Z" W3 }# P6 R
# J8 Y6 z) z: Y1 X" [. d
8 n9 v* F: \% M! ^+ Xn=1;%同样的while循环; |% a$ k% E- p& W# t- {
! M D( T. _& q
, _* K/ d0 x* R5 b2 A9 r& P: Hwhile n<6' P x& d6 g+ T; ]. r; C$ z
" D6 g6 a! Z) E1 w. U. R& X
! G& [5 X0 \+ x8 _/ v
if Black_num(t,n)==0
: V9 ?* |4 z5 T0 v0 J- ]2 m6 M2 @6 b0 P5 [ N, C! C
, O! q5 O& i8 n0 |
barcode_M(s)=0;% x' ^9 k9 p( P8 `/ f3 @
# h5 @% J) y% A8 @3 c. F1 W5 R
' P8 p1 `# n Q& V& _s=s+1;
7 j$ i/ l4 P$ T/ ~
; ?8 o3 |) I! c# b$ |! A4 u( k4 c
\/ [9 H& S. t+ g: `else
) n# j! J N9 F3 r& x
$ ~9 J2 F7 X2 s- v3 p
. Z7 b, z j6 J8 z/ x- H4 Vbarcode_M([s,s+1])=[0,0];
1 _4 J) s1 P: V" R
5 K* n' Q2 G/ U: h; m
- T- j- ^( Q2 x: v4 `9 H6 ^9 r6 Ts=s+2;
1 B' b4 G) N: k6 ~7 r0 _$ |0 m7 t H, @$ Q: U
0 U1 w+ q w( G; n
end
7 Z/ j9 i- J# \5 e- ], Z1 G# X) b2 K5 y8 ]
- f1 l5 j, T' n
if White_num(n)==0" c1 {9 ?3 a9 q( \$ v' ]
3 i, E1 L% t( }" S$ X' m3 b+ w8 {9 H/ S
2 n8 ~4 @, m. P, p) Z5 E" n
barcode_M(s)=1;
6 U2 n0 U, P# F2 Z, Y; C8 f7 }. _) Z2 ]- S2 V$ [3 W& i4 [2 F
& O( x; l. I" R
s=s+1;
9 n2 ~ L( T1 _& o& B6 g( J8 V7 J/ T5 Y9 a
3 `. T% P0 t2 i+ ~% @) H; h7 o o
else
$ b3 I2 a6 a- ~2 W0 D5 d4 [! @
4 u0 v0 ^" `, Y, @# g1 U* U. i- h( K; w) q$ f! O4 H
barcode_M([s,s+1])=[1,1];
8 k; U8 ?* h" ]0 |7 h
3 |/ E# L! H1 L3 [: s [* y
) }* n) ^; X9 }! I) V& @' zs=s+2;
! S4 I+ l. M* z1 g1 r+ y
- l9 C! i( L9 I4 t. Z* ~4 c4 S
) w9 [7 E8 e! ?% U( A* E; Tend
4 f1 G/ J& A6 O/ y8 c+ l0 U
+ \$ p. H6 s6 s) n+ M' g; H( f; {5 w, q1 K
n=n+1;
6 R$ ?& j' F0 G4 X. w; o% |1 K0 C# K
. q. s* @1 m+ C+ w9 pend
+ b! j; ~7 I' E Z2 {- L3 U
& y7 T/ t7 _2 C* y8 N4 ~8 X- Vm=m+1;* Z- l5 A* A& [1 j8 ?/ w' P: e
2 u9 z% t* {: Q8 U9 @end
' R! f: |$ W3 T
, @6 \1 l! u* h/ B- J, b% ~2 r! g+ w) s9 Q+ C: w) s
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
2 n5 \. I3 ]1 v" v$ F' B% B0 X# B- I; @/ i% `2 l; @; D
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵- b# m7 h6 u E B
: L x3 p) @7 S) x7 Xbcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
6 I1 p. e: c: k$ z' T. Y
# ^. \ f S. j% M# Pimshow(bcode)%显示所得到得条形码
1 g9 ? P, G: u" P7 `0 i: W4 R% E& I& R$ l7 G, f& R) k0 C6 b3 y3 ~
%然后可以自行存贮得到的条形码
0 R5 p$ X) x$ {4 L B, w
I4 }. d6 y+ @3 ?+ C/ f+ V%然后用PS等工具得出具有自己特色图书证啦
7 J* c" K2 j9 P/ Z1 u2 |1 O2 }" ^( O; \
) e* A% S9 H# W* P- f: f
|
zan
|