ORC小节
0赞回来之后虽然一直被很多邮件打断思路,什么在spartan3E,uClinux如何移植啊,snort如何移植啊,lwip如何实现 socket api的模式啊,还有问Xilinx的老版本软件如何下载,Emac的license如何申请(关于这个问题以及其他Xilinx IP核的申请。大家可以去看我以前的一篇日记,里面讲的很详细),这个错误如何解决啊等等,问题真是无所不有。呵呵。还好有Joshua Lu和Ricky Su帮忙,差不多都解决了。我觉得我有空应该整理一下的。。
不过这些都不是我主要的工作,,我主要的工 作还是以下这个,数字识别的项目。
在大概一周之前从Joseph那里转接了这个项目,期间自己又去了解了一些RMB的防伪的特征,发现很多 奇特的东西。
先在MATLAB上实现了一个简单的基于模板的识别的程序(其实是从网上下载,然后做了非常简单的修改之后得到 的>_< )另外再感叹一句,MATLAB真是强大。
以下是这个代码的详细解析,大家也可以去我的OpenHW项目Digital Vision on FPGA的更新中下载pdf版本。
imagen=imread('scanner.bmp');
%把图片 读进来
%*-*-*消除噪声*-*-*-*
if length(size(imagen))==3 %RGB image
imagen=rgb2gray(imagen);
end
imagen = medfilt2(imagen);
[f c]=size(imagen);
imagen (1,1)=255;
imagen (f,1)=255;
imagen (1,c)=255;
imagen (f,c)=255;
[fl re]=lines(re); imgn=~fl; imshow(fl); pause(1)
有数字的那一行读出来。
比如本来整张图效果如下。

经过这个lines函数之后 出来的效果如下:

L= bwlabel(imgn);
% The elements of L are integer values greater than or equal to 0. The
% pixels labeled 0 are the background. The pixels labeled 1 make up one
% object, the pixels labeled 2 make up a second object, and so on.
或者说这只是标号,一行数字中,把第一个数字的字体部分象素用1标记,第二个数字的字体部分用象素2标记,以此类推。
mx=max(max(L));
通 过这个简单的算式就可以得到这一行中具体有多少个数字了。
BW = edge(double(imgn),'sobel');
[imx,imy]=size(BW);
再把轮廓画出来,那么接下来就是通过模板比较法比较出最后的数字了。
for n=1:mx
[r,c] = find(L==n);
rc = [r c];
[sx sy]=size(rc);
n1=zeros(imx,imy);
for i=1:sx
x1=rc(i,1);
y1=rc(i,2);
n1(x1,y1)=255;
end
%*-*-*-*-*-END Calculating connected components*-*-*-*-*
n1=~n1;
n1=~clip(n1);
img_r=same_dim(n1);%Transf. to size 42 X 24
%*-*Uncomment line below to see letters one by one*-*-*-*
% imshow(img_r);pause(1)
%*-*-*-*-*-*-*-*
letter=read_letter(img_r);%img to text
word=[word letter];
end
这是模板比较的整个代码,
[r,c] = find(L==n);
%FIND Find indices of nonzero elements.
% I = FIND(X) returns the linear indices corresponding to
% the nonzero entries of the array X
找出第n个数字的图像所占的所有的点的坐标。
rc = [r c];
变成坐标。
[sx sy]=size(rc);
n1=zeros(imx,imy);
for i=1:sx
x1=rc(i,1);
y1=rc(i,2);
n1(x1,y1)=255;
end
先创建一个空的,这一行的所有的数据的一个数组,值均为0
然后将第一个数字 所占的所有的点都负值为255
n1=~n1;
n1=~clip(n1);
img_r=same_dim(n1);%Transf. to size 42 X 24
imshow(img_r);pause(1)
先把所有的数字图像的大小都归一到42*42的大小,这 样有利于比较。
如果我们把现在这个数字读出来,我们会发现是这样的。

接下来就是比较了。
letter=read_letter(img_r);
通 过这个函数,我们从刚刚的图像的数字就可以变成char的数字。
这个函数其实内部只是做了一个相关性的比较。36个模板各个比较一次,然后找出相 关性最大的那个,就认为是那个字母或者数字。
read_letter()函数的具体实现如下:
%%%%%%%%%%%%%%%%%
comp=[];
load templates
for n=1:36
sem=corr2(templates{1,n},imagn);
comp=[comp sem];
end
vd=find(comp==max(comp));
if vd==1
letter='A';
elseif vd==2
letter='B';
elseif vd==3
letter='C';
elseif vd==4
letter='D';
…………
