Pre-processing before digit recognition with KNN classifier

后端 未结 3 1167
暖寄归人
暖寄归人 2021-02-07 11:03

Right now I\'m trying to create digit recognition system using OpenCV. There are many articles and examples in WEB (and even on StackOverflow). I decided to use KNN classifier b

3条回答
  •  长情又很酷
    2021-02-07 11:31

    I realized my mistake - it wasn't connected with pre-processing at all (thanks to @DavidBrown and @John). I used handwritten dataset of digits instead of printed (capitalized). I didn't find such database in the web so I decided to create it by myself. I have uploaded my database to the Google Drive.

    And here's how you can use it (train and classify):

    int digitSize = 16;
    //returns list of files in specific directory
    static vector getListFiles(const string& dirPath)
    {
        vector result;
        DIR *dir;
        struct dirent *ent;
        if ((dir = opendir(dirPath.c_str())) != NULL)
        {
            while ((ent = readdir (dir)) != NULL)
            {
                if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0 )
                {
                    result.push_back(ent->d_name);
                }
            }
            closedir(dir);
        }
        return result;
    }
    
    void DigitClassifier::train(const string& imagesPath)
    {
        int num = 510;
        int size = digitSize * digitSize;
        Mat trainData = Mat(Size(size, num), CV_32FC1);
        Mat responces = Mat(Size(1, num), CV_32FC1);
    
        int counter = 0;
        for (int i=1; i<=9; i++)
        {
            char digit[2];
            sprintf(digit, "%d/", i);
            string digitPath(digit);
            digitPath = imagesPath + digitPath;
            vector images = getListFiles(digitPath);
            for (int j=0; j(counter*size+k) = mat.at(k);
                }
                responces.at(counter) = i;
                counter++;
            }
        }
        knn.train(trainData, responces);
    }
    
    int DigitClassifier::classify(const Mat& img) const
    {
        Mat tmp = img.clone();
    
        resize(tmp, tmp, Size(digitSize, digitSize));
    
        tmp.convertTo(tmp, CV_32FC1);
    
        return knn.find_nearest(tmp.reshape(1, 1), 5);
    }
    

提交回复
热议问题