• 手写数字识别,C++,OpenCV


    图片切割:

     1 // 核心代码:
     2 char root_path[150];    // 数字图片的路径
     3 char pic_path[100];
     4 sprintf(root_path, "E:\4_大三下\机器视觉\实验图片\8\8-1.bmp");
     5 IplImage *inputImg = cvLoadImage(root_path,1);
     6 int block = 4;
     7 int nWidth = inputImg->width / block;
     8 int nHeight = inputImg->height / block;
     9 for(int i = 0;i < block;i++)
    10     for(int j = 0; j < block;j++) {
    11         cvResetImageROI(inputImg);
    12         cvSetImageROI(inputImg, cvRect(i * nWidth, j * nHeight, nWidth, nHeight));
    13         IplImage * img = cvCreateImage(cvSize(nWidth, nHeight), 8, 3);
    14         cvCopy(inputImg,img);
    15         sprintf(pic_path, "E:\4_大三下\机器视觉\%d-%d.bmp", i, j);
    16         cvSaveImage(pic_path, img);
    17     }

    实现数字图像的特征提取算法,求0~9共十个数字的平均特征向量;

    实现数字图像的识别算法,任意输入三个不同的数字图像,将数字图像和识别结果输出到屏幕;

      1 #include "stdio.h"
      2 #include "math.h"
      3 #include "vector"
      4 #include "cv.h"
      5 #include "highgui.h"
      6 
      7 using namespace std;
      8 
      9 // 函数功能,计算一张图片某一个矩形块(以x,y为原点, width,height为宽度和高度)中黑色像素点的个数
     10 int ImageBlackCount(IplImage *Img, int x,int y,int width,int height)
     11 {
     12     int nCount = 0;
     13     char *data = (char *)Img->imageData;    // 新图象数据信息
     14     int  wp = Img->widthStep;
     15     for(int i = 0;i < height;i++)
     16         for(int j = 0;j < width;j++)
     17         {
     18             int r = data[(x + i) * wp + 3 * (y + j)];
     19             if(r == 0)
     20                 nCount++;
     21         }
     22     return nCount;
     23 }
     24 
     25 // 函数功能,返回一张图片的特征向量
     26 vector<int> ImageVec(IplImage *Img)
     27 {
     28     vector<int> temp(16,0);
     29     int nwidth = Img->width / 4;
     30     int nheight = Img->height / 4;        // 分成16块
     31     int x = 0, y = 0;
     32     for(int k = 1;k <= 16;k++) 
     33     {
     34         temp[k - 1] = ImageBlackCount(Img, x, y, nwidth, nheight);
     35         y += nwidth;
     36         if(k % 4 == 0)
     37         {
     38             x += nheight;
     39             y = 0;
     40         }
     41     }    
     42     return temp;
     43 }
     44 
     45 // 计算欧氏距离
     46 double CalDist(vector<int> test,vector<int> train)
     47 {
     48     double dist = 0;
     49     if(test.size() == train.size())
     50         for(int i = 0;i < test.size();i++)
     51             dist += (train[i] - test[i]) * (train[i] - test[i]);
     52     return sqrt(dist);
     53 }
     54 
     55 int main(int arge,char * argv[])
     56 {
     57     char root_path[150];    // 数字图片的路径
     58     vector< vector<int> > vec;
     59     // 模板库--平均特征向量求解
     60     int block = 0;
     61     for(int i = 0;i < 10;i++)
     62     {
     63         vector<int> avg(16,0);
     64         for(int j = block +1; j <= block + 5;j++) {
     65             sprintf(root_path, "E:\4_大三下\机器视觉\实验图片\%d\%d-%d.bmp", i, i, j);
     66             IplImage *inputImg = cvLoadImage(root_path,1);
     67             vector<int> temp = ImageVec(inputImg);
     68             for(int k = 0;k < 16;k++)
     69                 avg[k] += temp[k];
     70         }
     71         printf("数字%d的平均特征向量:",i);
     72         for(int k = 0;k < 16;k++) {
     73             avg[k] = avg[k] / 5;//block;
     74             printf("%d ",avg[k]);        // 一个数字的平均特征向量
     75         }
     76         putchar(10);
     77         vec.push_back(avg);
     78     }
     79 
     80     // 剩余数字的测试匹配
     81     char pic_path[150];
     82     vector< vector<int> > Mat;
     83     for(int i2 = 0;i2 < 10;i2++)
     84     {
     85         vector<int> mat_test(10,0);
     86         for(int j2 = 6 - block; j2 <= 10 - block;j2++) {
     87             sprintf(pic_path, "E:\4_大三下\机器视觉\实验图片\%d\%d-%d.bmp", i2, i2, j2);
     88             IplImage *test = cvLoadImage(pic_path,1);
     89             vector<int> temp = ImageVec(test);
     90             int cls = 0;
     91             double d = 0, min = CalDist(temp, vec[0]);
     92             for(int n = 0;n < 10;n++) 
     93             {
     94                 d = CalDist(temp, vec[n]);
     95                 if(min >  d) 
     96                 {
     97                     min = d;
     98                     cls = n;
     99                 }
    100             }
    101             mat_test[cls]++;
    102         }
    103         Mat.push_back(mat_test);
    104     }
    105     double rate = 0;
    106     // 混淆矩阵
    107     printf("   0 1 2 3 4 5 6 7 8 9 
    ");
    108     for(int i3 = 0;i3 < 10;i3++) 
    109     {
    110         rate += Mat[i3][i3];
    111         printf("%d: ",i3);
    112         for(int j3 = 0; j3 < 10;j3++)
    113             printf("%d ",Mat[i3][j3]);
    114         putchar(10);
    115     }
    116     printf("总识别率为:%.2lf%%
    ",rate * 2);
    117     return 0;
    118 }

     2021-06-04

  • 相关阅读:
    js控制两个日期相减
    下拉框只显示最初下拉框中的值和json返回array的交集
    js来进行字符串的转化和小数点后的截取
    js来实现popup的生成,带钟罩,可移动popup,点击body可自动消失
    css块居中
    響應式設計佈局
    pc端手機端自適應佈局方案
    pc端常規頁面實現
    pc端前端和手機端區別
    js字符串轉數組,數組轉字符串
  • 原文地址:https://www.cnblogs.com/2015-16/p/14850987.html
Copyright © 2020-2023  润新知