01 trainData

    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    
    const int train_samples = 1;
    const int classes = 10;
    const int sizex = 20;
    const int sizey = 30;
    const int ImageSize = sizex * sizey;
    char pathToImages[] = "/Users/powenko/Desktop/靜宜大學/20161001-課程-無人機安全監控/OpenCV/opencv/XCode/06OCR/sample11_OCR1/test";
    
    void PreProcessImage(Mat *inImage,Mat *outImage,int sizex, int sizey);
    void LearnFromImages(CvMat* trainData, CvMat* trainClasses);
    void RunSelfTest(KNearest& knn2);
    void AnalyseImage(KNearest knearest);
    /** @function main */
    int main(int argc, char** argv)
    {
    
    CvMat* trainData = cvCreateMat(classes * train_samples,ImageSize, CV_32FC1);
    CvMat* trainClasses = cvCreateMat(classes * train_samples, 1, CV_32FC1);
    
    namedWindow("single", CV_WINDOW_AUTOSIZE);
    namedWindow("all",CV_WINDOW_AUTOSIZE);
    
    LearnFromImages(trainData, trainClasses);
    
    KNearest knearest(trainData, trainClasses);
    
    RunSelfTest(knearest);
    
    cout << "losgehtsn";
    
    AnalyseImage(knearest);
    
    return 0;
    
    }
    
    void PreProcessImage(Mat *inImage,Mat *outImage,int sizex, int sizey)
    {
    Mat grayImage,blurredImage,thresholdImage,contourImage,regionOfInterest;
    
    vector<vector<Point> > contours;
    
    cvtColor(*inImage,grayImage , COLOR_BGR2GRAY);
    
    GaussianBlur(grayImage, blurredImage, Size(5, 5), 2, 2);
    adaptiveThreshold(blurredImage, thresholdImage, 255, 1, 1, 11, 2);
    
    thresholdImage.copyTo(contourImage);
    
    findContours(contourImage, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
    
    int idx = 0;
    size_t area = 0;
    for (size_t i = 0; i < contours.size(); i++)
    {
    if (area < contours[i].size() )
    {
    idx = i;
    area = contours[i].size();
    }
    }
    
    Rect rec = boundingRect(contours[idx]);
    
    regionOfInterest = thresholdImage(rec);
    
    resize(regionOfInterest,*outImage, Size(sizex, sizey));
    
    }
    
    void LearnFromImages(CvMat* trainData, CvMat* trainClasses)
    {
    Mat img;
    char file[255];
    for (int i = 0; i < classes; i++)
    {
    sprintf(file, "%s/%d.png", pathToImages, i);
    img = imread(file, 1);
    if (!img.data)
    {
    cout << "File " << file << " not foundn";
    exit(1);
    }
    Mat outfile;
    PreProcessImage(&img, &outfile, sizex, sizey);
    for (int n = 0; n < ImageSize; n++)
    {
    trainData->data.fl[i * ImageSize + n] = outfile.data[n];
    }
    trainClasses->data.fl[i] = i;
    }
    
    }
    
    void RunSelfTest(KNearest& knn2)
    {
    Mat img;
    CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);
    // SelfTest
    char file[255];
    int z = 0;
    while (z++ < 10)
    {
    int iSecret = rand() % 10;
    //cout << iSecret;
    sprintf(file, "%s/%d.png", pathToImages, iSecret);
    img = imread(file, 1);
    Mat stagedImage;
    PreProcessImage(&img, &stagedImage, sizex, sizey);
    for (int n = 0; n < ImageSize; n++)
    {
    sample2->data.fl[n] = stagedImage.data[n];
    }
    float detectedClass = knn2.find_nearest(sample2, 1);
    if (iSecret != (int) ((detectedClass)))
    {
    cout << "Falsch. Ist " << iSecret << " aber geraten ist "
    << (int) ((detectedClass));
    exit(1);
    }
    cout << "Richtig " << (int) ((detectedClass)) << "n";
    imshow("single", img);
    //waitKey(0);
    }
    
    }
    
    void AnalyseImage(KNearest knearest)
    {
    
    CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);
    
    Mat image, gray, blur, thresh;
    
    vector < vector<Point> > contours;
    std::string tPath=pathToImages;
    tPath.append("/buchstaben.png");
    image = imread(tPath, 1);
    
    cvtColor(image, gray, COLOR_BGR2GRAY);
    GaussianBlur(gray, blur, Size(5, 5), 2, 2);
    adaptiveThreshold(blur, thresh, 255, 1, 1, 11, 2);
    findContours(thresh, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
    
    for (size_t i = 0; i < contours.size(); i++)
    {
    vector < Point > cnt = contours[i];
    if (contourArea(cnt) > 50)
    {
    Rect rec = boundingRect(cnt);
    if (rec.height > 28)
    {
    Mat roi = image(rec);
    Mat stagedImage;
    PreProcessImage(&roi, &stagedImage, sizex, sizey);
    for (int n = 0; n < ImageSize; n++)
    {
    sample2->data.fl[n] = stagedImage.data[n];
    }
    float result = knearest.find_nearest(sample2, 1);
    rectangle(image, Point(rec.x, rec.y),
    Point(rec.x + rec.width, rec.y + rec.height),
    Scalar(0, 0, 255), 2);
    
    imshow("all", image);
    cout << result << "n";
    
    imshow("single", stagedImage);
    waitKey(0);
    }
    
    }
    
    }
    }
    
    

    screen-shot-2016-12-02-at-8-51-13-pm