- 在线时间
- 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系列之——某校图书证条形码制作! m: S) n# R2 q6 v% z# n7 Z% V
/ Q+ _0 F, [; K( K8 f6 X9 t' \5 _
小谷同学 2011/9/25
+ }3 L! `9 \6 |1 d! H
9 M( P! y7 t1 _/ H J4 M: v5 ?3 i摘要
) t3 C9 O: T* _1 R+ I9 c1 A Q& g6 {) C
关键词: 条形码3 y8 u& B4 u8 l g: ~2 F/ f3 w* P* n
. C( {; E/ _9 ~8 G由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
& O. f$ a; {% o; D" U* a& v! T7 s1 T: T9 y
目录
( d1 Z% d. f' m4 h/ M7 o- B/ I- \' w$ C0 B" m/ B$ Z+ u1 p
1.某校图书证编码规则& B- z$ [( R0 A* K" W1 c
+ |& h) T) y4 b% ?* H& b5 R
2.条形码制作的过程5 W. I( J2 N8 q, | H
% H. g( b3 z, b) V# w) e5 A
3.打印与测试
! c5 f$ M5 V- z, Y( Y0 S. R4 S) U
4.扩展应用! N, `, m4 F) `0 V
. R# \- t" _, t2 b
5.关于本例的一些思考
& c2 \( c' j% t2 z2 t. V9 Q7 m# d" R$ r% `% c+ S, @
6.免责声明与使用注意事项
, _7 H3 i0 i& @" \ q* ?9 P+ V
% j4 F! [, r5 \# M7.参考文献& Y: X6 l# k6 U, ], x3 a/ @
; V/ i% U; c% ^" j4 z
8.附录
6 E: e: u6 L" D) C! g
6 w9 D# w! j8 P; S* c/ V0 {, v6 {4 _! d" a, F( P X1 u
2 G! N. D% q2 r$ X" K1 r7 ?. e/ r3 K5 D/ \
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。( \4 m% w2 Y1 _# m1 l! o/ ?
% b+ O0 x0 \! i, ^在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。- S7 X6 Z5 F$ ^1 w
# O4 K+ v0 }: G D s) n1.某校图书证编码规则
4 n# [8 z7 v. G3 U; p% P9 H: t% X w" M: K8 _( l
由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
3 n, i! k+ [0 n6 g. E) g& l/ s8 h+ ]3 N) |
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
; k& A& E: X$ x! V6 \0 I1 T5 R5 G( u$ [
②图书证的白色条码都是一样的,分为以下三部分:
8 N1 q3 A0 L7 D& \
' n% w8 `$ ]/ f& X2 `, C4 K+ ^: f& T1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。& {* y& E: w% Y1 Z/ V% b# {4 Y
- a% ^# A1 i3 L& x' {③图书证的黑色条码是携带学号信息的关键,分为以下三部分:
: o8 o3 ^' V! r: ]
! |, s- V7 n" z1)起始部分:00110;
3 B- q( ~% A4 o. p! N
9 h: L4 H1 W$ @' K1 f+ T- ]) m' R+ s2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; 3 f& K& j8 P( }0 o8 a
7 r! q' C" O. q- l
表一 某校图书证号每个数字对应的代码
Q0 S3 b1 {3 |; m: B1 {0 E* t+ d6 x7 e! r
数字 代码 代码数字来源 数字 代码 代码数字来源 $ M6 M9 o$ X) j
1 10001 1:0001 6 01100 6:0110 % Y* y7 v; m w5 P# c3 B
2 01001 2:0010 7 00011 8:1000 " U9 J: n/ j# h& G* S
3 11000 3:0011 8 10010 9:1001 5 Q$ ?( v) Q. t* h: Z/ t* n
4 00101 4:0100 9 01010 10:1010
0 p* j7 C5 X5 a4 D8 y0 {5 10100 5:0101 0 00110 12:1100 * w0 P' B m: |
% {: Q% H8 ?8 e* h9 k8 {" K说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。' W4 i4 r- g3 ]6 o) z N Z
4 |6 G3 K/ I! ^; x* r G' P
3)终止部分:00110,与起始部分以及数字0的代码都一致。
- `) u( k1 t/ o' \( N: {' m
/ I6 w# @& w5 d, e! P( e2.条形码的制作过程3 q5 }* \" V" }3 _9 x" \( y/ A
7 `. \+ P* K' T黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。& f- K7 Z: b- c$ q4 z ?
! s4 @8 C, Z* a* [% i' B3 E" A
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。4 |! j# ^; A T$ d' h
$ N* j7 A" z3 U$ \2 _4 R7 @条形码效果如图所示(程序代码见附件所示)。* ^) t; F; k" ^9 q1 [5 E
6 i9 q; ?: D" e
图一 所得条形码效果图
! t! D6 h3 U9 \! R2 t) j
$ W7 P: M3 e8 U5 O7 m3 j/ j3.打印与测试* l0 ?& d# c$ Q! `3 j0 q( \( o
* H1 J# m9 u3 k5 U
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。
! g- B" v# Y. c) _5 }6 _
9 ~% i, {( \& h+ X) W/ u% R因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。3 t( W: j) e+ h2 H
0 I. l; K. O+ ?5 t: ]$ u为了方便进行测试,本文打印出不同大小的条形码。9 L9 Z5 e. g& p7 A
% Q8 _3 N$ p; a! K) p
测试一:将其用透明胶带粘在硬纸板上。
3 h/ d! T# _5 p9 ^. i
, b2 J0 C7 Z1 w4 t9 ^结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:: A6 X/ Q. D, p7 \. B( }
4 q8 G: r5 J( B0 i; }# Q图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
+ V, M2 \0 |; q }# U7 v
* p6 n2 B: T: b9 L& x" l7 n' p+ \测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
' G; I- B4 ]# i6 J c1 w: {2 Q7 v& r x4 z. r. v0 P5 m
效果如图二所示。
6 X' Y' O9 M) V% L0 Q! I# p5 L
# q8 U) N3 ?9 i* c3 \
图二 打印效果图 N8 w* P; Z d6 B+ b
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。0 T; o/ Z/ f" _/ q
) Z! E B2 p6 V7 X9 L( g' d5 t4.扩展应用
" K7 {; p: L3 U5 Z6 j( L! p A3 H) G
0 i0 O# o9 f( O" H4 q9 ^& t2 f为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。5 ?8 r; @' {- U, C' {# `$ P) u" d
2 o; X( x( g' C }- b. W
图三 可供彩色打印的图书证
5 x$ G: V3 c3 f1 g1 J7 t- ~7 d
# W+ J* c0 V3 T4 |% L' e过后,我们会给出相应的网页版、C++版、VB版等等。8 R; V* z7 H) A. I' w: Z
, T; `' h3 \, s/ x) g) {5.关于本例的一些思考) q8 W7 p! M& R: R
2 d+ s9 V- x5 r$ F
由相关文献,可知条码技术具有以下优点:7 e0 p) Q' T6 ~5 [3 U! C& O
6 l% I$ E R p. x. r
1)、输入速度快;
( D' y+ s6 z; W+ T; Z# U, A; j/ h! ~( t' p" J. }
2)、可靠性高;3 o' ^* r T2 D- y# c, b
& {/ O( H% `' `* Q+ I# e; E4 u3 e 3)、采集信息量大;
, b$ b% R1 j3 ]2 {$ w0 I5 }
, P8 {2 U* a# Q" m) A3 M+ N 4)、灵活实用;6 G t7 p6 E# N7 C! i4 j2 d
' k" @' w* T& G% T3 T+ H5)、条码标签易于制作# Q6 b+ F* k) d# M
+ F, i5 }* [3 I8 \% R# C9 @
6)、识别设备操作容易,不需要特殊培训;& g/ w/ O1 j2 L( _* A. ~2 R c
7 d2 p* F0 \- G7 q V v b D7)、设备也相对便宜。
}& r' G5 h, Q8 ^. D; I4 h+ F2 ]/ M# n# B8 @% X, y" [
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。
& j$ c* s( ~& S2 B
4 E8 _5 Q- r. B9 I' ^$ k由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
) u7 q7 F) S. d9 ^0 g+ E4 r. K# t
) F) q8 @1 l! I4 Z# r' K O. t
图四:常见的二维码
+ y% B6 Z/ B1 e% H _0 l# h) \( | E0 L
6.免责声明与注意事项
$ e, p, x1 j3 n" ~( y0 }; m
1 e* l! }! k. `2 q, r版权所有,翻版必究。5 j/ E5 I9 A* c; M
4 \: O8 i2 h& K4 q- l0 P' B: a
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
2 H5 [2 G4 ?8 V% ~
u' S0 H. E& Y6 i. Q/ Z: N任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
! R" N& p& n/ m7 A! \
2 c6 y9 \5 B: ~5 t$ f+ i% f% }7.
( y6 E5 `7 C9 f8 `( i参考文献+ @- t( J8 m9 f" e+ Y/ M9 k
, K* t$ j& [( ^4 j, S6 R[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]. a' @1 j8 g0 d5 e- ?% l o
. D' S0 o: L: u! u) y' a! x* k; A[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
; d7 q# b- p, i& P
. L% F9 z8 c7 A& S* ^8.
: v, y9 k# m. S4 T1 ^# W7 J( ~附录
f, |& |5 O4 m; l9 ?! n- [$ e# f; t9 A1 ?
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):+ J" K) p. Q V p ?9 N& g4 v
! C% T* R/ ?7 _, e8 b%barcode.m
6 x+ u6 O# X& Z% u) o& |/ Y) t
# s0 j+ T1 Y3 {. T7 e' {2 i%生成学号a对应的条形码+ e2 ?! Z/ o" K" ?7 t* l
, w9 B5 t& g2 \0 c5 B: Y [%2011/09/25 13:24 BY小谷同学
1 f/ c! R& ~' e0 ]4 \* S, Y; s8 Z6 ?! X, k2 T
a='1234567890123';%学号,自行更改
1 \; C- {5 O5 W) a5 Y! |1 R- v2 b4 y6 I0 H5 j2 D! 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;
$ [3 r& ?+ H5 n5 ^7 M
# E# i6 H6 t9 {4 E" { P1 @# w0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码
1 U% F: r2 \- ]4 L" S" X$ T- S2 d2 T: H/ ~1 W
White_num=[0,1,0,0,1];%插入符的编码! v* Z% A) s R7 z* J( @% z) L
' h- f; A% e2 r1 y: i
%Black_SE='00110';
) F/ @7 v- H$ }( F3 M6 |
2 W/ P _' i9 X v! H$ W%White_SE='10001';White_M='01001';6 `8 u5 c& n* B0 ?3 ]- Y
8 V7 p/ D, Q! ?7 S9 Gbarheight=30;%定义条形码的高度! X8 C) K% h% B' ?9 Z, h) E' R! X
' s$ p! c4 K3 x; A0 B* n* p
barwidth=1;%定义条形码的像素宽度. K* z. d4 ^# L: F$ b7 `8 O7 v
0 h' u& D0 O2 I4 P w. R5 u3 U" K6 i, b* F
%可以对特定长度的输入进行控制,本文规定长度为13
( [( ~1 ^6 E) f
& x: b4 w& [: x& f. X- P0 ^if length(a)~=13; ^0 d2 d0 T o5 Z4 P' L
* R' R# O9 g* r( S- p' @. }% G
5 ^* x* A4 C$ Y) Lerror('图书证必须有13个数字');; V! b* o2 g8 d+ o
+ L$ b+ g* \; i" O5 r5 i
end' u6 y0 m1 M" Z
# V' U$ r- J1 J5 z. S: n0 [
% J8 @( z% a6 G* ^5 E7 Xbarcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
3 Z6 _6 k- Q) {' u* e8 l1 p$ g6 p' H1 c& N& _0 e
%为方便,直接人工得出起始与终止部分的条形码% V1 e, V* ?- F( j9 D
" x' F" t {6 H0 N& q* T
%也可以由程序生成., ]) I, H& m1 n2 U
, Z) n& ?/ w+ W5 Q: U
total=length(a)*(7+7);
& {% s0 I4 f5 v! i( N6 {2 H3 Z& \* X" t8 b L, j
%条形码的总像素宽
( k6 ?- ~- V K8 ~; [4 S5 p B+ a+ u: d6 T8 A! J" \
%也可以不用求,因MATLAB提供的均是动态数组+ a6 w) j0 R( a- I) V
7 u. P) Q6 ?4 S) B" G2 l
s=1;%计数,记录
0 p. S1 D/ m9 }* a& F
& w% h: u3 }& `6 q5 Q' e! N! {3 z; T, R7 P
%由于利用for语句容易出现不可预料的错误
: e- d# s5 P! g& ?! ^ Y
* Z" K q9 E+ H& y%大部分是数组的行标与列标的调用问题,于是采用while循环
1 D, A, b4 B+ i4 t( g% E- e- h$ w2 P5 f- N- Y+ B
%嵌套循环,得出数据部分
+ O* {5 K( c/ k
: Z/ |0 V& z" E& Z4 Mm=1;9 }. p1 ]; H7 T( n& P
4 O9 ~6 \& Y/ Y3 Rwhile m<14
) G0 T8 t; _# S7 s& M, m% d
" [8 ]% X* r+ M( m, e: }% M$ y1 l' Q
) a% y* o. M0 Qif a(m)=='0';
$ o& J, L/ p. B$ V) N; p5 |
, x# n5 G. @ n t# V. G2 f
8 \) G' R2 q( Gt=10;; O4 \8 R2 Z7 d$ K0 W* h9 E
/ |/ k z. I# Q1 S& x: M1 \
' P8 ?8 ^- m0 J+ ~6 D: m* V2 S%若为数字零,应该调用的下标是10
$ b1 p; ~ V( ` }( q
) T) h, B7 Q" \- _/ R% E H3 x3 j- q# t9 Y
else
5 i" E1 y" A3 Z6 |* q' W$ n. T( O. N* I
7 A1 z: T5 {# g6 M3 x0 St=double(a(m)-48);
8 }) w& a! T% n; Y2 T" h; e6 ^/ g) `" z2 [* S% z U
%由于输入是ascii字符,转换为整数需要减去30H,即48. J/ h% I& |- V# {% @
2 Q! m+ B D# G/ G' y
) h/ H9 b3 D# z3 F+ G3 T. A
end
: o8 L& q- d8 m+ X) @) i6 ~
) o0 d9 Q: j6 p6 i9 H- r
; A3 G9 M; p2 E- J# bn=1;%同样的while循环2 ]( `8 o8 Q9 S: R
( O. K; L+ q8 S9 ` s8 Z
2 {) z" I" `: j; V A4 z
while n<6. E, c7 f! g/ d* v% |& q5 F4 p
" o3 {. p- K8 }6 F- d3 j, F2 F7 l
if Black_num(t,n)==0
- b6 x" X" R) Q4 F* e5 X9 A0 u1 }5 i6 b9 {7 O) S& }7 v
4 z3 v! g5 B2 s. J9 I& Z
barcode_M(s)=0;
, v7 [4 Z, H6 K8 H* n; W4 l
$ L5 D3 Q2 R" \# r1 h& Q: q, F' R- R% J
s=s+1;
1 U ^( m9 X. w k; M7 m4 g
: ?5 ^+ W1 ?) Z$ k
# D) \. \( D) m4 a- Felse
, E+ N* P# }" w% x) h8 z+ R4 O+ o }: T
4 H6 o$ s8 ?. Bbarcode_M([s,s+1])=[0,0];3 D& P7 j" ?" J2 Z; V: b6 Z/ T
# z1 |* U( l9 N
' { N* Z4 }/ S9 y+ {s=s+2;
& D% i+ D( m- D7 z) e3 w
* c3 k$ P2 I M$ J/ }; E Q; h, G& s; @0 E/ p% i; X1 O+ k3 Y
end/ G1 s. v& C3 u
" v6 p% ^" ^; c; P
: z5 f/ R7 j4 g$ l: c, r) Rif White_num(n)==0
* y4 g8 ]+ Q4 X/ F& {
# I5 E% I5 L( p6 @6 I3 t5 G7 M$ y8 @
barcode_M(s)=1;
5 f& [ l! d" ~' ~/ v! W: L% V9 j+ S( L# x) g
8 \! g/ v- ~6 s3 k a6 V% O3 D" Cs=s+1;
8 G% p) q3 y. {8 \; E
6 n# g3 n9 t) @# j7 Z5 S. h- V
& @; `' {" C- o" b$ E# Uelse ^" h( |, Y- \
1 ]+ h0 P4 d+ ~' f" C# z, y
& m) E8 a$ L2 r3 ~barcode_M([s,s+1])=[1,1];% B: u; |& o+ I' \3 y$ Y
3 O( B/ L$ S+ d" q5 E, o
' i' b. U* m Vs=s+2;6 Y- r1 z0 G6 M$ ?7 U6 G
; Y2 C' Q, m; V) h* p9 v5 J
3 W. ]3 u% V3 i: P7 F% xend: U" q) t5 K5 R
& P7 Z7 K, C0 p7 J+ U9 V, c
: A+ V2 ~" r# i' f% m
n=n+1;2 d# B/ D3 F$ X+ G7 F/ B
( z, x$ O+ v: \$ K7 k6 H, {2 u2 Q( ], V% H
end
- ?8 z; w- F8 h: V+ |6 f Q
0 _8 m/ E K- e" T1 j i% v, D; N& `m=m+1;3 S! l8 f4 \+ \7 Q0 ]
$ R! z8 ^9 |, J2 e/ ]7 ~7 pend; i( ~7 ^& V; x9 p
, W& @- L1 t& F3 p* L7 ?5 e
0 d: h+ s! ?" j7 f
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
9 ?2 h: M/ P+ _4 @1 _
6 N/ d" E2 V* S5 s' {& t. C%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵. X8 e1 R3 {- X3 A3 `- k
0 _3 g$ w, q- E) N7 f* A
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)! ]- M$ C" f) C
* d' L" f. r8 F" t
imshow(bcode)%显示所得到得条形码
+ q0 m. i9 v! ^3 j
4 J" ?* S, y# h6 G%然后可以自行存贮得到的条形码
9 I/ I) C( b" d: v1 }* r' s* V- ]- a9 W; ~3 p
%然后用PS等工具得出具有自己特色图书证啦* r0 {$ {0 F L+ d$ _! Q0 |
' I5 g+ Q; L, R- e1 V
- [1 U) ^! J, E; N3 S |
zan
|