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