推广 热搜: LabVIEW  控制  自动化  电子  自动  软件  sci  机器视觉  编程  视觉 

opencv实战之手写数字识别

   日期:2018-08-22     浏览:57    评论:0    
核心提示:今天我们来做一个比较简单的数字识别。第一步是导入图片。我对图片导入的方法是建立一个char类型的二维数组每一行存放一个图片的
 今天我们来做一个比较简单的数字识别。

第一步是导入图片。

我对图片导入的方法是建立一个char类型的二维数组每一行存放一个图片的地址。

获得了地址,也就是获得了图片。

第二步是划分样本。

我利用采用的是二路交叉验证的方法,所有的数据一半作为训练样本,

另一半作为测试样本。具体划分是第一次测试前一半图片作为测试样本,后一半作为训练样本。

第三步将没副训练样本图片划分16份

opencv中提供了将图片切割的函数,但是对初学者我建议自己写函数,这样对像素的理解比较深刻。

通过遍历图像数据,统计没个小块的黑色像素与小块整体像素个数的比,将这16块个比值存储到一个数组中。

在这个过程中有一个问题,就是划分成16块之后的数据有很多空白块,这些空白块并没有什么作用,

反而会引起误差,我就想把原始图像切割一下变成一个小的数字占比大的图像。我也就这样去做了。

切割图片代码如下:

void clear(IplImage *image,IplImage *&backImg)//去除多余的空白
{
uchar *data= (uchar *)image->imageData;
int  wp = image->widthStep;
int i,j;
int h1=-1,h2=-1,w1=-1,w2=-1;
for( i = 0; i < image->height; i++)//从上至下查找第一个黑色像素的y坐标
{
for(j = 0; j < image->width; j++)
{
f(data[i * wp +  j]==0)
{
h1=i;
break;
}
}
if(h1!=-1)
break;
}
for( i = image->height-1; i >0; i--)//从下至上查找最后一个黑色像素的y坐标
{
for(j = 0; j < image->width; j++)
{
if(data[i * wp +  j]==0)
{
h2=i;
break;
}
}
if(h2!=-1)
break;
} 
for(j = 0; j < image->width; j++)//从左至右查找第一个黑色像素坐标
{
for( i = 0; i < image->height; i++)
{
if(data[i * wp +  j]==0)
{
w1=j;
break;
}
}
if(w1!=-1)
break;
}
for(j = image->width-1; j >0; j--)//从走至左查找最后一个像素坐标
{
for( i = 0; i < image->height; i++)
{
if(data[i * wp +  j]==0)
{
w2=j;
break;
}
}
if(w2!=-1)
break;
}
int length;
if((h2-h1)>(w2-w1))//切割后的图片作为一个正方形,和其他图片的比值就一致
length=h2-h1;
else
length=w2-w1;
backImg=cvCreateImage(cvSize(length,length),8,1);//返回图
uchar *data2= (uchar *)image->imageData;
uchar *data1= (uchar *)backImg->imageData;
int wp1=backImg->widthStep;
for( i = h1; i < h1+length; i++)//将当前图片中数字部分复制到返回图上,即切割后的图片
{
for(j = w1; j < w1+length; j++)
{
data1[(i-h1)*wp1+(j-w1)]=data2[i * wp +  j];
}
}
}

事实证明,切割后的准确率比不切割的准确率高。

第四步统计训练样本黑色像素占比,导入测试样本进行识别。

在获得了训练样本的黑色像素比例后。有两种方法进行识别。一种是利用最近邻分类法,不对数据进行处理直接拿测试样本得到的16个比值

与训练样本中所有个体的16个比值进行比较,与差异最小的那个图片分为同一类。另一种就是将训练样本中每个数字的16个比值取平均,

这样每个数字都只有有一个黑色像素比例的数组。然后导入测试样本,与每个数字的黑色像素进行比较,与差异小的分为同一类。

这样就识别出了数字,我利用的是切割后的图片,以及求黑色像素平均值的方法进行识别。识别率在95%左右。

 

 

工程下载网页如下:

http://download.csdn.net/detail/qq_32300341/9884089

 

 

 

 

 

 

 
打赏
 
更多>同类编程
0相关评论

推荐图文
推荐编程
点击排行

网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报