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