knn识别字母

来源:互联网 发布:知乎日报源码 编辑:程序博客网 时间:2024/06/14 04:06
#include "stdafx.h"DECLAREGLOBAL /* 预处理数据 */Mat procrssimg(Mat& img){    int g_nStructElementSize = 1; //结构元素(内核矩阵)的尺寸      //获取自定义核      Mat element = getStructuringElement(MORPH_RECT,        Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1),        Point(g_nStructElementSize, g_nStructElementSize));    Mat image;    img.copyTo(image);    /* 放大4倍 */    resize(image, image, Size(image.cols * 4, image.rows * 4));    cvtColor(image, image, COLOR_BGR2GRAY); /* 灰度化图片 */    threshold(image, image, 150, 255, CV_THRESH_BINARY_INV);  /* 二值化图片 */    //threshold(gray, gray, 150, 255, CV_THRESH_BINARY);  /* 二值化图片 */    dilate(image, image, element);    erode(image, image, element);    medianBlur(image,image, 5); /* 中值平滑处理 */    return image;}  float trainingData[1700][16*32]; int knnnumtrain(LPCTSTR file1){    //Mat image = imread(file1);    //Mat gray = procrssimg(image);    //vector<vector<cv::Point>> contours;    //vector<cv::Point> maxContour;    //Mat tmp;    //gray.copyTo(tmp);    //cv::Mat imgRoi;    //findContours(tmp, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);    //printf("轮廓数量:%d\n", contours.size());     //vector<cv::Rect> maxR;    //for (int i = 0; i < contours.size(); i++){    //    maxContour = contours[i];    //    Rect maxRect = boundingRect(maxContour);    //    maxR.push_back(maxRect);    //}     //printf("maxR size:%d\n", maxR.size());    ///* 排序 */    //for (int i = 0; i < maxR.size()-1; i++){    //    for (int j = i + 1; j < maxR.size(); j++){    //        printf("[i x]:%d [j x]:%d\n", maxR[i].x, maxR[j].x);    //        if (maxR[i].x>maxR[j].x){    //            Rect tmp = maxR[i];    //            maxR[i] = maxR[j];    //            maxR[j] = tmp;    //        }    //    }    //}     //This variable will be loaded with a set of images to perform PCA on.    vector<FILELABELCHAR> charBank; int num = 0;   Mat src;    //vector<FILELABEL> faceBank; //vector<CString> nonFaceBank; GetSubCharDirFiles("C:\\img\\charSamples", charBank,0);        for (int i = 0; i < charBank.size(); i++){                 ///* 设置ROI区域 */        //Rect maxRect = maxR[i];        //imgRoi = gray(maxRect);        //uchar *p = imgRoi.data;        /* 画上边框 */        //rectangle(image, maxRect, Scalar(0, 255, 0));        //rectangle(gray, maxRect, Scalar(255));        /* 大小归一化处理 */src = imread((LPCTSTR)charBank[i].name,0);        resize(src, src, Size(16, 32));        //printf("rows:%d cols:%d\n", imgRoi.rows, imgRoi.cols);        /* char ss[20];        sprintf(ss, "c:\\img\\fortemp\\%d.jpg", i);        imwrite(ss, imgRoi);*/         /* 计算特征 */int k=0;        for (int j = 0; j < 16; j++){            for (int z = 0; z < 32; z++){                trainingData[i][k++] = src.at<uchar>(z , j);            }        }    }     Mat trainingDataM(1700, 16 * 32, CV_32FC1,trainingData);    float responses[34] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B','C','D','E','F','G','H'/*,'I'*/,'J','K','L','M','N'/*,'O'*/,'P','Q','R','S','T','U','V' ,'W','X','Y','Z'};   float resp[34*50];   int i,j;for(i=0;i<34;i++){for(j=0;j<50;j++){resp[i*50+j]=responses[i];}}Mat trainingDataR(1700, 1, CV_32FC1,resp);    KNearest knn;    knn.train(trainingDataM, trainingDataR, Mat(), false, 1700);    float imageS[16 * 32];    Mat imageTest = imread(file1,0); resize(imageTest, imageTest, Size(16, 32));int k=0;    for (int i = 0; i < 16; i++){        for (int j = 0; j < 32; j++){            imageS[k++] = imageTest.at<uchar>(j ,i);        }    }    Mat trainingDataS(1, 16 * 32, CV_32FC1,imageS);    char r = knn.find_nearest(trainingDataS,1);    DLGPRINT("%c", (char)r);      //imshow("test", image);   // imshow("gray", gray);   // waitKey();    return 0;}

0 0
原创粉丝点击