您当前的位置: 首页 >  opencv

wendy_ya

暂无认证

  • 2浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

基于C++,OpenCV3以及SVM的MNIST手写数字识别系统的设计

wendy_ya 发布时间:2021-03-09 09:53:57 ,浏览量:2

目录
    • 一、OpenCV3对MNIST数据集的解析
      • 1.1 MNIST数据集介绍
      • 1.2 小端格式和大端格式
      • 1.3 小端存储转换代码示例
      • 1.4 OpenCV3对图像数据的解析代码示例
      • 1.5 OpenCV3对标签数据的解析代码示例
    • 二、模型训练
      • 2.1 训练数据准备
      • 2.2 构建支持向量机SVM并进行训练
      • 2.3 在测试数据集上预测训练准确率
      • 2.4 运行结果
    • 三、调用训练好的模型进行手写数字识别
      • 3.1 代码示例
      • 3.2 运行结果

一、OpenCV3对MNIST数据集的解析 1.1 MNIST数据集介绍

关于MNIST数据集,我曾写过一篇文章进行了详细描述:https://blog.csdn.net/didi_ya/article/details/105075859 这里就不过多介绍了。 这里重点介绍一下小端格式和大端格式。

1.2 小端格式和大端格式

大端模式:高位字节放在内存低地址处,低位字节放在内存高地址处;最直观,因为存地址从左到右按照由低到高的顺序写出 把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去 ; 小端模式:低位字节放在内存低地址处,高位字节放在内存高地址处;Intel处理器一般为小端模式,比较符合人的思维;

看个例子: 如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为

大端模式小端模式0x00000x120xcd0x00010x230xab0x00020xab0x340x00030xcd0x12

参考链接:https://blog.csdn.net/liuweiyuxiang/article/details/78045344

需要注意的是,MNIST数据集采用小端存储的方式,因此提取需要进行一定操作。

1.3 小端存储转换代码示例

由于大端模式是把高位字节放在内存的低位处,所以,c1,c2,c3,c4依次表示的就是原来的数的高位,所以,在将c1,c2,c3,c4转化为整数后,只要依次取出整数的后8位,左移24位;次后八位,左移16位;次次后8位,左移8位;次次后8位,然后将这些左移后或者没有左移的元素相加起来就可以了。

在C++标准中,char类型的长度被定义为一个字节,这个在不同的处理器上面是不变的,因此,可以采用char类型的数组来存储文件头的部分,同时,使用char类型的数组来进行大端模式到小端模式的转换也是很容易的。

代码示例:

int reverseInt(int i) {
	unsigned char c1, c2, c3, c4;

	c1 = i & 255;//&——与运算;255——11111111;该语句的意思是取出i的后八位
	c2 = (i >> 8) & 255;//右移8位
	c3 = (i >> 16) & 255;//右移16位
	c4 = (i >> 24) & 255;//右移24位

	return ((int)c1             
关注
打赏
1659256378
查看更多评论
0.0435s