- 在线时间
- 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系列之——某校图书证条形码制作2 ]! f& |: p! ^
8 X( K" W- |5 H3 q小谷同学 2011/9/25
# I F+ O# y3 z4 Z6 z. V& {$ f8 i* M4 T5 s4 r/ ]
摘要; @+ k1 ]' r' s3 w; U8 R& s O9 z
: k; g* g% Z( a: {$ ~7 Y6 r1 U8 P
关键词: 条形码( H( W6 ]2 P+ I3 o0 s
/ E# J' C6 {$ `/ Y" P. G! V0 D
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。- ]7 x* u5 F* @ D2 y( c3 S% d
5 i) r8 n0 B' @& x6 f
目录4 R! d3 O& y: |: G4 o
6 M6 Q% T# S; O7 b1.某校图书证编码规则
- c, ^+ z3 |( q" Y
' o, I: [7 Q( A& T# z, g2.条形码制作的过程 a! U6 v4 k) `' k" z) |2 d
+ j6 P/ r* q) J! ~
3.打印与测试( F# b! O9 O# V$ l' e& ]/ V, v
4 ^$ A$ r6 N0 u/ Y& G: S; \/ t" {
4.扩展应用
# `6 Y3 w6 }: x; W
) w: i( A' B2 h/ f ?6 q) x5 D5.关于本例的一些思考
/ I& N; x' I8 s! r- b2 j0 ^1 u5 u3 t
6.免责声明与使用注意事项
9 o& a% R) ^6 Y5 b/ E1 x$ i' R" |2 N: \: W) N
7.参考文献" l$ {; ~8 G+ t, X. i: s& c( Y
+ `* L" b6 L1 v; R: r. k, q$ g
8.附录; A4 q( r: X2 h% J* \
7 C9 c y3 E w) h$ M( d
! X2 k- G& h2 X6 q, f8 |% g
- N2 @& g: J. q- ?3 G: ~1 s
+ [4 ~9 X$ r. w& ~8 d条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
: [- `2 \& i* }+ a; M& }) k. T: B% _2 U; @) M4 f
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。
. T; {8 o/ E% j3 ]5 {. I. }2 o; Q# t6 d" q9 d7 T; m1 w' \. d
1.某校图书证编码规则9 z5 Q3 R0 C0 n5 m: |1 k/ d' Q
$ k6 q7 M* u0 z8 I3 c6 s- S由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:1 L0 {, `1 U3 Y
4 z9 p' ^9 [$ W& w①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。) l' ~' w! {( A
& U# [. L/ a3 y$ L3 C6 D; {; j. _
②图书证的白色条码都是一样的,分为以下三部分:9 U' S8 U. m9 `" O
! V3 S9 J2 f$ V T
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。* S6 E" ~- s8 _
7 N8 t: s/ ^& b( z; X7 N③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
1 l+ b0 _8 E, ~+ f
- T6 u& ~ y0 }1)起始部分:00110;" B& O9 [ K, I: n( `
- W( }7 m7 p4 e8 `" U: N2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; 7 R5 n/ a' W- [) a) ~
: r2 {/ r- e$ `, \& C表一 某校图书证号每个数字对应的代码0 D6 [1 }) v: m8 O. Q
7 o5 u+ ?: O1 P3 O8 Z0 D: w( |& S
数字 代码 代码数字来源 数字 代码 代码数字来源
+ D$ m' N, X% u5 o1 10001 1:0001 6 01100 6:0110
8 W' t! |. H1 Z4 Q2 01001 2:0010 7 00011 8:1000 l; I& I* p5 o: N0 E- H
3 11000 3:0011 8 10010 9:1001 % v8 j9 Q4 a$ }4 z4 |
4 00101 4:0100 9 01010 10:1010
( A& v! ^5 T5 P8 ?6 |5 10100 5:0101 0 00110 12:1100 / u4 o& I4 s3 [6 N4 j
! E! P- T. n( n8 I% U( b) n" ?# i
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
n( r9 A/ L2 [% r+ C- @3 F/ P& x& n5 J/ r! L7 ~" Y) h
3)终止部分:00110,与起始部分以及数字0的代码都一致。/ Q( Y8 t! V8 W; o& ?9 s2 V c
) G; x: y: X% P9 j. h# k C) Y/ o8 ~2.条形码的制作过程6 Z" }: `, U8 b% B# B
; B% \6 x& o' c E& a9 m2 z
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
8 d5 g$ V2 t! j3 S |$ u3 @: {2 A" B4 Q1 k9 _# i! o. I& j! v( f: \, D
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
: o* M* ]' v( U" g
: i0 L* ^/ \' M% J6 L条形码效果如图所示(程序代码见附件所示)。. \4 Z% D0 T4 g t6 k- Z/ H* P0 ], u
$ u% C& C! {/ X1 G& B图一 所得条形码效果图 B1 S+ ^1 W" Y; H
0 g. f8 H; V4 c2 P. a9 _& X3.打印与测试5 Y% C) J2 F6 \: t2 P. {8 p5 U( X2 @1 D
1 N# T5 O$ L e, j% L
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
( R# _& z+ {/ e
: q2 v7 |5 H7 x6 ^因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。- ]" P! H( Y& K: o8 h% u5 h
- `0 Z, a. C+ R为了方便进行测试,本文打印出不同大小的条形码。
# e. x$ v& J1 P2 i3 o+ L. s0 O
4 i* Q7 T) l/ D9 j1 x' Z测试一:将其用透明胶带粘在硬纸板上。
$ ~! { ?5 c3 Z( M8 ^' k0 _5 g& n/ y. j: k
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:7 ^+ E% k3 e/ h
4 P6 J, B" X9 Y5 ~) a5 T图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。, D( s/ \; D5 k2 L
3 a2 Y% Z/ I. f; B! D测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!% M- E# L0 L0 n0 y" |
( q- M8 O, K% m6 y3 ^! t @0 d
效果如图二所示。. ~2 u( R0 [' X' p+ X
" h* |" G6 z2 ?! j2 e' c- l5 ~
图二 打印效果图
1 o Y6 G2 x$ T. {6 I2 o测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
1 [ m; H/ f9 x2 E/ k( {
# n5 F Z" h$ d& T z4.扩展应用! H" x5 w; W T) R4 p' d! ^
]2 k+ J$ O7 n8 @. q
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。+ D& {% r) z0 o
Q. y9 h: ^; q% u! r- h! y
图三 可供彩色打印的图书证
( {2 `$ ^; \) P& i" ^% _1 K1 G2 Y# H+ K
过后,我们会给出相应的网页版、C++版、VB版等等。4 m% x8 n2 E9 N% H3 L' b% l8 \
$ \9 y: v$ k2 i" m8 [5.关于本例的一些思考
1 G) [* P$ Y% v. x* g/ d
' U' \1 u5 y( A! w3 d) R( P" x$ J. |由相关文献,可知条码技术具有以下优点:
- L! j5 _6 [2 T
6 F$ H# ]) A& @% y' E 1)、输入速度快;
# H# k1 X0 A- S# B, q- h
% c- X/ o* |) W 2)、可靠性高;8 |- k2 M+ h6 |+ C4 m
( m+ s& y2 s7 L 3)、采集信息量大;/ Z7 m ^3 a, [
) d# K- e3 F3 a. ?. X' k6 @ 4)、灵活实用;
8 h8 Y% {9 e. Z) u1 I8 n- f3 u- o& L( y4 X" y. N, X. R4 o7 j
5)、条码标签易于制作* A8 X+ ~* h% v, E! [
% n8 j" j* Y: K; s7 H9 x/ L, x
6)、识别设备操作容易,不需要特殊培训;" y, F$ U4 L1 @; x$ S% n
# r. O7 _* Y2 w7 V7)、设备也相对便宜。
! F! i7 e0 _" s) V! m2 G9 u
5 c: Z% C1 }# _7 t因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
) Q( Y' M1 ^ ? v5 R0 L* S! U$ o' ?; y
2 g+ }' U! ?5 s/ |由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。! W9 O. G6 \! G0 I1 y
0 ]2 l. {3 Q& }# s- E图四:常见的二维码5 s7 ?: g! ?; z; Z4 e
4 Y' T; l7 g/ ], [/ \
6.免责声明与注意事项. n: _$ {* {& u O: \ Y
5 J0 `0 T6 s$ k4 e版权所有,翻版必究。7 |9 E; E7 x" C. `4 G% Z' j
8 t7 {7 [* T- Q( \9 ` h技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。. n: S) v. S! n
! C4 ]: d1 I' b3 b
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
# p; z' @# K8 p5 J
" O/ y* s/ j) x; Y& D' N5 O7.9 T4 n; y$ b8 l2 {7 {
参考文献7 O3 R- K6 ~; k& J
- |% B' _7 N; W( a3 L1 R# F' r
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
' U* x- x5 ~1 i$ ]+ o2 n
0 P6 X: M9 `& P* I3 v[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
) M$ B8 O8 i+ S& U5 m5 s+ [5 b! A
8.3 Q7 P6 o" U5 _! K+ _% |
附录 _! `2 Y, d, t% `
. ^8 K- d" p6 Z6 i! @0 i. n
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):% v7 ?1 R) l2 b$ x2 h5 {1 L, P
0 o+ [" d0 K9 i- M+ S) d* k
%barcode.m1 H! f0 Y; _! h Z' u9 ^
: |! }- X: N! a5 J% C) u S%生成学号a对应的条形码
/ N6 k) C% ~! [! g# a+ N M! R) d1 E0 f. O. [7 o- L8 L
%2011/09/25 13:24 BY小谷同学
8 R$ v/ o1 w1 f) d, k: l y2 q1 g# x5 a: Q$ u8 w* k' c
a='1234567890123';%学号,自行更改. E+ K4 F ?9 W3 r1 l! q
3 z0 E$ g F8 j3 V) FBlack_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;, C6 j; N f. I: N! b$ V) t- _
. W0 F# R2 v& `6 j8 a/ q# R) g
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];%数字编码8 }3 @" V% [) \. }3 u" [3 m& K* ]
1 @; h0 n- l3 s; \White_num=[0,1,0,0,1];%插入符的编码# W8 k: U3 W" \$ b+ h
3 H( T6 O y; W: H- h%Black_SE='00110';
+ Q! Y" a) j6 X& A Y$ N* O6 x8 f: z; a1 r4 f+ C8 [8 W: e" }) u
%White_SE='10001';White_M='01001';% D5 {$ i- T$ C, t- H3 O
' G+ z4 l- F9 e) rbarheight=30;%定义条形码的高度' e a* A- i- F5 }; B
4 n& f5 D; `+ c# n' c) F- Wbarwidth=1;%定义条形码的像素宽度( ?3 q: b4 x: t* l6 ?( b
$ _" i1 P3 ]% j$ L0 q. r4 @1 B
# V) p% r6 @7 r% e5 b%可以对特定长度的输入进行控制,本文规定长度为13
! r/ C' \6 I% f: I* O/ g" b" u3 a
9 f" {+ ~' q/ u, Kif length(a)~=13 }% M& ]1 |1 y7 e* R
H5 z7 p; w# L, ]: ]. e8 o; @
0 s9 S5 ]3 j7 @7 X; Q- ]4 Jerror('图书证必须有13个数字');" N! _$ T; t! `& r1 D% B
( ^* x, D' q* V& N# P; xend, U$ ?+ V: ~5 V, R C
3 Q! ` M4 N! O5 P! V' @& m4 N7 I c7 q0 R. x
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
5 l2 y; m1 v5 t' z) P, ^9 j: R; B1 b
%为方便,直接人工得出起始与终止部分的条形码/ `) }( a+ m7 {% _8 c0 c' U
8 ` p5 B) E+ K
%也可以由程序生成.: ^6 B, {3 Y# q8 ~" N9 i1 l3 E: D
9 e3 V) W5 [6 N2 h( Rtotal=length(a)*(7+7);+ F+ t% x0 j& {8 }) {
" w3 X L& }3 f; o/ a& ~! X
%条形码的总像素宽
! `* J" J3 p" T3 {) ^0 z: g: z- ?$ h$ Z( k! ^& K: h0 y
%也可以不用求,因MATLAB提供的均是动态数组6 d' k8 R2 ?4 C( F! g K0 {
' u) e5 }; J7 D; Y4 zs=1;%计数,记录
* m# [; B/ U/ }% I( R) L
- S. s/ o1 W2 b; f0 _- H
$ A C3 I8 ~+ z6 B ~%由于利用for语句容易出现不可预料的错误: i1 [1 h% v1 b/ J- z
+ O ]9 B5 P* p' d+ j%大部分是数组的行标与列标的调用问题,于是采用while循环, z$ ~7 a: b* \" o
. W! l, n, l& W i* r' _%嵌套循环,得出数据部分
# ]! `: ?6 G' s/ G* c# Q2 s7 M% d0 ]) V! y+ Z
m=1;
9 B) p5 N$ c$ l, A8 T% }9 o5 H9 C3 I/ S+ V* \9 b. `
while m<14
: o: R8 y9 Q: a9 }" I8 W. ?: _, b+ B9 B) q8 F( k* G$ |# o5 T
8 u: q/ ^) j4 E0 U: ^8 z5 k
if a(m)=='0';
# f4 B8 Z4 V* Y$ {7 K0 W& d6 x. ?. p6 R2 o
/ r1 J/ F7 n" o' y! K) \t=10;
5 C: n) O3 t7 w. x" p3 D6 K' U5 m' ?% T% q4 o( h
* E* F( o y9 o+ x' v$ x
%若为数字零,应该调用的下标是10
+ `# g/ `/ b# o+ L' a: @
7 N" w3 u( E: q& f s
, i8 U+ I' V- @0 }else& A0 u: J6 @. F) s. X
0 r$ ?2 o# I$ {
) k4 R7 i& P. @3 B3 C. s0 [
t=double(a(m)-48);% M/ {6 g# ~ s4 F' M$ Q
: X0 H( w: D4 p1 [6 \; \: }
%由于输入是ascii字符,转换为整数需要减去30H,即48
/ _( |7 q+ l8 ~' _8 N ^7 V( x6 b
5 E# f9 |/ i7 i3 K* J
end
7 c5 [2 Z4 U+ M
6 s1 Q4 N- D7 {
, x# k& g, `/ s& bn=1;%同样的while循环) ^( }" Z2 r) {3 p9 Q
. ]1 `5 y" d, v; u% l, I. F& Y
v7 H3 T2 y' Z- \- K
while n<6
, O3 C0 l. k$ \) ~+ z8 C r+ F9 s- a& g" R' G
+ b w9 K; P; ]( [
if Black_num(t,n)==02 D; _# b. C1 t; `+ B9 V
" ?. ]4 s V+ _( @& p# R
8 A( l$ R. z( k! \barcode_M(s)=0;0 u1 A7 H1 K$ f/ }( L3 [2 H* V# b
; e, N9 x+ ~# W5 W8 i$ V6 q
) X0 {2 _+ k; d. v0 T$ f' Ps=s+1;% l$ p+ `" L0 }4 v0 h# U/ a
9 L; f5 X% p$ O5 ?% B
4 r0 j6 e+ T) l: ?! Q5 ^' _ L5 N3 V3 selse
5 E7 V! b; K& h( }+ g) Z& q
3 \* W* y V( h t3 U* i' U- y3 n' {6 p6 E, F- x8 Q( O5 u: R& A
barcode_M([s,s+1])=[0,0];
0 d# a: t- f! Y1 x
/ j# d' W0 O7 X N7 U0 U
/ e. t" Y+ q0 s0 h9 b, ^s=s+2;
! I6 X0 g& ~) h3 E$ Q0 V! x- x5 _5 B
; \% m# V6 @) b
end
, i4 j! m, S" H" ?9 s) u5 V5 Q, Q. q6 t& @" ^7 B5 j
8 j; d) ^2 Y: gif White_num(n)==0
* }0 F) Z3 u( }5 E, l: V, q- ^( X/ m5 ?# B* O" a# W7 ?5 G2 P9 | R$ V
# a0 l4 G* g6 a; U+ L6 ]5 I
barcode_M(s)=1;
/ K2 r7 n$ U! J" _$ t& x$ n0 p( B- ~6 m0 ] I
7 i$ L$ ~9 m& P, K, ys=s+1;
% |1 l9 @2 ]$ o' {- |/ ~, _
7 ^0 k# ^; N# ^3 X1 g7 N n6 M+ y' J( }: J8 x* o% [- n# ?
else
; x; H. k9 r. [+ G) ]! c; d9 b# b
# h' h/ G7 M3 I( g) e! d8 e& _; O! e
barcode_M([s,s+1])=[1,1];
* H; W8 [: s) Q5 y0 h( K
& U. n1 {" m1 d1 x3 T" I
9 s0 d) z+ z. Y4 Ws=s+2;
6 P6 m2 E y+ C' `. D
& ~6 n/ t/ \+ |& W& s( } z2 Y
* O8 C, d2 F a* L. ]) \end% g! g4 z3 k" m0 R: H9 W& @
) E. N* x. c. c% n1 H2 L. }
" w+ W( p8 U4 l% ]
n=n+1;1 l- n. S8 B# p' j+ K$ t
) r' v: Z @7 C1 I
! y# ]/ a) m9 P6 o; J9 O6 @, ^* P- ?end, w; w9 a# Q* |! d2 z. a
: l. G& i X$ U3 O$ ~m=m+1;) o1 p3 ?4 N" X3 H, j7 y6 D
4 L$ S/ Y% [& [2 zend
4 s3 _7 h' |; O' q. k+ k( x; i/ j% p! e6 _# g& L
1 x( F9 x: v; e8 ]/ r
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
6 n+ V, J- Y8 @, u: F' ~% V6 Y" ^# D y
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵
/ P* a& e/ v2 A; M& Y1 f: J5 U) r6 D' r* n. l& U: M) Z {0 E
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
d. R% |7 g# m5 Z* N& _ N
% \# n: W' ]- c* d% ^$ z5 h4 v* Simshow(bcode)%显示所得到得条形码5 t# h# J n. e
6 \! D4 }/ @0 h$ {. A$ Y( U
%然后可以自行存贮得到的条形码6 X& ~/ o0 y' Z, C1 ^: o. ?$ K4 S
5 }0 U3 T+ D6 }! w' B. Y2 S& m%然后用PS等工具得出具有自己特色图书证啦
: t7 d! v* g+ Q U$ X/ N% U3 N" Z" J- q- n/ C
& h0 L7 G' G5 v6 Z
|
zan
|