- 在线时间
- 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系列之——某校图书证条形码制作
0 C! ?( @7 r9 \2 z6 w$ N/ O% X4 i6 T1 _
小谷同学 2011/9/25+ F( s1 C% K* T) Q" d
8 `* L' T) \' ^7 ?: P
摘要
5 U o/ ~( o3 C" A' z* O% b2 ^) M; ?% n. [! L
关键词: 条形码
0 I2 A# P1 W$ M% v2 n- A4 Z" B( |
$ D+ s0 D! J `/ v由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
4 ?2 ?& D# @9 V u6 ?; b! r4 ]1 ?7 g' T0 p; I$ C8 Y3 P
目录
! ^3 B9 K8 z; U4 k; j$ V, ]: \2 i2 ^8 d! V1 h( \" F4 H
1.某校图书证编码规则 @- v" J z, ] {. P) {6 [) U4 a
7 W. o1 z. Y( N* g2.条形码制作的过程4 o! `* D' ~9 I7 R" ~
3 n7 l0 B% P9 _! [3.打印与测试
% F* P. x1 @# ` }! q" @
! n; e5 N: ]3 f, H) Z) L4.扩展应用; o5 z6 ~% }0 R- E
8 U; }) E% Z/ _2 o5 V3 C2 N# i: g5.关于本例的一些思考
8 ?$ Q# r+ u& m5 x$ C
2 x( K, ~/ B A" d; H$ U9 }, p4 `6.免责声明与使用注意事项" i. @6 r" \8 y+ z
" D6 S* W- I3 ]+ H+ `5 P( {7.参考文献
* f3 r1 C2 M. E* \, Z, b' {# e" V& V( v) Y3 \' h& g
8.附录
, B0 @+ x t$ F# E8 z- N9 s. z/ v4 t
' p/ N% p) y5 s, J/ \
# X9 u O$ X# _ e3 C9 ^) j9 b; X! j' w, d! H
条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。
0 o6 q1 z7 p5 ^: L* s/ _% G
$ \ ^6 `- y% K ^& o4 r. B在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。) J( X3 T7 o. w4 I: c9 _' c
( S) {$ B- H9 q n1.某校图书证编码规则
m- }- X% Y$ i' {+ Y
7 U+ A3 ]' V# U' i- y/ R由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:+ n$ Z# j) E& u k* c( X5 m
! h! R; v0 K! K: m) v: L" }
①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。. e: \$ H' R5 V
7 b* K& j3 _; D) X$ D②图书证的白色条码都是一样的,分为以下三部分:& G$ u$ D7 ^; a- ]) F$ R5 l
# ]6 p4 J7 {! ^. Y$ [% h
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。
4 P/ p$ Q0 }5 U- |2 l+ q
) d) G9 j* q2 m4 r0 \. H& x③图书证的黑色条码是携带学号信息的关键,分为以下三部分:8 f5 A _' m# }! v8 C& h' M
' a8 U7 v9 r+ Z+ a1)起始部分:00110;5 N- s" Q; R7 K
$ f4 A7 F" m) q1 k/ x% E/ h
2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; . J, |( A1 F) T- I3 b2 _' n
' p% W8 r+ M( U2 i) Z4 e
表一 某校图书证号每个数字对应的代码
8 Q. R4 l5 j% d# |- S/ B
) i: q6 q1 T1 b+ g数字 代码 代码数字来源 数字 代码 代码数字来源 5 K+ P3 U. V) L* S
1 10001 1:0001 6 01100 6:0110
+ r; _& G' i& Z+ p' ?* z R0 M2 01001 2:0010 7 00011 8:1000 6 r6 d9 P2 l! j# n
3 11000 3:0011 8 10010 9:1001 * H6 Z4 e3 Q( ?
4 00101 4:0100 9 01010 10:1010
+ g) V( \& M: G4 X/ g5 10100 5:0101 0 00110 12:1100
% M' @! S9 a4 b9 E' E( }% m: l, p: u6 O7 ~8 i& H
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
$ z1 i. J, m" ~. L9 Y# `$ E
7 O: s& p! l, B1 O, u3)终止部分:00110,与起始部分以及数字0的代码都一致。
# Y; q4 ~) ]% x F1 R; N7 y
: N' `* @, T" F& ~4 A6 K) f q" ^ G2.条形码的制作过程' i# I; E, ?& A N' ~6 U4 h1 {( [
0 U* b1 I- `6 n* B/ d# U" Q黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。
& c3 g" K5 C4 {$ y3 T! x5 Z# y: b) g0 x! G; t* U5 j
定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。
% v$ C1 `3 [) z ?0 Z2 t' n' }4 N5 }1 d% `) Z1 R# f/ z
条形码效果如图所示(程序代码见附件所示)。
- q0 x, S) R6 A
) C" y" w6 f" I5 _/ R2 N8 m7 i* ^图一 所得条形码效果图* _4 N% g9 f+ l- i8 y/ T H
5 t! }! s7 l' M
3.打印与测试
: e x B7 }5 Y/ R- `# j
1 \6 r: Q: K! y9 X/ S, e% A有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。4 `% I# R; k/ y1 x& g/ I' O' p' p
' J+ K _" S# Y" l
因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。
1 k* G( n+ I. }0 \2 S. Q3 a- X1 ^* { U. U
为了方便进行测试,本文打印出不同大小的条形码。$ @7 [5 Q- |" M
/ g# N& |& M( P" G
测试一:将其用透明胶带粘在硬纸板上。0 Y( [) l2 P0 k/ r% W6 H" `) t+ d6 P
) r3 E3 `7 |% a; q2 T/ f
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:( I" |' o* }( _! W& Z5 P
9 i8 {$ Z# A4 F7 L* y- |
图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。# h4 [4 }, g/ X5 s
3 G9 l' R- F2 N i7 Z
测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
) c* c' g9 i* j( u: u5 t
; D1 W7 V% W/ `% e效果如图二所示。
- E0 C5 a/ L: U$ b0 b$ g
7 O% P* R$ W# E+ V1 {% @% p+ J
图二 打印效果图
. E# ~9 I8 s6 `# Y: r; Y/ z, L. A测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。
6 A7 |' z0 ~( w% u: Z
3 \% k! l1 M3 D# G4.扩展应用- `' R. g% N1 `# f+ r% R& `
Z5 F3 K+ u( K8 l3 L8 E
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。
( M" s" m) _& M& m# E6 I, Q$ ^
d1 o9 r5 Y6 `
图三 可供彩色打印的图书证
; `- y& `# p1 M& I; @! Q" ^ l- n" d
过后,我们会给出相应的网页版、C++版、VB版等等。
* l! K2 N3 J! g2 [
6 O: U5 L# [' ?$ K" Y5.关于本例的一些思考
$ G( |- v6 m4 o1 E6 ~: g7 c; d4 i x2 T
由相关文献,可知条码技术具有以下优点:+ w! U3 p% r) o) S/ w# t
J" |# P3 ]3 U. s
1)、输入速度快; 3 M* K. u( j/ Y; C
1 A% X) B9 U" t, U 2)、可靠性高; ?6 U: e; p* @ V$ ^9 @
: Q; G8 K( k7 a. \
3)、采集信息量大;$ K4 o: V2 E& f' m1 o
+ P8 A9 D7 H5 p4 `9 h! ]2 w# D' q
4)、灵活实用;
! v5 I" C& |& @7 `. I7 A4 l# n; D1 t0 B* J3 q: W: R
5)、条码标签易于制作
0 d, p. ]1 G/ j ?; `
! E5 W; s2 m& R! M1 e0 j& i+ L6)、识别设备操作容易,不需要特殊培训;0 I4 ~) Q: _0 a& _* J O
% _; E9 Y' U4 d$ c+ _( w
7)、设备也相对便宜。% E" K {7 P$ l
3 _, x V; c$ m( T! } A( K" E
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。& C P& @( j0 T# d( H: l
2 z( ~( k" l' z& k" B( U J- ^由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。
1 X1 t! t$ h7 D8 I: n
4 }5 W7 v0 T# _7 x
图四:常见的二维码
1 w' R' y* P7 `5 t6 h1 }# D4 \! Q
6.免责声明与注意事项1 e( P% \% O. e/ P* g( T
8 U* e: g- s' L# N t9 W( S版权所有,翻版必究。
) K- ~5 n3 _. u& y4 B; f- F8 \
& f9 x% f8 q% z" {技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
+ g' M' ~! H7 Z( L" h) j# A8 y& P: Z! X% y0 D1 K) z9 u7 c
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。 2 m. O3 | ]6 e% x
6 [, n( {( H6 _: _6 l6 f
7.
+ [, u" A( o; b$ x参考文献, M+ i6 F! g% `8 h# M( d3 Z; b
7 H* G G. Q; s: O
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
2 l/ v' d. C, w: [2 j3 X- U- d t9 L' Z9 m4 b9 F
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]' I7 y8 K9 U0 U# G" C) [
5 W1 {; a* ~; q( K* @4 ~8.; Q1 j" B9 Q) t8 ]( H7 E; l
附录
9 d. B- P6 }7 t- z. C- |$ T% \7 c2 O2 _% v/ I a7 S* a! J$ i
相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):$ m. u# c- g( l
$ Z3 c9 K" U6 y; z2 Z
%barcode.m, f2 N( O# K. _4 S9 T6 `$ Q
" ~& F/ `" g" N; E5 ^%生成学号a对应的条形码8 r2 [5 n2 f" [4 d; @
/ b9 s; T2 f4 a0 x%2011/09/25 13:24 BY小谷同学5 g/ x7 c4 p9 i
+ R y7 l- s. p8 y: b. n& q: Ia='1234567890123';%学号,自行更改; f+ X, y8 C6 J @! z
$ A n* ~# }6 v
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 W$ p) [4 P9 Y) x. |
! i- X( {3 f, L8 T$ {; f
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];%数字编码% z2 X. Y1 S3 g1 q* g1 s- O! I( `5 L- b
+ S* f3 F7 l( G4 vWhite_num=[0,1,0,0,1];%插入符的编码2 M; B& G! d/ @( `5 |; h" p6 U
+ ?8 F- {' b5 c/ {6 p# R! O! ?%Black_SE='00110';; P6 `9 W4 d( G0 d
5 p9 {2 V G' u0 D; v* B4 s
%White_SE='10001';White_M='01001';
5 e, }4 F1 T7 G) C! m. q
- k H+ J, o6 M+ [: `barheight=30;%定义条形码的高度+ l3 I9 Q8 j; j% _2 B
0 U7 ^0 M- b* l) W9 Sbarwidth=1;%定义条形码的像素宽度 H" |# t( T" `7 O0 i
: h: P" D6 s4 l1 a6 p) b
/ Z' C% U) ~' m, T! d% q
%可以对特定长度的输入进行控制,本文规定长度为13
o6 b& @0 C' z0 f4 B: ~
3 M9 k) X3 F3 @if length(a)~=13/ d& O* R; K1 L$ |7 g( A3 u7 @$ d( ?
4 ^2 I% k0 M, P; @! n* @
/ f! C! f+ f6 w' Serror('图书证必须有13个数字');& C" {2 l/ m5 n4 K% I
4 y6 F5 T% w) }* ?end
3 q1 O& V# ` O& c/ }/ E' h2 H8 j& x! E: v# r4 E
b- b/ s% l$ f* j' U6 v
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];0 ^+ k- T k6 X, J6 @( f
- J; n5 x; Y( V, K" _: ~, T
%为方便,直接人工得出起始与终止部分的条形码
) P: t: W, }5 M: r$ R& S
2 T; n' U6 v7 Y! `' i1 }) J%也可以由程序生成.; M: H6 y4 F- H; @9 Y
. L$ T2 h' v2 B/ e9 f. C) g7 utotal=length(a)*(7+7);
2 C8 _0 t3 V( d4 ~
% u7 N0 o4 E" X0 X4 G) f' k%条形码的总像素宽
4 p# q; J6 w D9 x) |& v$ t1 _4 Q0 R5 u# m" }: z9 x
%也可以不用求,因MATLAB提供的均是动态数组( }. i- L! w; G- b* [ l. `) K0 V
* Z1 M" U3 \7 b# }
s=1;%计数,记录
; u5 Y! j& B b$ k& b9 o( c1 {( d) e+ I) l8 Y# i& m
7 x9 v$ J9 x& K: K4 o6 A* b%由于利用for语句容易出现不可预料的错误4 Q0 x" A, r3 ?
* b! z" H" f m' S%大部分是数组的行标与列标的调用问题,于是采用while循环
) F5 A1 y5 o8 e; x/ L. y" {% p' P/ R7 y* N3 O% e3 J
%嵌套循环,得出数据部分
2 _0 |: b! g$ h9 d: |
4 {7 }* C" }4 w, Zm=1;* d+ P. S* q3 K' I
$ x* X" h2 J" H- P
while m<14 9 Y8 `6 K C9 w
# X, M# \( J, Z* {, F4 V
0 N* E" \3 z: V4 _% ^/ G# [8 P( f8 I
if a(m)=='0';* Z, h! {# ?3 G
' ?8 R! a5 i& ^$ J: C: L" J2 c! X; U: ~) ^! R
t=10;
; D* `: [, j _ h8 g( f& _7 `, e% [1 y& i& H2 J: c
# {+ _0 i, j% i3 W; g%若为数字零,应该调用的下标是10' e" v0 V- q: g' V& O
1 |9 x1 Z- }, o1 ?+ P1 e
- _' P1 \9 }1 }5 F8 Velse
5 n: P. O. Q8 P u* c3 o$ J2 e
$ x. p- }- G# Z2 @! @. y; V& W) m$ d' ]7 T
t=double(a(m)-48);
) M) |: Q- H) R+ j$ H
6 s) e1 _, t' c$ ^3 ]%由于输入是ascii字符,转换为整数需要减去30H,即48
9 B, f- m, c+ \8 x0 M" Q/ \! w; G2 u6 ?
/ _. P( f7 M# a! I, Vend4 T3 A5 u7 A$ p
4 C* c- X! b" a0 K/ o ]; d8 E- M( S% K7 p
n=1;%同样的while循环
! U& e! Z: k; @. |3 d9 }' c6 U" L u/ q/ P4 ^
# Q- f% v+ }2 ?1 P
while n<63 l! G2 {- W; m- F1 G$ h3 c
7 z" w) t* J2 K8 \
" l3 A2 X* Y: b7 [if Black_num(t,n)==01 L9 u# _) @+ Z! ]8 d0 k2 d
) D* [4 }5 H0 O3 `& l, ?$ M7 q5 F
4 J+ v4 r& |7 F( I: rbarcode_M(s)=0;* r$ |; I1 R1 L; P& Y
5 b; W0 F1 |. S. [4 _- V% G
3 }1 {+ J, F, N6 Z0 bs=s+1;
! I% |) P6 h7 b9 ^' ~7 J
, S9 W% p+ o+ }% d' p
* b3 y" P0 J, Gelse
& |% w9 v) p( `, H0 N$ ?+ ]$ z# {# A: w \+ F
/ v8 W, B- X8 N8 Abarcode_M([s,s+1])=[0,0];
& r4 I" c5 l+ v t
2 s# c S: r! ? @: f' S6 k' Q
! G/ D$ k3 _( R- s% x( f% Os=s+2;, T& H, S. @* O8 E }
6 U5 |( E% I( \6 ~+ M% s
" A# i& i8 x4 ^7 M8 b; Send
) D: V8 Y. |( v K9 L/ J
; B( K! _3 A& q/ N
% O8 {9 u3 w8 r- y) }. Q. zif White_num(n)==0
' u; W$ J, ?+ h- D3 j7 e* W7 T
- U+ {$ u1 o1 y S5 C
barcode_M(s)=1;5 W6 B2 @) w; }3 ]& ~' d+ T
! X0 \* j! b6 L/ B2 o
4 X7 h! A5 I9 A' I9 m
s=s+1;
, R X+ e% ?. `$ w) [& Z2 `: g2 F3 {6 z7 S! _" P
1 e$ O9 d& U; Z
else
9 B# M/ m( s' |) A
- y! B- q; T) H3 V9 `: X
6 n, m. Q" e5 _: [; |barcode_M([s,s+1])=[1,1];8 r2 n3 L' O& X0 r6 b! ]
/ G" T% X+ ^2 s3 n& d+ Y" s% F
) e, t x' |- n. |5 o' _/ S" ?
s=s+2;
$ m( a2 ? n) i, c# {5 `# X0 W5 E' l# T# ?
8 Q+ [1 m: K' E2 o5 M6 ?0 ?end3 ?* m' B' K: l" n+ [& X
! P# V" h7 c8 C! l g
# o) o6 ~ d' Rn=n+1;5 q8 R2 S# _+ V
, {" O/ ?7 ?1 |# }. b3 Y$ ?5 A) q) b1 ?& R n/ Z/ I
end5 {5 o9 k- r- K5 h' _ P
: f. Y8 M0 g' Lm=m+1;8 T) |+ v' j, b6 I; k7 y. e5 X4 M
4 e# |1 J8 x0 \$ {; P. iend; _9 k6 J: p) P8 {7 [* g; B- G
8 c6 s C& a/ o
) H. Y) `) E# ~2 Y, {; ?bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];
( Y* M* m6 J& U6 G y+ k0 ?: q) m1 W: |! }
%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵2 U# `/ ?+ X( f) A& h: x6 q
: a$ [, D. s. U
bcode=bcode==1;%将数组转换为逻辑数组(Logic Array)
5 A+ C6 g$ i+ Q( a5 B
2 H8 b/ r- B. Q- l) n4 |imshow(bcode)%显示所得到得条形码2 a/ u) n0 g* H$ z
* T" R& ` W, ^) ]6 U1 E
%然后可以自行存贮得到的条形码
$ n. M( q3 w, O" D) X: j2 ] `3 g: ~* p
%然后用PS等工具得出具有自己特色图书证啦
4 n. k' {* u; l4 [0 @3 h {0 d0 e: d
* {8 {- _" c2 D. @ X. ` |
zan
|