- 在线时间
- 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系列之——某校图书证条形码制作3 J. j4 {6 v( a1 `' n4 u: _' A$ [
6 c) z2 U, ]9 u- z" ~. g5 ~
小谷同学 2011/9/25
" z' ~ y( Y8 q/ Q1 e# {
! X$ D( O' _$ L. ~3 W摘要6 W. k! V. d2 g% [8 h
& O% x- P: b- o# Y关键词: 条形码
' ?% O8 d" i& A2 ^7 p6 j- C9 J% x$ g! c0 h, e$ {
由于印刷质量问题和长期的使用,某些同学的读书证可能会产生读卡不灵敏现象。为了便于解决这些问题,本文给出某校图书证上条形码的编码规则,并给出由这些规则生成条形码的过程。最后本文对条形码在日常应用中可能出现的问题进行了分析,并提出相应的解决方案。
( L" Y* M& g6 L; u3 ^5 {+ D( F E+ Y. Z
目录
' {) _2 n+ J, Q% i$ p7 q5 @2 o4 q, Q, i. C9 ^' S+ m. V
1.某校图书证编码规则0 f5 @( i" A/ I5 q9 G! m; @) j
$ f7 C8 x6 {6 p: r+ T5 n$ b2.条形码制作的过程
% K3 h/ e0 R# c: l* m4 O: h3 n- p1 o% c$ q r! r# {3 d/ o I; [
3.打印与测试
6 r. g* X3 `+ v7 ] _: z9 ~. s& w5 d7 H4 Y
4.扩展应用
! S. k# o1 z1 s1 V" C, K+ h: O/ @% P/ F W. P; k
5.关于本例的一些思考9 e" Y, |/ _6 ~, h8 T$ g- d! C: ]
6 E3 y) m1 R. I4 K3 }. P) |
6.免责声明与使用注意事项& F6 F3 z5 X2 D6 Z" B
6 s# Q( n7 P$ \8 }7.参考文献+ D [& |" U; R4 o: d) N9 k
1 K# T, X' l: D; I9 G3 V1 l& e4 g8.附录
/ u. Q) C5 F0 Q* F1 L# K- t7 P* {
9 o3 G J) s) m& S. s% S, ?
9 Z, P: q, B) [$ D9 N: p
/ i% Q# y, @/ j( a8 P; D条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。有关条形码的更多资料参见文[1]。# J0 W) u- J- T9 o9 C2 N7 g& i
5 R4 y3 u( M, f4 ]% D4 f
在日常生活中,我们不可避免地要接触大量的条形码,其中最常见的就是图书证了。而某些同学的图书证经常丢失。此外,某些同学的图书证由于缺乏保护,会频繁出现录入不灵敏现象。于是在谴责图书证的印刷质量之余,动手DIY一张图书证,自己进行质量控制,则可以使其更加灵敏地识别,大大减少进入图书馆的时间,大大缩短借书时刷卡的时间,提高学习和工作效率。图书证中携带关键信息的就是条形码,于是DIY的重点也是如何得到对应的条形码。, q* }; M5 J; @% E" g2 S
$ G8 R' d2 a0 k3 `' ?8 _
1.某校图书证编码规则! N( g7 Q/ q6 \. G8 H% R/ C( B
3 ^6 m' [3 e0 \" L: ]$ L由于所使用的编码方式不同,在了解常用编码规则(参见Internet)的基础上,必须通过对特定图书证的观察才可得出其特殊的编码规则。本文通过,对一种常见的图书证的观察,得出其编码规则如下:
: [+ @# [9 R7 B& P) q
( v* H2 a: l0 C8 s7 i! g( H①该条形码部分由两种不同宽度的黑白条组成,是一种类code39编码方式;我们假设宽条代表1,窄条代表0;并假设在最后多一个白色宽条,以便使黑白条码的个数相等,方便程序处理。
# K" j+ Q, m4 d% p" V8 @; I
1 V; J4 j& D4 n②图书证的白色条码都是一样的,分为以下三部分: ]7 N' ]0 U* {$ Y4 b
, E- z- G. p0 v k( ?8 O
1)起始部分:10001;2)数据部分:13个01001;3)终止部分:10001,与起始码一致。* W* h$ X, k$ g4 E( r- o, r8 I6 o
# D# E2 \0 |8 z: V5 |( u
③图书证的黑色条码是携带学号信息的关键,分为以下三部分:0 p H: T$ L* P" t. o8 [
* L& S0 {$ S( a b; E) ]5 ^% H
1)起始部分:00110;
* u7 P$ I9 p7 I5 E: A: T
4 d5 |- K7 b4 z& O& \0 P; @( P n2)中间部分:13个数字(即学号12位+图书证序号),每个数字对应的代码如表一所示; $ o. m& e4 ^. {% b& U- t5 Y
8 ^; ]+ \, r# G! G0 N1 C表一 某校图书证号每个数字对应的代码
/ s/ C5 a5 Q5 _* Y" r& l* a- r9 |' q1 f1 u- f5 }* ^% o
数字 代码 代码数字来源 数字 代码 代码数字来源
, I: V, D' _, e |* b1 10001 1:0001 6 01100 6:0110 ( W" c3 m3 A0 g" j( d" I; }
2 01001 2:0010 7 00011 8:1000 . J+ M) G+ l8 S% P) s
3 11000 3:0011 8 10010 9:1001
0 p$ E* B" m2 e% ]/ s2 I/ F4 00101 4:0100 9 01010 10:1010
% [0 y) f' G1 E2 n5 10100 5:0101 0 00110 12:1100
" O) I2 C& }* |* m1 d0 k4 N9 l Q7 D3 }/ |2 j( K& [3 N8 k0 X& c
说明:每个数字由五个黑条组成,两宽三窄;代码前四位是数字的8421码的倒序,由于最多只能出现两个宽条,于是一次选取最多只出现两个1的8421码作为序号的代码;代码的最后一位用以校验,凑齐“两宽三窄”。
( W I6 b( z$ e2 a( g5 K
4 e7 a8 j- ~# E3 Y' k# E2 Z3)终止部分:00110,与起始部分以及数字0的代码都一致。: Y, E1 r' P) n. f2 {8 x' N6 u
% O2 y( S. u8 E5 G3 l
2.条形码的制作过程* ~5 ` Y v# O' L
% ]3 R6 P/ h& ^* P1 A
黑色和白色可以用二值图像来表示,于是我们的关键是如何得到与条形码对应的二维矩阵。$ P6 c& e4 v6 `, F6 @! v7 Y% x1 h
! c/ i* G# W: ~3 `4 X$ o定义窄条即代码0的像素宽度为w,宽条即代码1的像素宽度为2w(一般取w=1即可);定义二维矩阵在黑色像素点处值是0,在白色像素点处值是1。此立即上得出与学号对应的条形码的二值图像的矩阵。/ s. X6 l& s5 l9 P# L8 k& Y
7 d4 C4 N% |# s; v5 b" \
条形码效果如图所示(程序代码见附件所示)。
1 C4 H) i* U5 F# R b+ D: {" p
7 L1 Q$ K0 F `9 c, s3 |图一 所得条形码效果图
2 x& {) J6 @: S s: D+ i/ ?# J5 o# R; d9 r/ Y2 D: e/ Q
3.打印与测试6 \" Q: m$ _2 ?. S5 [
( c" ^6 O" n1 f, u2 b+ r8 @
有的制造商在批量打印图书证时不太用心,加上可能设备老旧,所以难免会使某些同学的图书证出现杂纹等印刷质量问题。5 Q2 [3 c" c, s- n7 w
& d2 T$ C3 q; T# `, ?因此,在DIY的过程中,尽量采用分辨率较高的打印机。对于分辨率较低的打印机,通过修改程序,扩大条形码的宽度,也可打印出质量上乘的条形码(本文测试时采用HP Color LaserJet 2820彩色激光一体机)。0 N \4 |* _, @
) m/ X5 ]# ] a6 O, d5 K) m为了方便进行测试,本文打印出不同大小的条形码。
( m2 \6 C- _2 h0 |3 j% }% T! V) W2 X0 W. z
测试一:将其用透明胶带粘在硬纸板上。9 {, A8 v, x: w- f
' G: g4 t T" b. q$ V
结果令人遗憾,读卡机根本不识别。通过与图书证比较发现:
h" `# E3 u B
2 ^3 k% l2 \8 t4 r+ [图书证正面的塑胶反射能力很弱,在灯光下几乎看不到灯在其上的虚像;而透明胶带的反射能力很强,可以地清楚灯地虚像。
! U$ W7 {+ w3 J0 @( D' G1 z( V
! k% k2 n* M- O测试二:找到原因后进行,将与原图书证同样的大小的条形码用胶水贴在硬纸片上,结果顺利该校图书馆通过门禁。We are in now!!
8 G) j# |" y3 ^
; Q9 ~/ F. P* N$ L效果如图二所示。, y5 t* q) @. f
. [ a: G1 u2 {2 X! c: h3 \7 L. _图二 打印效果图7 \8 w7 G, q" d# U- ^$ y5 H- j
测试三:用打印出的不同大小的条形码逐一进行测试,只有在一定的大小范围才可以通过测试。这说明了,条形码扫描器(注:本文使用的是全角度扫描器,其通过光学系统产生多条扫描线)是有一定的大小识别范围的。/ [) N! u, l- s8 v5 x
% }, S) j- t, [; X, @% x4.扩展应用" y$ E( t- y3 I+ f; b
. n$ ~; t' J- T- ~, A1 @8 {
为了达到逼真的效果,我们做出了图书证模板(MATLAB版),该模板根据用户提供的证号、系部和姓名、照片、字体等信息,自动生成可供彩色打印的图书证如图三。' \ B1 X; a" G% C* Q- L/ V, Y7 d
' ]/ P0 y! f" b图三 可供彩色打印的图书证0 H( P, a: h( `5 P5 D& u
$ Y! F% i! c* }0 |$ F过后,我们会给出相应的网页版、C++版、VB版等等。
- z; K* q% r+ _# P
8 V3 U6 J, l$ ^& M( ~5.关于本例的一些思考; ^2 r, ]: u) ^% h
' A# f; {& ?2 A/ ~/ S
由相关文献,可知条码技术具有以下优点:
" _0 ^( L& b8 C& _3 w% u. \1 {# n- _1 N F1 X
1)、输入速度快; |9 a+ Y* [6 P2 C8 m8 k
% A8 n+ J" }; H* h 2)、可靠性高;) e/ x- g* j8 J4 U' G% @
; ]( D7 r6 |" u% @
3)、采集信息量大;2 W2 t* G* f+ @4 c% o) B) j
2 ^$ d" V& T" O 4)、灵活实用;. |6 U4 x; _+ w3 j: P
/ n8 }6 E6 ~: K {6 h& u6 `/ w# ?5 U5)、条码标签易于制作
/ V8 Z5 d M, I7 }1 H- D; @7 c/ t7 B- [
6)、识别设备操作容易,不需要特殊培训;, t# @4 Y# A- y" C* f' b
; j0 h, z# t1 d* Q3 K3 {7)、设备也相对便宜。
$ y: g! Q2 m& v+ A, F) E/ h" y; c1 Z# E+ s+ F' }# x- s' v o
因此,在平时可以自己构造的加密的编码规则,利用现成的条形码扫描器,可以很快实现特定功能的组建嵌入式的或基于PC的条形码识别系统。$ p: _6 ~8 O3 W& u1 d
0 a+ r1 o' Z9 |; y5 ?( v
由本文看,尽管一维条形码在各个领域获得了广泛的应用,但其安全性值得商榷。于是,在安全性要求较高或者要求条形码携带更多信息的领域,人们普遍采用二维码。常见的二维码如图四所示(更多资料参照文[2])。0 p/ W8 f m! k" f
: ]& J Z- X; Z7 D% p* f图四:常见的二维码8 `- ?- w+ [5 z' [7 \9 L4 ~
) A& e. ]' b- o$ i# ^$ `" s6.免责声明与注意事项" i% Y. V) E8 {( t# z& M
/ V) h3 g e; V: v4 N, k O- K
版权所有,翻版必究。
% d9 [- d0 X5 Y2 e' U0 D/ d! J! {; {* N/ c! `5 d& [
技术在于交流。本文旨在交流条形码制作技术,并为个人制作提供质量较为上乘的图书证的方法,非经相关方面授权,严禁用于商业用途。有不法分子由此牟利而产生的法律责任,与本人无关。
" X: {1 Q3 P( U9 N5 j& r# w. W! Y4 m7 f# P3 H3 t6 v
任何单位或个人认为本文可能涉嫌侵犯其合法权益,应向本文作者提出书面权利通知,并提供身份证明、权属证明及详细侵权情况证明。作者在收到相关法律文件后,将会依法尽快删除本文中违反法律的内容。
* M; F; t. h. Y1 s$ Y8 J
- ~, N$ w- N t1 d' r7.
& W' G8 t# [) R9 z: E8 \参考文献, b" f, E! D8 w6 ^1 `
( A5 Z" t; G7 A/ g% Y
[1]条形码—百度百科http://baike.baidu.com/view/13740.htm[2010-09-25]
6 e. N: _$ [/ D ?$ w' @8 o5 ~ }# R- e$ G3 K, }4 W$ T
[2]二维码—百度百科http://baike.baidu.com/view/132241.htm[2010-09-25]
6 Z4 b1 \" x' p2 E/ p# Y
4 j( W, i( |) [ [8.+ \ X3 x2 C' t. A
附录
1 o; O/ y( q0 V2 r4 F' `. z
) }" L/ S. E; x相应的MATLAB程序代码如下(该程序经过简单修改,可以写成函数的形式,更方便地进行各种编码规则的条形码的生成):
1 L9 }! K$ H5 }. b( r
9 }& s, b1 T& Q& w%barcode.m
: ?9 l4 n, H# I" i" O; X. L" w4 x5 S7 J n+ j0 L0 w' }$ C; K
%生成学号a对应的条形码
, p; J/ l0 D8 G7 u8 T% R( H
0 E8 L# l2 Q8 {0 x i# Q* |8 |" X%2011/09/25 13:24 BY小谷同学
6 D: {; r6 H" U/ {! H; d( C4 D" |/ G- \2 z% B) _) F' X
a='1234567890123';%学号,自行更改0 S' f8 ?% w2 v# e3 u# O; G
% L7 |- I' P6 T% A$ YBlack_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 F: `- e: ^! H0 ^$ P
% O& ]: `. j, f u( E4 x% h' I& [! @" D0,1,1,0,0;0,0,0,1,1;1,0,0,1,0;0,1,0,1,0;0,0,1,1,0];%数字编码0 {' U8 y& h5 U/ `/ m) o/ J
9 d m# F' Z9 @( |& WWhite_num=[0,1,0,0,1];%插入符的编码
7 p5 P- ?, A! z( a, [
2 M. [9 P+ _: {/ e" R%Black_SE='00110';; Y- Y/ ~. ^4 B6 D" O- \% O
" i6 d& H/ K# c9 {- _
%White_SE='10001';White_M='01001';+ W# F7 J: ~/ t- { r
; [' L1 M2 @. p! G( ibarheight=30;%定义条形码的高度; K1 M; b. B# O) t" e/ l8 V" v
) {- r O6 K. q2 G, M+ k! I5 W9 ~. ebarwidth=1;%定义条形码的像素宽度8 L; A7 B$ F) a# G' g
0 I1 @0 r k" R' a2 U1 P3 q, }7 b, [/ F; |) m5 N+ S
%可以对特定长度的输入进行控制,本文规定长度为13
7 N: ?+ F: m/ Y7 Y; ?7 t$ G- e+ w; D
if length(a)~=13+ M9 x3 C7 j. y3 _' w" {
: ~3 W/ |2 b0 o* {; Z, v/ A
$ H, u# y3 t0 A/ Werror('图书证必须有13个数字');, k+ h5 |+ F) J
# b: K: { H; L; Y; w8 X* nend
9 B3 o. m+ u6 u/ J, p! w. v) y
" b9 l! O3 v; r( R8 q H1 r( v" S7 A: {% D
barcode_SE=[0,1,1,0,1,0,0,1,0,0,1,0,1,1];
9 M; _" K! l2 H& q3 c6 ~8 Z6 ^7 b4 z2 Z: o. j
%为方便,直接人工得出起始与终止部分的条形码
6 e8 H6 m" W& W( q0 n
# O* q, U3 G8 M5 x& ~' \ p' a%也可以由程序生成.$ }% w- t; k$ \% C/ e: u' n
% S9 K/ _5 P" u6 e$ ^ n
total=length(a)*(7+7);# D1 q% c; V( t2 Q- H& [# \
3 B5 x w, e. p- L6 Z2 L. ~
%条形码的总像素宽& @- o1 e# r9 C7 z
1 c3 j: v" e5 o$ ~
%也可以不用求,因MATLAB提供的均是动态数组
7 e# k" L& C5 S/ w- U1 B
- x3 A2 b5 s: `8 Ms=1;%计数,记录. f; B6 Z B" X+ X+ G9 ^
! m, i" Y: Z6 y, r& [( O
8 p9 }7 Y4 |5 F+ }7 G- b%由于利用for语句容易出现不可预料的错误
; X( S9 ~: A/ h2 k: p+ F/ c
( I( q, t) m* z8 I%大部分是数组的行标与列标的调用问题,于是采用while循环: b/ J) c m7 O) L
7 {. R& \6 u* B
%嵌套循环,得出数据部分: W' @; P3 C8 g' L a( ?; z
N7 h/ R% ^# l% i8 bm=1;! _/ W0 l' g v8 ^2 v9 P" i
) h K# r2 U/ W" ? Q7 | o/ Pwhile m<14
& h7 ?2 M1 w+ A1 U( J$ a
8 d3 i7 R% B$ h4 R6 F9 j* O" c0 a/ w
X _- m7 B* Xif a(m)=='0';
- I3 l8 T$ k2 L6 \6 `6 G8 Y& x8 Q5 B G: Z* l7 m
6 E9 H+ P2 `" u/ q q3 R" q: `t=10;
+ d: u3 g8 k, T+ J8 K
; l1 N) B0 O" b: M# Z$ _& M
1 W) w+ [0 z7 U! `%若为数字零,应该调用的下标是10! m' w+ e' A: |" h, i3 C/ T
$ o; ~8 @: M& c
1 t) d5 l; D- G6 K" u- W6 r) selse
9 _* \8 u2 g }4 }) U# o+ a- b: ?( n" Q, U# _! _: f: y. q& E
# @& w6 y2 \" h& U: w5 t# P$ N3 g
t=double(a(m)-48);
' u+ I' I: N$ `' D4 _4 ]* `" ^: Q# C9 g) t9 c
%由于输入是ascii字符,转换为整数需要减去30H,即48
8 s2 A3 O: s3 h0 L
1 c( m) a, d3 L4 @/ T% n2 Y
: w( d8 Q6 d! V6 d! u* [4 u- Cend
! P0 ?3 A/ U% \5 k3 J+ k% A6 e5 V4 l. ^+ g
D3 e5 r1 Q2 I3 r5 @
n=1;%同样的while循环
* a" ^( G( \6 N9 }0 K. B
8 \, v2 G" P, X% t5 f) b8 k" I5 u- A* I/ W( C( A& F
while n<6; T, _2 ?3 \% X' @* e; L
% W# d" Q- @; D o
5 f8 E0 a3 i- ]6 P. sif Black_num(t,n)==0
6 k; \5 L, x4 A! j* {
6 e" F' B( w2 F( V- G
. K- j. P+ _; O8 ]4 f8 W7 p' G# i3 zbarcode_M(s)=0;
8 O( N0 e' }0 |! ]* p" f
' L$ V9 m5 T9 _
( k; y5 _# H( k2 p2 J) l' Cs=s+1;
P8 n0 v' z. ^( B8 o y
) F. W* V3 P( ^- M% q4 }* D) j! u
else
) c. u! k2 ~) \+ L `6 O+ r, P9 s. N' \" s; x# D4 R
/ d* U, k: J1 q1 R/ I( Lbarcode_M([s,s+1])=[0,0];
8 K) ~1 O( b8 L3 K1 j1 P, d! q
; K, N. s1 i4 I! A" v
( }! W; U6 [5 u; a0 c6 Cs=s+2;; t. C/ ?0 r3 Q$ |0 M n2 o
- h( } D+ S0 I1 l7 I; ~' \; z0 Y& W3 g1 P/ E B6 X8 i2 i7 G% x
end
, K$ j" C( N _( {4 H0 B4 f$ N$ t! Y+ p2 {0 e8 J' M
3 x" e9 k6 f6 \if White_num(n)==03 ~9 k- ?$ v7 r5 G) S
5 n( C' m6 z7 r1 ` g. H8 ]# x; Q. T8 Q
barcode_M(s)=1;8 C" r: P0 Z0 X& A% J9 [$ a
1 R5 i+ E& b6 ^/ v0 \0 l) N
+ W) o2 W/ T* ]
s=s+1;* }+ @- o/ A4 ^& p5 N; ]
$ I. h7 D7 {7 m \
; O' d! H4 }1 _else2 j3 b) X# R& e# J, T$ f6 S
- _4 \: f3 A' a9 ?
2 i; ], s7 t+ `% D$ Y5 R
barcode_M([s,s+1])=[1,1];
c1 M- ^ m7 o X# d( A
; d! |5 Y8 O; g3 a2 W; h$ r% v% A% J* {3 X- B
s=s+2;: t) D; k7 G) A
2 |: S$ I7 w' Q( [- w
* B5 V# B, b0 x( P% H. Gend+ O7 m: ^. e2 g) J
* c( F0 V/ ^# r/ t( A
6 m! S+ b M2 E) K# ?0 ~& {$ I" ?% fn=n+1;
7 p6 e2 l9 e& r4 y, @4 n
4 o. \8 N! a q; U8 @. w, i3 r/ w. U7 ~( } |
end
. d4 ^" y( D0 j5 R- ]' a: j
0 D" I' R* o! Om=m+1;
2 M) f7 j. u9 l9 o
7 Q; [& E; {* u2 F( d4 dend# E! ?& q/ g. t6 Y6 O+ _
; ^5 [9 c* Q4 p2 Z1 @$ K' h M& `4 E! I% r2 y; U1 Q! Z
bcode=ones(barheight,1)*[barcode_SE,barcode_M,barcode_SE];- n" @7 E$ h9 K, t" p
& [1 J8 S& W/ z" S( ]9 O%将一位矩阵拉宽,生成给定高度的条形码对应的二值图像的矩阵+ Y4 r$ e9 L( A- l, M+ J5 j. ^
" u% ^0 A" h# E5 E( \6 q2 ubcode=bcode==1;%将数组转换为逻辑数组(Logic Array)7 Y0 e$ F& I# |4 W; Q, `' ~
( H7 C. U; H+ z, Kimshow(bcode)%显示所得到得条形码
5 Z. i# q: [- ^. t# Q+ o1 U, ?
, X, ]1 U) N2 D* u5 w: L8 x5 z%然后可以自行存贮得到的条形码
; b9 c- K t9 D8 ^& G: c6 a
; ~$ M. F* d- s. q2 G. _%然后用PS等工具得出具有自己特色图书证啦) x) V8 O* k7 ]& a1 T
3 h" X% V% t! B' L! {( C2 v
0 J. W* ]' c+ B7 `1 m4 U7 L |
zan
|