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