在线时间 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系列之——某校图书证条形码制作
4 J" \0 k- s s- M( Y- e' B1 g" K 8 c" E+ f! B+ G& k+ x, c
小谷同学 2011/9/259 P; S1 R6 w! V% X+ u- F& I
) `, d3 S' [8 x$ z) n/ y. f0 I$ N
摘要2 ]! m# ^2 y- h
5 K6 S) i. ]0 K9 z* Z, m! H 关键词: 条形码. }" d( ?1 A2 i1 C# K# _
& t* s# w) z* e
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。6 s, ]# [, |, g5 x
0 J) O1 }* p$ q4 f
目录
4 n5 v: V& ^8 Z7 B ! M1 \. d; w; [" k
1.某校图书证编码规则
# ~. ^3 N0 Y+ H$ g% D6 a( q/ t 4 L7 D8 m3 f/ L$ _. r) O. D! ]! }* `. _1 F
2.条形码制作的过程& V( ?! {# a4 h$ ^; n5 O
# w" L u! D* i& o3 s J7 D5 Q. \
3.打印与测试% w/ w d1 d+ @5 q6 u9 L% P" L2 s
. ?3 g' A. ~, k3 F' O0 |' v 4.扩展应用* x) h1 J: f* p' b
- X* D7 {) z" j- @6 P$ D
5.关于本例的一些思考
1 s' X0 i0 s7 u
! H/ x% ~4 ?% O* Q 6.免责声明与使用注意事项% p r$ `4 R; U% i
6 L9 {6 [ V. A9 ~! n; D w( C
7.参考文献
* V, n/ x; u3 c0 ?" s, V/ z 2 p% D4 w: P; j) Y4 Y5 u7 Z
8.附录' h4 h5 a( r& r3 H' K' T
L0 J3 c6 ~. l4 c! K* ] " o+ o3 }1 e9 B1 P3 @: Y4 B. W- Q0 k7 G
3 A6 D- E, V# K1 r
" E: g3 W) \+ c' k$ N( o 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。" S4 ^4 V6 `6 e" c* E* g
" `: k2 ^! l* [
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。6 f! C( P# V# q' I
) K! Q: T9 B$ b( _
1.某校图书证编码规则
+ D( Y2 p/ F6 ^5 X
, P- ^ X) c/ n" M/ z, @6 t) A 由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
: u7 @+ [8 _. w; W/ Y' q! F + `1 S9 h L, S* g1 C
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。/ A" u, U# V1 H f' {
' j! B4 Q. G; |9 S8 r3 B ②图书证的白色条码都是一样的,分为以下三部分:
. H x" M5 p: b& ?$ @! ^ 2 ]' L9 R: y2 T! \
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
7 P8 K2 i! z% C& `0 T/ h' w6 _
! ]! Q6 W, B/ H7 ~6 ?: ` ③图书证的黑色条码是携带学号信息的关键,分为以下三部分:8 u7 \& r1 i+ w# @
4 G0 N/ T9 B; L' Z p* F
1)起始部分:00110;
- i" b1 t; m' N - B, N5 k; y0 X( U) G
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; / o% d; u4 \7 e! H) @( U4 J# d' p
9 R: t; H0 t4 m1 }( U6 O
表一 某校图书证号每个数字对应的代码
6 J8 D. S d+ f: H% d2 c% b% J" f' f0 G - e1 f X4 g5 g. ?" D9 I2 \
数字 代码 代码数字来源 数字 代码 代码数字来源
& n. d2 b# H% D F 1 10001 1:0001 6 01100 6:0110 ; O' r% H8 T6 i1 Z
2 01001 2:0010 7 00011 8:1000
z! j/ F' F7 p+ R" a 3 11000 3:0011 8 10010 9:1001 ! j2 b/ y. C' d0 M: T
4 00101 4:0100 9 01010 10:1010 ! C& q7 S3 h7 ?+ a
5 10100 5:0101 0 00110 12:1100
% A: [" F4 e8 i5 C2 z * B3 A A) F. ^* K
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
# o. X8 ~/ v: y* q- }' v" X
8 j7 Y! O* S' K 3)终止部分:00110,与起始部分以及数字0的代码都一致。
& _0 u3 R$ h3 m9 }* q7 L # w. ?/ p: p! D
2.条形码的制作过程) Y$ u$ k, N) ^- X. C- [7 p- C
9 j s* g7 t2 C9 s6 ]% ]" C9 J4 K
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
& y. T) K/ W+ N I Y |
& }5 C0 Y# Z& m- A 定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
7 u+ w1 W$ r: F" @! s
3 o, Y; l* s5 K s) i' h 条形码效果如图所示(程序代码见附件所示)。: w* k& D! h, g/ U4 G0 |
# Y% x% ^5 Q, m m. ?0 [0 A0 r5 M
图一 所得条形码效果图1 T& E" m0 \0 Y; B( q0 l* h
- c! n6 N) n/ ]5 y- M" z* V& c 3.打印与测试
: R3 v. t( s( N/ ?! _ 9 Q+ ?: J7 B$ i) I6 a- P, b7 f
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。. Q$ j) a. _( v- ]3 l
, Z; v7 L2 g& M% ^4 y 因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
6 x& V6 g- S+ y* p& P1 B 9 p: q# ~# g+ B: j- t8 m; n* e. v f
为了方便进行测试,本文打印出不同大小的条形码。
. I( ` L. ^- N& h' s/ b & Y' w! K$ W* k4 N* n8 w" Z
测试一:将其用透明胶带粘在硬纸板上。
- N" M T. R% S
8 f# }" h0 d: U* w' ? 结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
0 A9 t" _1 x& _0 w
) K c( @0 M% C/ s; {5 x4 Z 图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
$ P( u6 h4 j9 t) Z / k9 Q, X0 ^! s+ D$ c$ t
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!! r1 [7 X1 E" p, f. r
5 l) `" U, s b' \
效果如图二所示。6 S* b) t! R8 f& V7 f* J
; B8 d/ F7 p- i" e
图二 打印效果图+ F. z& ], U4 A/ j: t; x' {- w
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。8 l4 Y3 X5 d1 `* d1 i% h. V# w
5 C: D. c2 x$ W) r1 {
4.扩展应用9 e4 Z5 v" N* E; R
# Z. C; f/ ~) `) K' \: S 为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
+ S1 Y5 l" D9 b. e9 n* |+ M
, S& _" w# S* n! l1 h2 \! ]! Z/ M$ v 图三 可供彩色打印的图书证2 V. r3 e" r. Q) B. M8 y Y# T; h
' P9 n7 [, u, _2 N$ Y
过后,我们会给出相应的网页版、C++版、VB版等等。2 w7 E I% _9 l# f% r/ S4 Z
" H- G% ~7 h( k" Z
5.关于本例的一些思考$ d7 b. T8 W& O7 a6 X
8 K) o6 E7 b5 F1 W5 E
由相关文献,可知条码技术具有以下优点:$ c& f: @, C( @+ i
! x; o! q( y+ V3 v) E
1)、输入速度快;
5 v2 J+ b! \& U& I9 W; r- |* I( S - d1 y0 w% G1 O* b
2)、可靠性高;
( y5 Z. b8 R& l$ e* w4 i3 o
. s; m) l, A3 R; q 3)、采集信息量大;
0 G( }3 K" X& t ' @( c- M9 h8 @7 N1 g1 ^2 F a9 s
4)、灵活实用;
1 h0 @) D/ F8 R8 u5 p4 D
4 [9 [# p @2 C" i 5)、条码标签易于制作
7 b3 {2 s) d0 Y+ y# I5 M9 u7 ^ 6 C. v6 K6 p6 M% S, r
6)、识别设备操作容易,不需要特殊培训;. {8 J( h9 [" B& [9 d
0 { _ e% m/ E, z
7)、设备也相对便宜。 C6 J8 \7 ?# l% V( f; N' m6 ~ W
4 e5 S, \* e; e4 h 因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
. U Q% V3 W# a K* b% K6 m6 _
4 i5 Y6 H- S, ~" R 由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。, C- c3 W* l6 @3 x, L: A' O
/ A, h5 ]' { R* Q# A; W; G9 \
图四:常见的二维码
' Z# q; Z* f" x, w
: ]% x7 z% F3 p 6.免责声明与注意事项1 u6 ?4 s: c1 @' Q
7 p- z/ F8 E* Q% M8 Y
版权所有,翻版必究。
$ f7 j2 p2 } C z
9 Z; S+ \$ V% Z% ` 技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。9 E, L7 n* G. f6 c& Y" o
% [% Y8 j' I# W) _1 F. J- W 任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 * W) A2 Z# D6 P; s
! T$ r$ d/ _, c9 }5 h 7.' l O% T; u3 H; I- D* l
参考文献
; w0 q% K3 a4 T* `
( u' t9 a I0 v) M; q/ w# D( q [1]条形码—百度百科http://baike.baidu.com/view/13740.htm [2010-09-25]
6 Y! H) D( s8 q) o
) k, P- a# ^- x [2]二维码—百度百科http://baike.baidu.com/view/132241.htm [2010-09-25]3 O1 y& S& A( |8 A* Q
( s- D# g7 g6 p1 \" h 8.
" X$ a# G3 W% ^+ x( y, m; b 附录
8 [: c @ I) {3 ~
& s* A. A+ p# s) K% ] 相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):( O* P0 {4 M1 b9 t, T
& @6 z) n( q' Z5 G6 L2 L8 A %barcode.m
! ?+ F G8 q. o; Y
8 l/ k0 N8 ?( X %生成学号a对应的条形码
* ]) @: Q( R' p+ E+ t
; p+ I+ H5 w6 ]1 Z5 s %2011/09/25 13:24 BY小谷同学; {7 s4 m) a0 k( r4 R- Z: N
1 J. y+ L! [ p
a='1234567890123';%学号,自行更改
/ J! Q2 R8 a: d" {# u - ~" D1 T" ]+ w
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;
0 f0 P4 {9 R d; x5 g ! n- i0 J% ^5 n+ ^( 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];%数字编码# z" r! T1 m, C( i \/ ], ~; H% w8 h9 i
. {; z6 F, L. r2 ` White_num=[0,1,0,0,1];%插入符的编码. s* L: }9 c6 }7 Q, T# Y
& q' R% [! c& q/ {& C, _ %Black_SE='00110';
$ S! C; A: J# t4 G1 q! X! b* M
5 K( J. T- k* d+ h %White_SE='10001';White_M='01001';2 k3 `' ?2 S$ v" \6 ~
& B4 _8 [3 v, i0 p6 e
barheight=30;%定义条形码的高度# v! W: I% p( P7 T& {
/ Z9 a% T8 J1 E9 [, A barwidth=1;%定义条形码的像素宽度
" b2 z% W* }( m# f0 H5 Q- X 1 s: V0 [" c) I- s
) Q9 ]" Z" R9 V8 |9 X1 | %可以对特定长度的输入进行控制,本文规定长度为13
6 s% d$ ]% k# @& Q6 N
: {$ E1 z& e) f% X if length(a)~=13- u( m2 Z0 a+ |6 r: h
9 a$ y( d% ?- g* U" J* b
9 E8 r3 o' ~+ F9 k7 ^ error('图书证必须有13个数字');, W, C9 {& b8 P) P; {. c; P
" z: v$ B% p/ A end
. t Y {0 V$ u; O4 z) y
/ h ^6 _" y- o9 x
1 i+ A. H1 S6 D G4 p/ w h/ c. X barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];& Z: I0 y7 f" I0 ~' ?" A5 y- [
8 v# P/ j) o2 B1 v b) e: @* o %为方便,直接人工得出起始与终止部分的条形码
( E4 }9 n' G+ r3 ~4 b, D9 [7 Z1 g
2 H) ~* F6 D, A: o" u* s %也可以由程序生成.$ D9 D2 C: K1 Y" b
" }+ H1 F3 A3 S0 u+ @0 \
total=length(a)*(7+7);
; G( b9 a/ h" Q' l
' j3 W" Y* k/ N8 H6 F %条形码的总像素宽4 g% Z }& D: \$ ^3 S2 V. K1 D
2 Q7 @2 b2 {3 F+ |: g; C %也可以不用求,因MATLAB提供的均是动态数组
- t |% R- n* R- c5 P # d: J$ S9 b$ g9 k! s% C, n/ m& C
s=1;%计数,记录- `, \6 @& M0 ~4 W
" R1 F6 F" U y+ v b- L
0 a, E6 X, e% u9 N* q %由于利用for语句容易出现不可预料的错误; [9 a7 ^6 K5 ?$ K* p3 U
1 n. ]9 @3 _) s4 z' H
%大部分是数组的行标与列标的调用问题,于是采用while循环0 ?3 y9 ?( Y4 j' H4 _0 C
`; O- A' @9 _' l& {% h/ t3 Q %嵌套循环,得出数据部分% _& W5 Q. l+ V8 |, G0 g% N' O
+ V' k. f: G* Q- i* ^" d
m=1;- v7 j) u- k9 N6 t
3 {' }* Y6 Z8 W q# | l
while m<14 # {- x& D" k0 z3 ^7 w6 L
; ~' W+ S2 u) P# i. H! a+ ^. x ^
" K5 x9 o/ W; ^9 E8 b( J" d1 B if a(m)=='0';! b& c; s5 W& I6 N9 d
/ c, L V6 v! M) g9 ^
# X# x; G& G' { L2 Y) T {2 t t=10;
/ u" S6 G1 {& B" a( L 5 Y) Y2 s( w B4 K
3 t4 ^2 G0 P8 r7 t6 q4 @3 h* M %若为数字零,应该调用的下标是10
& d" U( \ X& ?4 y/ d; N& a , E8 l" k+ ^( K
$ x# ]9 P% V9 f2 M& U1 u else
$ |9 ^* B0 }; h3 G' h5 a 2 d2 }( G8 H; U/ u, t: w4 @. K
; d8 ?9 y; a/ X" b7 F& `1 d t=double(a(m)-48);
( X% o/ b) k* `: D- g" h
% c+ g ^* Y8 o9 `% y' p %由于输入是ascii字符,转换为整数需要减去30H,即48
( T0 A, s" i% p- q4 L( L( I 0 }# o6 g! F& L
- w# N5 A9 |* T9 }' z5 d! c& @
end
) D$ n8 h L( a; I/ h, f0 I) n 0 F* ]$ B7 h2 |! O5 h
0 I4 k% z/ L% x' S$ p n=1;%同样的while循环; n- e! x* G& M; m/ \
, K C5 t6 \7 M
& V9 R7 }3 w! G a4 h& J5 N7 h' c while n<6, z3 D& o3 g9 o# f0 U$ I) a: D* m
1 X" a# S( b+ T9 p1 I0 g: @3 Z
: j6 D+ x- t5 {4 d5 E9 E
if Black_num(t,n)==0' s3 Z8 c6 {0 D) R6 \
% P J. @4 [0 R) h6 K
p8 d# X; g3 M9 v# K& [. `1 J barcode_M(s)=0;! C8 r; S, ?9 |( G4 D+ U
D }/ J; S: f/ _, F, I
% n# F. |% e" v2 x2 ~
s=s+1;
1 j% u% C' d& _
; f& e& x' S6 I* _: r# r/ B + z8 F, P. t, C' e& {+ j
else8 p! I+ B# f5 Z
. Z5 }1 h$ p6 p b) Y . g9 V: a# K- `9 }. e* H) U+ Z
barcode_M([s,s+1])=[0,0];
y" I0 S1 g5 c6 C! v1 Z 0 |: m- G9 w7 D9 J( E
+ ^( ^ p0 l N/ ?
s=s+2;
" f! V6 G1 h1 t2 n6 N4 V6 G
@, g7 L1 m0 F& S' L: H j" r ; C" a; W. O. D
end6 Q* i# Y3 {7 }. g. c0 K5 a
0 C% H% p5 V# m 3 O1 P8 y6 I5 a; X8 R. D
if White_num(n)==0, F: f% m# e( d" V& a$ r
, h6 B8 j5 }8 j+ t" a 6 n2 v0 F6 W( a& c+ ]( J+ D
barcode_M(s)=1;7 l- \+ t W1 L% ?/ M# {5 C
9 r8 t0 s8 P# z, m
7 S' O: P$ J n3 | Y4 S1 Z s=s+1;4 R3 x" w$ p6 B6 ~( w
( z% W. R+ V ]. R/ H B% p
* C% J5 W) S& y ~ else
7 _- n/ @$ p9 I; |4 S( z
4 U% x5 T/ V* c& q
) M5 i, }. F3 Q! R barcode_M([s,s+1])=[1,1];6 m b1 M- g& j
% ?% c& [. G. X. o K0 \; v9 E8 J D) J
s=s+2;
& @$ S3 @5 T( E
& P- K* ?; W8 \0 K$ q5 [5 k
$ v$ z1 x& G% [$ c2 ~9 h7 l) n$ s end) P3 L# F% ]5 [' a3 s1 `' D; @4 x
4 m! S. H7 c. P: |4 M; S
[0 b) v, \4 ]+ Z' M7 ` n=n+1;2 u% f9 ]: }: a+ m% Z( Y
' n/ F9 ]0 _8 M- V" n" o, ` 8 H7 n5 E I" `% i+ X- h+ W
end
9 _$ W6 [ U' ~( b- s: @# g% S0 T0 C* [
% a$ n2 H! l G m=m+1;
# C& f: b: ?; d5 f 5 s7 E1 k0 \, K8 O% _
end; J' ^. t7 c" q# l$ z3 K* o
# w9 I, E. N3 F1 S# u }8 X3 \' i& I: S
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
0 W# d- s8 q- G+ [0 w7 W' Z7 ]$ ]- ^# e 0 `. b& y+ j+ |) o
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
9 {( W) J4 r7 N$ ~ v& R( [% t 0 a0 s5 G$ R) N% F! ^
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
# h( O# j7 X5 L3 }8 P
' h6 I% o5 \! `' D) C2 c imshow(bcode)%显示所得到得条形码& y4 n- a! d- Q: `
2 M3 K! N8 B+ x0 p %然后可以自行存贮得到的条形码# ?. [3 D$ G, g% n4 N X8 T3 U
+ x7 R5 F u8 P- p% r& @4 u6 X
%然后用PS等工具得出具有自己特色图书证啦; K6 L5 F/ J8 f- C* `
0 F( V* \4 {+ b* r- e3 K* W- |. D
; w- V. }7 g3 d& A# p
zan