实验图片:手写数字图片
实验软件:opencv1.0 、vc++6.0
之前做到了环境配置和数米粒实验。
对opencv有了简单的了解,对像素的处理也有了一定的基础
由于电脑注册表直接爆炸,重新安装了系统,所以导致之前做好的数字识别运行不了,所以环境配置也很重要。环境配置链接如下
http://blog.csdn.net/qq_32300341/article/details/70186379
今天我们来做一个比较简单的数字识别。
第一步是导入图片。
我对图片导入的方法是建立一个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 < imag