在线时间 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系列之——某校图书证条形码制作6 s" ?( j6 y+ q& D; s2 p M
7 X$ ~/ J+ J# c/ y" Y1 L
小谷同学 2011/9/25
' u+ B& y9 a% }7 P 1 ?0 u/ v5 R2 W. d8 X
摘要- o' W; [- k# @% Q- g: g$ _8 J h
$ u( y3 A% w$ ~- r% X Q5 V/ | 关键词: 条形码
$ r. V y/ ^2 X1 c ! R# H# x1 L' g3 p. ?0 T
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。5 k3 w7 M" E2 d: G; A
! V! _, I8 a2 E/ z! t6 u 目录* w6 y, P1 N; w# H2 |
4 G5 n7 Y6 ~" p7 v. [ 1.某校图书证编码规则
) n; h; ^& e( C6 J4 ^% ?& Q" A3 X 2 k9 D! |! Y' Q, e' D |
2.条形码制作的过程! l9 T/ B9 ^2 y& b; z8 a
+ F6 ~1 r5 }* t& h" E2 x
3.打印与测试
- e3 M* |% ?6 f* ~: M 8 ^3 X& N& f" p/ Y
4.扩展应用
2 u5 {& T$ C* L1 G
+ r9 |! r. b9 `% t$ l 5.关于本例的一些思考
8 c1 |9 C! w; J& a 6 w0 B9 j7 I# ~, H
6.免责声明与使用注意事项- k) R/ R; p- b, A1 w" X% A+ U
6 z* F' q# `0 f$ n# K) {
7.参考文献
% K! m/ o& `* {" O4 ?6 g % z% E9 b. o) ~; Y1 M) D* u g
8.附录, O5 s0 u" p* O) h: ?/ W3 b6 K1 B5 |
, U0 D$ x. L5 m* M1 L# i( k1 I . O8 Q6 S% Z, W3 ]! g Y
: I* }4 _, b+ F. l1 `- m! `
# x2 y9 q% \6 g6 P0 O7 I. ` 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。* A% {0 b5 E/ S; A7 {) o1 s$ S; ~, ~
4 S/ X4 U1 ~4 e. v: A$ l
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
8 _" b0 h3 D) p! c! r# ^- f
9 D$ s+ W8 Y3 q7 ?0 \0 B _ 1.某校图书证编码规则, K$ e6 U) A; f9 Q5 r" E
3 O( g D v* P/ Q. v# a( p
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:+ e" t- k+ W* F/ ?& u3 a
- o4 \5 u6 E# M8 D0 e8 J& P/ l
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
9 u+ v( _/ L$ p0 ~2 t' T$ M + D; G# f* \# y2 Q% q
②图书证的白色条码都是一样的,分为以下三部分:
- K" s7 r' T; w1 {- u3 e* ]# E 3 r2 O) S' Z) `' K* f) Z0 @& W
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。7 k: n/ @! n2 }# @( z9 ?
) t6 H" y1 a q6 E R. f- W
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:# m0 Y( Z" Q1 C0 N$ l; h
$ ?$ y. |# L, h g 1)起始部分:00110;
: _3 K. F/ l: u9 m& E$ x* I# t' q
* v" v/ H8 @8 V0 q4 P 2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; 5 K1 X, o$ R G% c0 @8 c5 L, O
* O5 i6 l" B0 _5 I8 [ 表一 某校图书证号每个数字对应的代码 R" P& W) \4 y
# S* n( O# E0 K$ o 数字 代码 代码数字来源 数字 代码 代码数字来源 & b, i7 b5 C, E/ @+ ]/ m) Q
1 10001 1:0001 6 01100 6:0110 R1 [, k7 p1 ~( E4 s
2 01001 2:0010 7 00011 8:1000
) H/ V I7 Q4 z2 P 3 11000 3:0011 8 10010 9:1001 5 D/ m9 N# n: G) B* I' V: Z
4 00101 4:0100 9 01010 10:1010 2 z2 f. c: j4 @ C! T
5 10100 5:0101 0 00110 12:1100
- [/ A, \4 E2 [; \* U" M# ~ " r( }, j' j7 o( |* e
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。5 F, m" o$ O7 z. b( u! f$ o
2 G* ^6 s) {) p! p$ D$ S& _/ ? 3)终止部分:00110,与起始部分以及数字0的代码都一致。
1 w: P2 O$ t) J( ~9 N- J
2 O) m4 }# t9 }5 u L 2.条形码的制作过程
$ a) z! H, B9 a3 R : G8 d9 j5 k1 j+ t C
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。5 x2 A |' {4 c. }; C
6 K w M8 x3 y" Z! q 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。0 Y5 ?5 f: x7 P: z+ o5 M
) X2 Z7 `1 g1 g0 C5 d 条形码效果如图所示(程序代码见附件所示)。* i' x7 O' h9 m" Y$ z+ r) \
; t- P# I6 L7 k# F/ D 图一 所得条形码效果图
& c1 f, u. G/ v+ E 8 S% W8 h T8 n+ t0 o' f
3.打印与测试) a' p6 ]- N8 _+ }# c+ i
! s9 x2 |& V; z/ z# U 有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。* b0 P8 f% n" }4 e
2 h* H% K h* z1 K- ^/ r/ | 因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
1 N g5 f7 {9 }4 v+ x' ?+ B # B% c* v! m* \: U7 t0 h
为了方便进行测试,本文打印出不同大小的条形码。! m) M' y& E$ Q4 P( N- ~2 w
1 T7 {& c9 V$ N: a" a
测试一:将其用透明胶带粘在硬纸板上。
4 F0 X6 [4 R5 Z3 c+ b! }5 t, J
) e: [) a8 G w4 T; C u/ } 结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:1 n5 I/ q3 {% N8 Q
( X# v, m! v- y7 @- q# | 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。6 N3 b$ T& r" Y1 ~: q" `/ ?
. R9 y8 P! O( @1 \# F6 p% q; |
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
* k0 q( F) _: e, J0 W# k3 n
3 Z& ^8 P3 l: B1 N! O' X 效果如图二所示。
" R3 q* a4 O. k
, C* Q. m* W. s
图二 打印效果图; c# y o4 V5 N3 L5 R1 e
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。, F; ^8 R% d. i
( q' J1 q9 c* i' l% Z0 s
4.扩展应用
% ]! o- B+ [; T) p+ ^; J, Z6 v7 p+ f
0 q/ ~! j- q* ~) Z 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。' X1 }1 p$ X3 o i
9 V. k _7 u& _, b! }7 s 图三 可供彩色打印的图书证
% h9 R9 X) m! d1 O. ? ! i) r7 L9 q. M
过后,我们会给出相应的网页版、C++版、VB版等等。3 g, g5 S0 c$ b1 a" M
4 H$ m. r4 B) L { 5.关于本例的一些思考
; z& u* e5 I! w/ q* ~' r9 Z
) f0 A6 m2 X/ X7 A) E 由相关文献,可知条码技术具有以下优点:
, W! l0 {; d) j8 [4 w) t# Q% ` & \, ~0 P1 `6 q) l% `
1)、输入速度快; # P) v1 X3 q. b7 s. H5 w' f3 a7 V
8 }, b3 p& u6 h# u2 f- i* g
2)、可靠性高;0 B$ [( D4 }2 L) r+ Z; }: V
1 a" x+ Z* O7 z
3)、采集信息量大;
/ z# K$ q% |9 R( N, g7 `6 ]
8 @$ K j3 ?( X( }/ F: Q 4)、灵活实用;* h. z4 t# t N
4 a" m( o! V7 y2 Z8 ~# F
5)、条码标签易于制作4 |- M/ Y' T) [6 \9 w
. L, I2 ^* f3 I5 a. O( g( H 6)、识别设备操作容易,不需要特殊培训;$ z$ z) i$ F6 X. F2 b+ E m4 y
* P0 [; E$ ]; Q# s* o* O6 z2 x 7)、设备也相对便宜。
; c2 c6 N! h. w! d
# F. r; m1 [# P& E( n/ o. ]: s 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
# Z: d9 w* `; A; x: Z( a* y % z+ S* A/ |* A0 y- h
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
6 Q+ |' @4 H# k# P/ B* t$ E
7 q0 q7 G/ C& h" Y# j 图四:常见的二维码! }# U6 Q* ^% r$ q& D. [% k
2 T U6 W: E' r4 j: |
6.免责声明与注意事项, k( q! l- @( B3 N# J' r
- f. K/ W* e9 D1 G4 N2 L) m
版权所有,翻版必究。5 L- b' D1 l5 F3 N- Z5 o2 X
* @0 z' S' O/ N) B" Q) a 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
( \. }" m r2 k7 v- S9 ~ ; x: g( A- N1 N! J! m/ w, G2 V
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
5 U% b5 ~5 a) x) m- o
; Z, E6 F; g, S) n9 k( m, y* m) Z9 x 7.
8 D9 ^& S8 U8 P9 A 参考文献; M3 J1 x* D1 C' d
( b3 ?% v1 T3 G3 f4 x2 T [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]% k- K9 R+ l2 ]3 ~8 c( \7 n7 |
4 |* N8 V! k) |9 ?0 w% l5 j! t
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]
2 u. V* Q# b8 ]3 f$ s7 S: ^2 x( l 5 G5 g5 e' G, a4 [
8.
5 m$ u* _6 J) U! r; _" ~ 附录6 q, G: `! w6 l |. G5 J5 ~
, o* m# f) @* g3 [ 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
; S$ c7 m: U9 p) x7 m4 n7 E( Q $ J+ l7 Q* U: D: D3 `; h& T$ `. z3 x
%barcode.m
, ~9 \8 Y) P5 A& P7 l+ k5 l" t 0 l0 | ^+ l6 |* [3 J8 m+ Y
%生成学号a对应的条形码2 V: D# B4 A0 Z) W% v. C/ _% n0 }
+ U& o4 W3 p: F) E+ i5 f5 k
%2011/09/25 13:24 BY小谷同学& L) ]( s' m* X
: z+ e* |- t* f6 p( f a='1234567890123';%学号,自行更改; E& {" R, |' E' d1 z$ J( f+ |3 Z
2 @" D( v7 e1 f0 N
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;. ^5 ^4 E2 z' ~; p' o
; i, b0 c# ^' R0 e9 O- L9 a 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];%数字编码3 j" r8 ~; t6 S; B {
1 E0 U& J! ?6 T, u$ k. f- r* V White_num=[0,1,0,0,1];%插入符的编码
- D) T5 L( }/ c0 i
( S) l% w% F" n/ F7 { %Black_SE='00110';; X( d: E9 [3 C H
4 R2 [8 o+ f, f
%White_SE='10001';White_M='01001';1 V& a7 | K% t( r" Z3 }. x
9 j- k1 @; g3 t9 E7 [7 T
barheight=30;%定义条形码的高度- r, @) y+ A8 h6 l
9 M, f" H: _4 s
barwidth=1;%定义条形码的像素宽度
+ C$ f" f Q2 p- q } 7 q# b# l/ t6 k: {- A8 \" i
+ Y8 B7 q( I* Z8 z$ l C4 g
%可以对特定长度的输入进行控制,本文规定长度为138 K- N: t) P E& |' T- E0 k( O
' d; b$ D: ^4 z! H5 k
if length(a)~=13
6 Z @, W1 d/ X. S0 _9 s& R& O
& @" X* t3 @4 ]6 G& v; L+ z
. s+ ~# W' m: [/ H( {2 G error('图书证必须有13个数字');/ H* X/ a; {( `/ G( h3 n% x
; U @( X# u9 W5 \ end
4 [' Z: c1 E* ?" \$ x: x' T / R3 v' e8 Y: h9 e7 [% ~
( }% ?. S* Z* {4 q. ` barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
3 {1 Y! \( h W D) l( X# ?5 s $ G8 }$ h3 Q; k b+ _$ q( p: ^ R
%为方便,直接人工得出起始与终止部分的条形码
7 ~1 g6 Y8 `, s6 ~ Y d# v+ ]
4 n1 O2 y' k. Q2 ~( a %也可以由程序生成.
: f- K4 d8 z$ J- F) ?5 b8 ^ 3 E2 G, p# u7 o: x3 M0 Z& O$ X7 L
total=length(a)*(7+7);
" {9 s% g0 T: \: K7 D( Y. G9 k 7 Z3 C+ {3 ^% E. T
%条形码的总像素宽1 T/ ]' P- \3 v$ b- g
; `2 x& r( \% u! g. y& m
%也可以不用求,因MATLAB提供的均是动态数组
2 i4 G; A/ q# x0 J2 _, f+ j
& g3 @3 P) Q+ j4 b& s m# { s=1;%计数,记录
& y8 {" R: h! X s# @" F2 e
9 A1 @- Q9 `: g6 |/ H ' z- F8 T& u; D3 {
%由于利用for语句容易出现不可预料的错误
3 R2 \2 L! V% U* Q" o 9 X, ~1 q6 g' i$ i# T0 Y/ F* M5 U
%大部分是数组的行标与列标的调用问题,于是采用while循环2 R$ Y! u* w# i1 V7 y' |8 E) `
" j! Q, ?% v9 H6 b( |7 l E% k
%嵌套循环,得出数据部分/ u8 W8 p0 ~3 B2 {) X% @
1 u. ?4 J$ R. ^4 _
m=1;
) h( u+ @' |/ q, N. O8 l/ v% C! o ; J% U7 [" ]4 y
while m<14
! j9 D& J, R: W6 v; E0 ~- n
/ X6 [1 Y" d! S9 w, H + M; q# d6 N8 i5 v8 O* V1 H
if a(m)=='0';
! g& N p- i' M2 K - c! E2 P; K& v9 d
3 s- r' N7 F0 _: ^8 i. w+ ?6 J) g" D
t=10;
: @# z' I: ^ {% ~
& Q; l" v' u% M; _
# H( p5 F% i- {4 L5 g- i' ~ %若为数字零,应该调用的下标是10+ u D) p! J- A/ ?
1 |" x7 D' r* k2 L: \
7 U. R n4 k7 l( D! ~1 s) [ else$ s9 A% T" S* M) F0 E* X: u3 F
3 {9 a/ U+ O8 w* c
: T: g4 I8 e1 w5 ^& \1 L t=double(a(m)-48);
9 l' \8 d, p6 o1 Z
" Q: s5 c' B7 |& J2 o %由于输入是ascii字符,转换为整数需要减去30H,即48% d% N% } m2 y5 g
' c P0 b% B: J$ k" \7 a _& g$ j. b; X% o
end
$ @ T" t+ ~; [6 K: q
~; Z$ U+ x1 P/ L- ] 8 J, s# Q& z P5 Y5 R5 \
n=1;%同样的while循环0 \: p; l8 _7 r7 N
! h7 a1 n! k0 c3 y$ a
% M0 t- t9 O% u( A* Z. \ while n<6
. W( P# [% R, r+ ~
* m. v5 i8 M, E* M7 C7 d b
" h0 w* r; i2 _0 W if Black_num(t,n)==0 U( [' y# q* C6 T9 M: D# ^
5 a/ w/ r" g5 |3 Y2 R+ e % r8 @! t. Q* }/ l7 B6 V1 G/ Q
barcode_M(s)=0;; [* r- \6 n. ~
' _$ X/ T. K2 q* k
8 v2 h6 F4 k8 B0 P
s=s+1;2 \2 g) I0 S. U. d: d, i1 E
0 f J6 z# d5 v& S3 t% W
- L& W1 u5 D" b( Q
else+ G' S! U6 j0 j# b" X$ O
6 b; I: [/ y. u# Y4 i$ v1 N
! T. d! x- p9 Q `
barcode_M([s,s+1])=[0,0];# b3 x5 }% o9 A5 r- e- i0 D& T
+ v& e) X% v& \, P" ~9 }9 a' g
) w! R5 b k) z2 o' B( ~ s=s+2;* J- r4 b5 [& d4 I7 v
" b! t% A" G# [( b3 W1 h. l
7 Y# h3 P8 u+ j' L. J end
3 ~' T# x8 e( v+ l4 X# n9 j# m# {9 y , C7 N( g6 U; t* a
5 q/ Q7 Y+ d' D9 ?% h/ D* |+ t if White_num(n)==0
}0 w; D, Y! {% i' G, p / J2 f1 P# s1 f$ }1 @5 A0 V1 [" m1 C n
5 w% Q4 L9 W/ z7 u6 t barcode_M(s)=1;6 t) n' a0 G; V( p3 [5 V2 _
6 H+ H( D: b5 F, R' { 4 u2 S* D, ]( ~2 k* A' W
s=s+1;, l8 s0 K( Q& {' N* K4 A, o' _
1 D1 x0 A4 U: ]* V/ D7 N/ S# t! Q
5 p$ }' L7 w6 M5 x
else
0 `3 c- R9 L' _) ^0 ~& D
2 T: E" b) n: Z; D; F& D8 o" H& t) k1 i# K ( P1 l6 Y. g2 v4 w2 z& c
barcode_M([s,s+1])=[1,1];' @: X! m5 }% y3 B& ~% A% f$ o
# b0 q2 W6 { ?8 \7 P( G/ _. s. u
# |" P) y+ ]6 a* n$ V8 v; j
s=s+2;" w( C+ b- n6 g/ S8 E: `) s
& A4 K; Z4 Q. W% u
( \: D g9 Q. L5 U2 o) F
end
! F1 {4 c* C( k& ?( f) W9 w 7 h& m0 A7 B; m& n
: l% z5 i, [# r: L n=n+1;
0 p+ b5 y( Q. U8 N' E : N. S( ^( f7 l4 E
/ L+ [7 G/ I4 M; j$ Y end# r5 x7 m2 l; t" X3 T
" T: b. G: B$ z& q' u/ J m=m+1;3 J% ?$ N$ k+ a4 O. ?
2 F5 b5 m3 j' A' ^- n Q
end/ P( Q/ H: [" z# i9 i
, w' C. t6 M: A( u: g6 q5 ^' H
# U' A; _( U* L6 @/ E bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];% K! v9 a* g. V! l4 b2 j
; |- H: o6 m" d %将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
' }! I3 ]3 p% y" U' T! f0 | . b( ]' T& _+ {+ u: o& ?
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
8 H6 S2 C" ?1 y; e# |+ I0 x! r
; \" q1 i( s9 s imshow(bcode)%显示所得到得条形码0 g) y$ ^! g& t3 d, ?% i4 S# w' W
. O$ g6 g+ c0 O$ g: K
%然后可以自行存贮得到的条形码2 U* {1 _' Q7 P; j3 h! K; {7 l( V0 J
9 ?/ }# t5 ^+ Q( T* c1 u& ~
%然后用PS等工具得出具有自己特色图书证啦! Y( n! f" ], c: s0 b
* ?( b$ @2 v, o- i1 c4 s [2 ?
0 |8 Z. _/ e' a+ h: C2 Q
zan