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

opencv 数字识别 附完整代码

   日期:2018-08-22     浏览:48    评论:0    
核心提示:看到原文有很多人求完整代码,于是在这里给出完整代码,并且补充了更详细的注释,以便于更好的理解代码。具体的步骤和思路,原文
 看到原文有很多人求完整代码,于是在这里给出完整代码,并且补充了更详细的注释,以便于更好的理解代码。具体的步骤和思路,原文里有详细的说明,这里就不再阐述了。

 

以下为完整代码:

  1.  
    #include "cv.h"
  2.  
    #include "highgui.h"
  3.  
    #include "cxcore.h"
  4.  
    using namespace std;
  5.  
    using namespace cv;
  6.  
     
  7.  
    int getColSum(Mat src,int col)//统计所有列像素的总和
  8.  
    {
  9.  
    int sum = 0;
  10.  
    int height = src.rows;
  11.  
    int width = src.cols;
  12.  
    for (int i = 0; i < height; i++)
  13.  
    {
  14.  
    sum = sum + src.at <uchar>(i, col);
  15.  
    }
  16.  
    return sum;
  17.  
    }
  18.  
     
  19.  
    int getRowSum(Mat src, int row)//统计所有行像素的总和
  20.  
    {
  21.  
    int sum = 0;
  22.  
    int height = src.rows;
  23.  
    int width = src.cols;
  24.  
    for (int i = 0; i < width; i++)
  25.  
    {
  26.  
    sum += src.at <uchar>(row, i);
  27.  
    }
  28.  
    return sum;
  29.  
    }
  30.  
     
  31.  
     
  32.  
    void cutTop(Mat& src, Mat& dstImg)//上下切割
  33.  
    {
  34.  
    int top, bottom;
  35.  
    top = 0;
  36.  
    bottom = src.rows;
  37.  
     
  38.  
    int i;
  39.  
    for (i = 0; i < src.rows; i++)
  40.  
    {
  41.  
    int colValue = getRowSum(src, i);//统计所有行像素的总和
  42.  
    //cout <<i<<" th "<< colValue << endl;
  43.  
    if (colValue>0)//扫描直到行像素的总和大于0时,记下当前位置top
  44.  
    {
  45.  
    top = i;
  46.  
    break;
  47.  
    }
  48.  
    }
  49.  
    for (; i < src.rows; i++)
  50.  
    {
  51.  
    int colValue = getRowSum(src, i);//统计所有行像素的总和
  52.  
    //cout << i << " th " << colValue << endl;
  53.  
    if (colValue == 0)//继续扫描直到行像素的总和等于0时,记下当前位置bottom
  54.  
    {
  55.  
    bottom = i;
  56.  
    break;
  57.  
    }
  58.  
    }
  59.  
     
  60.  
    int height = bottom - top;
  61.  
    Rect rect(0, top, src.cols, height);
  62.  
    dstImg = src(rect).clone();
  63.  
    }
  64.  
     
  65.  
    int cutLeft(Mat& src, Mat& leftImg, Mat& rightImg)//左右切割
  66.  
    {
  67.  
    int left, right;
  68.  
    left = 0;
  69.  
    right = src.cols;
  70.  
     
  71.  
    int i;
  72.  
    for (i = 0; i < src.cols; i++)
  73.  
    {
  74.  
    int colValue = getColSum(src, i);//统计所有列像素的总和
  75.  
    //cout <<i<<" th "<< colValue << endl;
  76.  
    if (colValue>0)//扫描直到列像素的总和大于0时,记下当前位置left
  77.  
    {
  78.  
    left = i;
  79.  
    break;
  80.  
    }
  81.  
    }
  82.  
    if (left == 0)
  83.  
    {
  84.  
    return 1;
  85.  
    }
  86.  
     
  87.  
    //继续扫描
  88.  
    for (; i < src.cols; i++)
  89.  
    {
  90.  
    int colValue = getColSum(src, i);//统计所有列像素的总和
  91.  
    //cout << i << " th " << colValue << endl;
  92.  
    if (colValue == 0)//继续扫描直到列像素的总和等于0时,记下当前位置right
  93.  
    {
  94.  
    right = i;
  95.  
    break;
  96.  
    }
  97.  
    }
  98.  
    int width = right - left;//分割图片的宽度则为right - left
  99.  
    Rect rect(left, 0, width, src.rows);//构造一个矩形,参数分别为矩形左边顶部的X坐标、Y坐标,右边底部的X坐标、Y坐标(左上角坐标为0,0)
  100.  
    leftImg = src(rect).clone();
  101.  
    Rect rectRight(right, 0, src.cols - right, src.rows);//分割后剩下的原图
  102.  
    rightImg = src(rectRight).clone();
  103.  
    cutTop(leftImg, leftImg);//上下切割
  104.  
    return 0;
  105.  
    }
  106.  
     
  107.  
     
  108.  
    void getPXSum(Mat &src, int &a)//获取所有像素点和
  109.  
    {
  110.  
    threshold(src, src, 100, 255, CV_THRESH_BINARY);
  111.  
    a = 0;
  112.  
    for (int i = 0; i < src.rows;i++)
  113.  
    {
  114.  
    for (int j = 0; j < src.cols; j++)
  115.  
    {
  116.  
    a += src.at <uchar>(i, j);
  117.  
    }
  118.  
    }
  119.  
    }
  120.  
     
  121.  
    int getSubtract(Mat &src, int TemplateNum) //数字识别
  122.  
    {
  123.  
    Mat img_result;
  124.  
    int min = 1000000;
  125.  
    int serieNum = 0;
  126.  
    for (int i = 0; i < TemplateNum; i++){
  127.  
    char name[20];
  128.  
    sprintf_s(name, "D:\\1\\%dLeft.jpg", i);
  129.  
    Mat Template = imread(name, CV_LOAD_IMAGE_GRAYSCALE);//读取模板
  130.  
    threshold(Template, Template, 100, 255, CV_THRESH_BINARY);
  131.  
    threshold(src, src, 100, 255, CV_THRESH_BINARY);
  132.  
    resize(src, src, Size(32, 48), 0, 0, CV_INTER_LINEAR);
  133.  
    resize(Template, Template, Size(32, 48), 0, 0, CV_INTER_LINEAR);//调整尺寸
  134.  
    //imshow(name, Template);
  135.  
     
  136.  
  137.  
    absdiff(Template, src, img_result);//AbsDiff,OpenCV中计算两个数组差的绝对值的函数。
  138.  
    int diff = 0;
  139.  
    getPXSum(img_result, diff);//获取所有像素点和
  140.  
    if (diff < min)//像素点对比
  141.  
    {
  142.  
    min = diff;
  143.  
    serieNum = i;
  144.  
    }
  145.  
    }
  146.  
     
  147.  
    printf("最小距离是%d ", min);
  148.  
    printf("匹配到第%d个模板匹配的数字是%d\n", serieNum,serieNum);
  149.  
    return serieNum;
  150.  
    }
  151.  
     
  152.  
     
  153.  
     
  154.  
     
  155.  
     
  156.  
     
  157.  
    int main()
  158.  
    {
  159.  
    Mat src = imread("ss.jpg", CV_LOAD_IMAGE_GRAYSCALE);//读取图片
  160.  
    threshold(src, src, 100 , 255, 1);//二值化
  161.  
    imshow("origin", src);//显示二值化后图片
  162.  
     
  163.  
    Mat leftImg,rightImg;
  164.  
    int res = cutLeft(src, leftImg, rightImg);
  165.  
    int i = 0;
  166.  
    while (res == 0)
  167.  
    {
  168.  
    char nameLeft[10];
  169.  
    sprintf(nameLeft, "%dLeft", i);
  170.  
    char nameRight[10];
  171.  
    sprintf(nameRight, "%dRight", i);
  172.  
    i++;
  173.  
    imshow(nameLeft, leftImg);//显示分割后的图片
  174.  
     
  175.  
  176.  
    //stringstream ss;
  177.  
    //ss << nameLeft;
  178.  
    //imwrite("D:\\1\\" + ss.str() + ".jpg", leftImg);//把分割图片存到D:\\1\\
  179.  
    //ss >> nameLeft;
  180.  
     
  181.  
    Mat srcTmp = rightImg;
  182.  
    getSubtract(leftImg, 10);//进行数字识别
  183.  
    res = cutLeft(srcTmp, leftImg, rightImg);
  184.  
    }
  185.  
     
  186.  
    waitKey(0);
  187.  
    return 0;
  188.  
    }
  189.  
 
打赏
 
更多>同类编程
0相关评论

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

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