- 在线时间
- 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系列之——某校图书证条形码制作
* T5 y4 _" R2 T! a
) B4 w3 y& O; Y小谷同学 2011/9/25, j/ h# K; a) O9 x' ?% P) h
% W# C G, L# K, c摘要
! s) w8 x( l0 k; h9 {+ O
' \: ?: H$ f, E% H( S" r, X) ^关键词: 条形码4 r5 b. l8 r& ^- t* [
( ~, `0 d7 Q; m由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。) j5 P3 R7 x4 a0 ^% L
; Y( J6 Q) Z* I" r& c
目录0 _7 W7 P- m8 }5 \
1 w5 [; J: |6 h" a' R5 W1.某校图书证编码规则/ O) ]$ }0 `6 d, Z2 h2 x9 r/ ~
: f9 T' j( {. G( ~2.条形码制作的过程
, ^% \9 q8 k' M! p" y( e' C' x: J; t& [% V" e0 u1 n
3.打印与测试
" l* a8 L: G, }/ G8 g5 E
: G; w! B" Y) X. q, V4.扩展应用* p4 H, s7 V3 M5 U5 k( i) `- ]4 v
8 X/ z1 o5 h9 \; c* r2 I6 r7 A
5.关于本例的一些思考6 K# q6 u c3 F2 Z% C5 Y
& C/ |" ]: v% U5 b0 A
6.免责声明与使用注意事项
+ p% y y: q9 F$ H# u, a& G6 J) d1 s8 i& r
7.参考文献. _" B6 m8 r% G/ q
! n! {1 N7 v, d4 ^7 E2 z2 o1 B; _8.附录
. Z O; {( x' t& z- K7 s- L6 k% ?" d6 ~+ r$ K/ ?* ~( h
3 C5 |" P6 ?, G4 ^. C+ S9 k* |
% b; R- f+ g* J# f/ R( t) ?
+ n- R# k. o3 q' t
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。( p: P$ P) ^. d8 P
8 t# H& p$ k1 n3 \: y8 | |! e
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
9 f4 k# c6 R) M0 l8 }$ f
8 o+ Y- j( ^) ?* |1 p2 v1.某校图书证编码规则! d3 c1 i8 a4 n! t
$ T0 D% L. B& D) b5 V" m
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:1 _" v& p! s) m
! b0 W' m$ c7 ~6 @( [: n
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。/ [* a7 B7 b0 f2 J- [
. C; I- f. X% `0 |. a, L
②图书证的白色条码都是一样的,分为以下三部分:4 ]' p6 n: h; e# m. |
3 \1 V/ G& l( a( k% z4 p R" c! C; n7 r1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。3 x' D7 z9 Z5 m
% l z0 Z0 ?" |
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
' H5 t+ X. L7 f
5 C+ h& W" ?: l' K3 ^2 t/ z1)起始部分:00110;+ K# A0 J/ i1 j3 ~
) y n6 Y2 s5 F3 x; F! s2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; 3 v- M; e9 `4 i- o1 W2 U( K
! d6 \& F9 w' ?! _- R7 v7 S表一 某校图书证号每个数字对应的代码
7 H, m8 |# C; T" g+ c+ R' w" y" {
数字 代码 代码数字来源 数字 代码 代码数字来源 - K5 [6 a4 j& r8 t* m
1 10001 1:0001 6 01100 6:0110 1 v$ t( L% E. ] ?
2 01001 2:0010 7 00011 8:1000 3 d/ X- t6 J4 b. r1 ^3 C! C
3 11000 3:0011 8 10010 9:1001
/ g4 P# T5 i& o7 d3 N4 00101 4:0100 9 01010 10:1010
& r7 j+ n$ \6 d. D6 ~/ J+ k5 10100 5:0101 0 00110 12:1100
' } G T/ i9 \, Z# ?
( E1 Z0 w* ~, l8 [, }说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
" |& z; P8 y! t' Q3 e. H
6 t' n( K6 R- S9 D" g$ E3)终止部分:00110,与起始部分以及数字0的代码都一致。
( w: ]! U( ?" _7 Q0 J ~# j' d0 N0 H& y- Z6 F
2.条形码的制作过程
5 b0 u0 i1 [9 z. J2 D' h s4 q* S( [
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
i3 c/ u# ?' _8 C- {" k8 q7 X7 L: W; c6 ~1 T5 @3 k
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。7 |( v8 @( c9 q! d
( ?3 M# H# P# t2 k
条形码效果如图所示(程序代码见附件所示)。
9 f8 U6 F+ S* g8 ]( A. e8 ?
& j, \, v% F6 y* s% F图一 所得条形码效果图
) z6 P% Q/ m& A$ J" f/ W* _, c* G
0 K; B9 S" k' ^, {. b3.打印与测试0 f3 s3 @5 S+ a
9 J, O8 Y6 d3 E3 i% R4 [; w1 X O有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。- {- h' d: ]- w, f) J: r+ k
+ l6 g) l2 d" [5 S) X因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。- J+ C$ w) Y, j9 b1 n5 s
2 i% v" b Z$ ~( t$ e9 E为了方便进行测试,本文打印出不同大小的条形码。
3 Z2 i+ ]: w# s( Z0 v& F- z& m0 i" w8 J# l z
测试一:将其用透明胶带粘在硬纸板上。+ |6 D: b1 V; C ]& U- W2 C
, ~, u9 p! c$ m- U/ L5 |
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:: q6 t* r' B' D
) h( F" `9 j& P# q5 o1 s图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
0 r8 u* [ e7 L4 `+ J* ?. a8 O, j. `- P' m% O/ D
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!! \1 X) i# k, Y4 U# W( `
* X D: N7 z) r% L
效果如图二所示。* ?: n% E$ z [# Y" K8 t
- P1 e+ E4 C' X, g, _图二 打印效果图
* s. U3 J: B9 k, a/ E# Z! j测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
; D' W: i. z/ ?. I" M2 a* k
- U/ f, a; i1 ?! j" I+ ~$ T3 H8 |4.扩展应用1 X0 W% }# b m. }5 Y
5 J% `& E$ }0 v" ]. o! m
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。2 D7 d6 y8 t/ @( B6 g
. X: p2 p& z$ a1 {$ Z4 ]# Y
图三 可供彩色打印的图书证+ p( H) [* ?6 n' i3 F5 F
, b2 ^2 a5 Z% I' i( ?/ L
过后,我们会给出相应的网页版、C++版、VB版等等。
* C* }# R0 B; T2 M& V9 G* Z1 d' H2 x4 x: q
5.关于本例的一些思考
3 _$ `% K8 h; w. m1 T: Q; r( D# N7 ?$ L5 j. {7 z
由相关文献,可知条码技术具有以下优点:! h" V) \% I# t6 o6 m
( M1 o, `' m2 G5 I3 \ 1)、输入速度快; ; |: z" k& J8 W- f( n/ l
7 m+ y% w6 I4 d- X; f7 o 2)、可靠性高;9 R% D9 z8 N8 k
; e/ ]: J5 k" H7 X3 Y7 F6 Z o1 J
3)、采集信息量大;
' N, K M* x$ T; Q2 N! u! R- F! R2 Q G
4)、灵活实用;/ `: |$ q+ K% L. m
- `$ n: \" b6 f( z/ J
5)、条码标签易于制作
( X# M, t4 [/ S' y5 ~) a
) {8 S5 Q' {0 J/ _7 ?2 R% c6 H0 P6)、识别设备操作容易,不需要特殊培训;
: D. y4 u+ L3 e" ]. `6 `5 |/ ^, r. l3 H: J
7)、设备也相对便宜。. z! ^! h7 A! D" ]/ `$ r7 x
) `# h' S- @1 C. l* i$ F因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。5 X/ V) |9 [$ S, t! f x8 T
; h& j) i+ ?7 C; |5 |由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
; i, \4 V' v! f: l+ P0 x
7 n9 Z: X# T+ f1 @# N& U/ J图四:常见的二维码7 l4 A5 X' \% C2 U: v7 x; U
( ?- [" P) o$ d, v2 D6.免责声明与注意事项
6 m' `& z/ f* b. U1 t+ n" N1 U, {1 K# T4 {
版权所有,翻版必究。/ ]" l; y5 ]; F0 Q
9 k2 |/ Z: ]4 X) B8 l0 a
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。9 j2 q0 A5 ^ v5 w
$ Z; ~/ O5 g! N4 y/ k, N! h任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
6 [/ v* p* l1 f' i0 m- a6 ~- a- S' o2 T
7., D5 F5 M$ F' z# V; u
参考文献
. T. M2 [6 e% t! |' M. p2 }; m, Q1 X! D: v: x2 x- ~& I
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
; k0 @' y" j1 n8 s @% d! z1 S4 \& s: S% A5 ?4 t E0 U/ h
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25], q- ]; N. a* ?
/ {4 ?, s# S4 D8.4 T. n4 g& Z- K# m
附录
. d) I( ~ w; L8 }: s& X) e& S% j, s1 y a/ {2 p
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):4 D+ l) a; q7 ~0 F9 W
0 b+ D, ?2 }& z+ A {* _/ p%barcode.m
; z! v, c' a* V# y% z4 t) M. i% ^/ @8 K
%生成学号a对应的条形码
. ~; m+ @" q7 N9 ^2 ?
* N& z Y" V0 T5 A' o%2011/09/25 13:24 BY小谷同学
" }2 w+ N9 r' B) u) l7 P7 V1 `
5 R6 Q& e. l* a* a* Wa='1234567890123';%学号,自行更改' a% }# u+ p2 v/ W* e" ^0 ]" Y
1 L. m3 ^" H* Y$ F; i3 s! I* I
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;2 e: e7 j8 q3 b6 ^ c& }
1 V# A+ E3 A" i0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
9 [ ]$ M# b/ n. h u- A1 \; P# I4 R) }( `) w) P' N, H
White_num=[0,1,0,0,1];%插入符的编码
/ _2 _* ]9 p8 ~1 e1 I2 K& K7 h$ O
5 P+ M; C5 z7 n+ m& c2 E+ H( |%Black_SE='00110';6 e0 E" j+ c2 A t3 e6 w
) _9 u4 ]- n9 j2 Y* G3 u$ P3 I%White_SE='10001';White_M='01001';
$ X( _: q4 Q% \( A
3 W: G* Z% h* ]barheight=30;%定义条形码的高度, v0 O' b9 B9 l# U
( L6 T+ ~5 x2 m4 R5 `3 f
barwidth=1;%定义条形码的像素宽度
) }( B# N0 o3 D x7 r4 C$ \% Z4 e" \1 }" B4 p4 E: v8 W* {# [
9 x4 ]) s) I/ S! l
%可以对特定长度的输入进行控制,本文规定长度为13
6 D: P" _7 L" ~. a: w
! |/ ^# r: e3 p# L8 b, C. r; gif length(a)~=13
/ l3 v+ y0 J) v5 D
& D" j7 m; a! y2 n# T2 M/ M. n5 ^; C+ y% j
error('图书证必须有13个数字');4 {! c& S4 Y2 {) \1 I
- B: g2 o* y4 \* Q$ H( oend4 A* X+ [& V: H9 a/ }
% h! o- a2 z1 Y9 M0 s* i" s4 O& y
6 u' v" J& c! j1 i
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];, I( J8 v: e1 i& N
. N& _5 D2 H6 z& l+ z
%为方便,直接人工得出起始与终止部分的条形码- S4 x6 \8 ^! e9 y% x% X
5 N8 s( C6 h3 L; I% N& [/ a6 q# b%也可以由程序生成.
* f1 k, A1 x( r$ s9 f2 D. o, m- ^! g% \7 o
total=length(a)*(7+7);* V8 ]+ ^: u+ \' c& V# L. w' w8 X
\$ |; z( a. b4 j6 y$ j
%条形码的总像素宽# B* k/ R" I! p6 I& c
) g- `/ h3 i+ ~
%也可以不用求,因MATLAB提供的均是动态数组" S& ^' p3 G; b
5 `* z+ t* |- |: J% ~s=1;%计数,记录
6 O: F" ^' r5 e7 |8 X
9 C" n% g6 @+ D7 E) x9 d0 O! @. Z t- d& @8 L
%由于利用for语句容易出现不可预料的错误
+ h+ R( S8 _9 \5 n' B( I% m+ R, Q: X0 K+ [+ L( i
%大部分是数组的行标与列标的调用问题,于是采用while循环
) h1 e0 W$ `) H' ~3 a
5 F2 o, J# G4 M d9 g%嵌套循环,得出数据部分1 J9 f( B+ R0 r- [
; U; X" ~. p" ?! P- o0 W+ l5 Y$ o0 U
m=1;
/ n8 [$ z: p4 K$ r7 x0 U: }8 L8 V; L/ C3 }
while m<14
. q! |1 w0 [0 t3 j7 W3 Y
" e u6 Q* W9 J4 L2 N
) `* t$ _: A' D6 m( [1 {if a(m)=='0';
8 m! _' k2 n. t8 g1 F- O* \- @: Y
! J' Z# u5 @. A5 n1 k
t=10;! N/ N2 \: S# u! J" n% R
1 ~: I- A8 O7 }( V% K" o
$ |! _5 ^3 o$ I9 C) ] k- N# |
%若为数字零,应该调用的下标是10
4 ~3 h0 E2 F& H/ g* s
8 l; q- T" @4 {: m, b' G' r! ?/ Y9 g( X# V9 `) f7 M( l/ d
else
9 y3 V4 G0 V; `& h% _
# f* `: {. [' t7 ~: J/ b/ ^2 _
3 U" z9 M x5 C3 Gt=double(a(m)-48);
* y# X; r' |2 ^0 ~& U9 u; i+ B. ~* s# \4 d6 z8 o3 T |
%由于输入是ascii字符,转换为整数需要减去30H,即485 R( u8 x# m- t0 S
6 r- L8 |, [1 P* G" ?
) m) z1 U3 z1 f# q0 Hend
9 m- k4 i/ D! o2 Q; I1 c! }9 K" B4 ]2 y# \' k
0 q; i! k- o3 q# z+ D
n=1;%同样的while循环
0 F( @) q8 z( k. L
; `8 M9 P! x5 X4 v! k# n( O2 b" v, F5 k! I1 i: ]% ?* ?
while n<6
% P2 d7 j# z6 F. Z0 F0 e9 A) N, u) \6 v7 z' G: D" u/ i6 O0 b% ^
4 q, C# A* |5 D) |5 K( g# G$ ^
if Black_num(t,n)==0
: Q7 E7 ?! t# Z2 F' f' n/ k" t; r+ c9 `" B7 f2 f* M
4 b) E! Y, [1 X
barcode_M(s)=0;1 R4 O* Q( U, e; f+ F
8 |. s1 w. U. U
, y- G8 p& e# L: Qs=s+1;
' x: J& ~8 H% O# U; p$ j7 U; I
. ?) \3 M8 |: o; h( v: N
else; b! `6 _* V. D3 {* p% f8 n
2 O2 M( Q5 K9 n7 P' P: b3 c6 \5 Y/ l: Z. x1 W
barcode_M([s,s+1])=[0,0];
- ]1 w. K- p! \
7 |4 t9 N% @ r/ N" L" c5 W3 |: D e4 p8 ~
s=s+2;
2 e, r& q' Q1 w* ?* }: d5 I6 K
6 U1 Q1 W2 C( \0 n) v7 g' U* h; @( }" m% @9 m+ ?1 q1 a
end/ Q0 |; N5 g+ p
" S* {5 d4 S/ E
8 n( @' w# s l% D, P0 pif White_num(n)==0
; l! B# U: I* W( z) s" x2 a3 b. u# }
( P0 Y+ {9 ^* k! Ibarcode_M(s)=1;
+ Q" z- V& Q& \1 Z; j6 o0 o
( h- l4 w: K! w4 }. m
: P f1 G) I% g( ^ j( T5 Q2 l; H" ys=s+1;
- F4 w# t/ N+ k1 v
( v1 q9 J# z8 b, j7 W! c& a! T
else
) T9 c. \' @0 m+ r9 d- J! y$ y, e5 L7 \) J9 t1 W' ?6 B0 E$ k
' [* J+ _6 T* P! [) h- Lbarcode_M([s,s+1])=[1,1];$ ` i8 E Z: X1 w" @ i! p8 F$ d
7 m( h$ `* S+ F; M9 b2 V A
! i* s. K; j; l; E, A) ps=s+2;* @5 M" j! F& \9 @0 q" {9 W& p1 X
% \+ _* Q+ _# ?+ ]9 u0 e2 k% i9 M) A
end
' M0 c% H; N X: l8 T% z6 V6 o3 m: |. C' ], h/ }8 y" L- Q
8 T" T. K; n0 I# d0 C
n=n+1;6 `! W& S3 O$ K3 Z
9 L+ T& S/ @! \: v0 D( c8 j( R' u. B7 q% t* l% M6 E1 u
end0 @0 f" a( j9 S- l6 g+ {8 |' a
; y. h8 Z, d: s3 x' M& I3 L
m=m+1;, G- h& V4 B9 Y
6 E2 S5 Q$ z8 v! g9 u2 ~
end
3 j& y" V* e" S- K, P. e: e6 w8 H$ a: t# H# i: Q6 ]
a8 L! u* \5 R2 a
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
9 [" T& r! N0 Y2 |: b3 l, {0 J' m9 ^
) U3 h0 s" t0 O$ D/ [; V%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
& Z* }- p( Y% J& J
% [/ Y' t) d( Z' ] t3 `bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)9 D! b" J$ U3 y8 b/ p
7 M ?4 ~! Q% O0 }imshow(bcode)%显示所得到得条形码# t. d3 Y+ j5 L/ G9 p: L: Q
7 X1 p. e4 N- L%然后可以自行存贮得到的条形码
' \% A- C1 P1 K1 S# N3 z1 H! @% I) v, y& d* y+ C7 ]
%然后用PS等工具得出具有自己特色图书证啦9 h! _1 L5 `, W6 U! S2 T
8 p" v& ~# {' R! T0 a' X
8 u+ {6 F! B* Y* A
|
zan
|