在线时间 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系列之——某校图书证条形码制作
1 R+ c) c7 w( Z& U, ?# a* E! t / i7 ~% u3 y& `* l1 T
小谷同学 2011/9/25
0 z3 |: U; ~2 G" W 3 ~& w' c9 l- ~) b. ?
摘要
" O) T5 M! l' J* X G( R; Z $ `' N+ [) j# G+ T6 V4 f/ ~
关键词: 条形码
- w5 `1 ^2 N$ t! s6 v3 j : e0 l/ t5 E& O5 ~6 ]% S+ r3 R
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。7 l3 \* Z) V$ r0 ]7 X2 v; n+ S+ S. ]
9 V" l+ ?$ R* W1 R 目录$ ^. _+ }( F& E' [ G2 j
& @5 ~8 A& ~7 D& w' m$ N 1.某校图书证编码规则( _* y2 A8 ]; R$ W& ^! Z: K
& w5 z6 h3 {' H
2.条形码制作的过程
5 R8 G3 Z+ \) j. x0 n, y) w) i " u8 o* x! |* N& {
3.打印与测试$ T0 |! q$ ?* ^# a0 h4 D
$ K4 b8 @# j4 J* O' h" F
4.扩展应用
1 R: t0 a5 m3 m# g8 }0 d
7 I, {, Q) H1 P5 m# I, S2 I 5.关于本例的一些思考" {& @6 I2 ?' f4 z/ O1 t' X% k5 U
: }7 J# J6 n; z8 H7 [% o
6.免责声明与使用注意事项# K7 R* [; u A7 e( [
- E9 M# ]+ f0 U/ r# }
7.参考文献
/ Q% d; W5 i$ l/ b9 S# E( p. A
; N, I! g: F9 F' t8 Q" [ 8.附录3 y9 ^# Q3 h: n( A- Q2 }
" o& {( J' U' _7 _( E& B, M! ~
4 ^% X9 t' t$ J& s9 T" I* f( O 9 n2 v: T/ m+ K# T# g
/ r8 k- d, z+ O0 j1 F' E 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
* j0 @3 u! E; Q+ E0 X3 A% ?
7 c/ w, [3 ?9 c 在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。' e4 H' \% M6 r( B! F
$ l& b. ^7 _* C4 f' E* E% @! D
1.某校图书证编码规则
; X4 \( b( o! `: h& t 0 U7 E7 z' @( ?2 ]* ~
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:; y$ I/ \7 G; g. |8 o1 G3 u
4 G! S8 C7 e. I: t& }7 f3 [7 z$ o- K) K ①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
- z( u G; u' ?9 X4 o% {5 `( D8 Q
2 A/ m2 N4 S" x* G; T* H ②图书证的白色条码都是一样的,分为以下三部分:) }9 E. F9 j3 k& m/ R
: B4 Y! k# d9 n3 } 1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。+ @5 {% a/ h! t4 E- ?, O- F9 l: E
6 ?- h3 N& c6 O/ a/ t
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
; s, D+ _/ i, H9 I: R# q# K + ~5 j+ J) Y2 p; i5 ]' j! p
1)起始部分:00110;% w( N' @# n* \( C! P1 ?) Q, `
% L ^3 i0 K! I- d4 C$ k) W. y
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示;
# d& ^7 X+ r) j
7 o5 l: }/ V/ I2 t$ ~) ^/ O 表一 某校图书证号每个数字对应的代码
: r3 k! `+ s) N2 a . t* t+ u) l. q0 e# K
数字 代码 代码数字来源 数字 代码 代码数字来源 ' P# ^, m. H8 G) ]3 C: X
1 10001 1:0001 6 01100 6:0110
" O7 @6 V# a) u5 H 2 01001 2:0010 7 00011 8:1000 % K' Q; _- {" M
3 11000 3:0011 8 10010 9:1001
7 d+ E+ H. Z& z$ i X6 V# X 4 00101 4:0100 9 01010 10:1010 1 P1 o) c+ o/ V% m9 b4 }, z- ?3 M
5 10100 5:0101 0 00110 12:1100 + K* l( m/ z0 M+ ]. A
N' f# o# G+ E/ T+ I
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
" M# n" s7 X# ~6 n 7 X, r3 G& X2 H1 ?: L+ h. y/ @# x
3)终止部分:00110,与起始部分以及数字0的代码都一致。8 |3 D/ ~" A; E- P. K* e
* y' _2 ]8 {0 C" z+ w6 U
2.条形码的制作过程
( o' r7 H& {0 l3 D
$ {% b& f1 F3 l* t* O: {3 e 黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
) o4 _. [9 H9 B9 m5 W/ F & R# V: k0 R, u' D J- s& b! w
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。+ b$ W% H% K9 |7 k! a
) F/ }- Z! | O3 ^# H& M: _ 条形码效果如图所示(程序代码见附件所示)。/ q" k+ P' D( w. k7 z5 g( X
2 ^# y; L j# V2 z2 @/ {. h( E) b4 c 图一 所得条形码效果图
: o/ M0 x2 C' f! q
& ~' [7 U& y/ j3 d2 D7 E, A0 _3 h 3.打印与测试, u+ v" ?% B# b u
: d* F" R/ O: R; b9 D. Y6 j 有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
, T, ~( M$ u" z3 H+ X! J $ @# D! w! m# l- O- O# T0 M
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
& Y i3 o) f6 n" b , e1 e1 t" I+ W/ i4 i+ V$ H
为了方便进行测试,本文打印出不同大小的条形码。7 i3 N" H; Z2 o2 [5 S0 G0 \
& R- G& i* P; t8 y( D) e& p0 h
测试一:将其用透明胶带粘在硬纸板上。4 K, J2 X, ?* J8 n5 d- ^5 b5 x' U
- N& f( v& f# n% C1 x( q
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
/ p" q' Y9 ]3 Y) C/ J% w" c
. {) O4 F9 z+ N0 ^" ^+ c2 L 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
1 E6 `4 V* ~& P( k5 X/ u2 u
9 g0 s. F* x7 g 测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
& y/ e# T" G& N+ n. p
; |2 ?/ @2 d( Y 效果如图二所示。
' o3 ]4 p% j" W; C
" i' u4 [( |2 h: H
图二 打印效果图
/ _+ b: Z- r0 |6 @ 测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。4 Z4 n& W* x5 C" k3 S
3 M7 M o: _7 i% ]) G" Z; K7 P 4.扩展应用
5 U# K+ z3 v6 O# d3 z 3 w; p) i! l2 r
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。4 p) |* e, [- h: ~2 [
8 V1 x0 N Q! n! F* o- f
图三 可供彩色打印的图书证
0 F- u9 Y8 n9 `8 ]$ H% T
5 p$ ~: m5 T1 Y$ f, W9 K. I( X 过后,我们会给出相应的网页版、C++版、VB版等等。; y7 M8 ~" C' f
& c) S5 B6 W3 C a% D6 a
5.关于本例的一些思考
$ c8 p. }* `2 ]( B9 `9 l2 i+ w
/ p8 c6 t4 s: b9 V, c 由相关文献,可知条码技术具有以下优点:0 d$ @' H; \& B2 u7 @! A
/ s. r' j! b% v# P* S
1)、输入速度快;
7 l# b; U- L( D- ]+ x: i. p
/ _9 R8 G/ K1 `+ j2 Y8 _ 2)、可靠性高;
* h) @" T4 F% P! ?/ T , S) x& t `1 ~
3)、采集信息量大;0 Y* d3 i2 y- K5 B. M7 o
% i4 h% N% a4 p1 V 4)、灵活实用;: x. c4 O% v7 S& ` @
# H+ j; E4 E% }- x5 ^6 b
5)、条码标签易于制作
) i; |( y4 n3 k* `
+ o( C! y7 y7 M4 B0 `9 I- S, t 6)、识别设备操作容易,不需要特殊培训;
, m# L, r% }7 g! |9 r9 j3 m4 P , U0 d; _7 Z; s$ H( R( w+ F$ P
7)、设备也相对便宜。$ y" n6 l' S! Q" s& j4 e
( Y, \/ {5 r/ W1 W 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
J0 t: o& V9 W* B
C' m0 k1 w9 t0 @- i 由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
9 V* V4 `6 J3 _+ }' f! Z$ x; S" d
5 Y, Y- d: J. K: W 图四:常见的二维码
6 h" U" P1 Q" W " d- R& D- x8 ?4 }
6.免责声明与注意事项
4 A3 |0 b- W9 o 6 M3 r h/ W9 E/ v1 [6 ^
版权所有,翻版必究。
5 c, Q5 a- X# Z1 u) ?1 ~ ; Z$ g( n$ G: |4 E+ Z
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
0 m* Y: B* N9 O' c( R ; W8 f! C- ~) v" s( K
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
! V" @! ^3 M4 S. E3 v1 R) `3 i " A2 r& o5 n: E$ q& b; P1 E
7.; \; g; _ O" z# b! H
参考文献
6 ?# Y5 x, f$ h% U6 |$ b7 ^
: F; t" p( S) E" m5 ` [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]
4 {" f7 @$ W& m' b
_2 J4 R9 y/ K [2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]
; ?- H* Y5 F4 U" A; Z8 ?
1 g' X1 N: R, \3 T4 q+ I 8.* ~/ l8 l9 j3 \# x
附录
% f6 _# a2 ^9 q0 \
. L1 o5 \- a' t2 s z! R6 l% f 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
( f9 i& h J; d
& Z ~4 }5 C* j6 `1 {; v %barcode.m
* r/ a' }8 {/ D( Z/ b% d* D s% Z0 b1 U ) M$ k. R1 n& k* l" S* z
%生成学号a对应的条形码+ u9 r% N# t- G6 p- R9 n0 }( L
) C/ o$ R4 r5 M: B %2011/09/25 13:24 BY小谷同学, o5 Y+ I: J0 Y" b3 z# n L
! n [$ Q- R' J7 n. M0 u
a='1234567890123';%学号,自行更改
! ?% j% M9 c8 K; ^& | ; Q2 A9 r: v8 @( y% t4 ~
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;1 E0 G5 j* V' E, U* h' k! d
+ W0 a E" l: R
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];%数字编码
- S$ Z) y) \; x6 c$ q
7 s b; ` b* ~ White_num=[0,1,0,0,1];%插入符的编码: \+ y) r+ j' M1 R6 |3 R
* `5 H y' J9 s3 Y9 L2 f& k %Black_SE='00110';9 o: n( S% B: V+ h1 `1 y0 `: P+ x; U
W1 j1 m, Q! ^; b- p
%White_SE='10001';White_M='01001';
! g8 g( c' }3 K3 D0 j* B4 G ) @7 |( ^& G2 y2 \) g9 d# e
barheight=30;%定义条形码的高度$ h' I& J* z8 f$ `1 O
! A0 _! k7 \) A" i2 ]
barwidth=1;%定义条形码的像素宽度
" r0 N3 |# o; t' l' s
3 M5 W% h; v5 ^& f4 ?
- _9 n6 H, R+ [- S" B8 w; x# q& Y- I# ? %可以对特定长度的输入进行控制,本文规定长度为13! D2 Q+ n; a3 M8 t( [' L2 b
" a1 i( i) P3 m0 B% ^1 L if length(a)~=13- T# p ]- M- ^( S0 W6 M
2 _# e8 b6 Q/ c f$ \. p, X' q
* C; r9 p3 [7 ]) G( M, c) W& Q* l% c
error('图书证必须有13个数字');0 |; Q& K% b5 [) k; w2 c
1 x) U2 o8 @& j- \4 \9 d end
3 o/ E- V+ w2 ]
7 l5 }% ~" F; _- Z! R- s3 i0 Y
4 d3 f& Q. B" I6 I$ r" m barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];5 c6 z1 ?, l; T
/ Z# H; j/ Z4 L t
%为方便,直接人工得出起始与终止部分的条形码
5 Z% i U1 e% A d u+ S+ V
! ^, w$ m7 j$ J" l0 r/ d %也可以由程序生成.; V( G0 w8 _" n$ o9 I1 v6 ]( o& a
' i& Z' R1 _2 Z, o0 V e9 o, e! c total=length(a)*(7+7);
1 }2 C/ f& D w0 [
" ?- x- R, _+ X+ \" A* f9 \ %条形码的总像素宽7 T4 C% ^! s. X6 }
" G1 r W4 B5 M %也可以不用求,因MATLAB提供的均是动态数组
, E8 f$ l1 B5 @: r 9 W; |2 t+ T, W, T: |! b- J
s=1;%计数,记录
4 ?% ~; y h2 c, [5 k - }2 m5 r" b) b& |" {
! ~0 m( l- j, ]$ r1 W: U4 s9 Z& Y %由于利用for语句容易出现不可预料的错误
7 j" S; ~. S1 v" L. I
+ U! x+ Z; B& R% w %大部分是数组的行标与列标的调用问题,于是采用while循环
: C* q$ q; y, B/ ~! g/ D8 }
3 g+ `5 f; `. m' [0 Z: A %嵌套循环,得出数据部分$ `, ?" x* ~, X
. a7 H; f) T# g! B* Q m=1;
7 S5 q1 I) S8 z& b) M; ~ M 6 m9 u0 O; U. u
while m<14
! e) ?1 \0 R1 g 1 U. C( e" q! F
% }' F- v5 F$ H' k/ k4 Q! g/ j; J4 y if a(m)=='0';
P7 O L3 ~5 v. R; T& ?1 t
+ l- g0 ^5 V p& j0 `& C+ J8 T ! }7 I# R2 J7 l3 X; E; |
t=10;- f/ B( o6 a4 f
) c" [) d* l- M6 L( w/ D$ t* N
( e! n# C/ R+ d, H% C# q2 S# }. ` %若为数字零,应该调用的下标是10
4 [& C4 O S- N/ y 0 f- Y" M* K. x) O4 `( p
+ G: O( K' ]& T) z( y* k2 _
else
1 H" h, g( T4 f/ x ?) R& L2 G4 r! G
( |1 g! n+ I* E/ d( r
: v6 k$ X- |/ x" t3 ? t=double(a(m)-48);
# m6 T% s0 V7 x L
: j5 E# y7 e8 x) v %由于输入是ascii字符,转换为整数需要减去30H,即48
1 S/ ^5 z/ _/ E2 s6 w( e ) x" X: W& d/ \8 c2 a, h* g
s5 {& m% K5 `
end
0 g0 p, w0 Y* g( [1 M
0 ?9 g G! i: G5 C( { " ^4 m0 u* {# r. }. u0 Z! h
n=1;%同样的while循环8 e: N' n. S/ S3 ?3 V/ \- P
# c, h4 P' t# R: `4 Z
. m8 ?: S5 U' l0 q; m7 ] while n<6
" [/ T" H9 K: [, v, }
$ m7 W: U- {4 \3 r$ N2 t" T1 u
; V% I% d! f! f5 S; ~& v( l. V7 q& }& c if Black_num(t,n)==0
* y, K4 T" k$ h3 g8 }
2 X/ b! h& L$ ]/ C" a
8 L7 A3 ^' t* I% \/ o- ^7 D# F) J barcode_M(s)=0;
" C6 d8 q( }# N+ G5 T # q y9 r) b9 b; N: Q- M: d
5 [4 O; j8 V! p3 z+ D& U s=s+1;
$ j: C+ U9 b3 c
x' `1 k6 M9 ^; O. k
' z9 ~2 U# L9 k( R else. T5 v: [# D0 n j6 A2 j
y5 ~' c( [, b1 J. J3 i, `. r * q% ?# x- \- b% g0 \9 ]
barcode_M([s,s+1])=[0,0];9 D; T. B c" `8 P" E' \
) r9 k- Z) T% @, j9 [9 C) T
; J9 v! Q. L/ b' |9 u s=s+2;
8 x/ t ~* H9 ]! ~6 T
' D1 V5 j" G8 K3 u
# O( [- r$ ?" `/ U end
3 d7 x* [ M' d* t8 h4 u! u) H7 V/ | * p1 r5 o1 `9 }: y' E. L$ e
+ w# J! U$ y" a: g6 y0 I
if White_num(n)==0
. [3 f% @; I& Q2 W# E0 y; p
/ F. [1 P5 f8 h/ s$ }( |0 _* f 9 Z% G( b0 `4 |, k5 ^# @; `
barcode_M(s)=1;
6 A( e, \9 y" X) g
1 {" G4 R# s2 d- ^
5 J2 a5 X. Q/ E2 ] s=s+1;
# `5 H, ^2 ^; a9 |
1 Q0 {: i# E( F* ^ 2 f% {: R" f* ^8 E) S
else! N8 K* o1 V4 r/ D# u8 }
4 h9 H6 \& Y0 K$ b" C# K' f3 \: N - X% k2 l2 G" Z2 P
barcode_M([s,s+1])=[1,1];
0 a( J8 i+ ]7 @
+ X4 l3 q& h: ^) y, C Z2 u 9 b1 h9 E. j2 q! W5 W
s=s+2;9 B% d" G# B# ^9 o) b- E7 W
$ d5 J5 p: R; L$ s9 J
% c, D4 e; C, H. R end
5 _1 O) u" C6 \# Y
6 \8 {! u K( I Z0 g F3 m6 ]& H6 I9 Q$ K/ g2 x
n=n+1;- Z& e( j0 T! {
; p3 Q1 Y/ J' l' p" L& Y
& n9 y, s/ Z2 v T end' D* y: k% w% H- Q
: @; r3 c7 w; O; h% U4 L# P
m=m+1;
& f# G6 b) A7 J+ ?* l, Z $ Q: g2 J; W/ f
end Q* S) M/ k( f) i
/ T( |* o4 V# M
- x( `% y: t9 A6 h
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
( O2 b6 w/ S4 W/ l) T3 [$ q" t - I: `! }& t' s- v8 ^7 f6 X
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵: _' }- D% `' X8 v2 T- x( w
7 L( J6 p% q* d, }+ e
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array); F, M4 ~- L. ]5 _6 i$ w2 a
' _2 q4 k# c' Z6 a' v5 K( _8 x5 x" U imshow(bcode)%显示所得到得条形码
8 Z# J& E. E' Q$ X7 A. J ; M; {. s3 y1 a1 I/ P @' `
%然后可以自行存贮得到的条形码- C) u+ }7 a7 d4 z9 Y! |6 k
; y/ @6 s, X8 T# f1 R% d %然后用PS等工具得出具有自己特色图书证啦
" N$ H; W( \. D* G
! x# O0 c2 |- `$ p7 k# {; n 1 Z# S: D; n- N1 w2 u
zan