[Learning OpenCV4] Reconocimiento de dígitos escritos a mano basado en OpenCV

Este contenido se comparte en el curso "Introducción a OpenCV Intensive Lecture (C++/Python Bilingual Teaching)", dirección:

Introducción intensiva a OpenCV (enseñanza bilingüe C++/Python)

Si quieres mejorar tu nivel de programación en C++, puedes consultar el curso:

Aprendizaje avanzado de C++

También hay muchos casos interesantes y prácticos en el curso de OpenCV, estos casos están implementados en C++ y Python, y los códigos en ellos se explican en detalle.
inserte la descripción de la imagen aquí

Reconocimiento de dígitos escritos a mano basado en OpenCV Cargue el conjunto de datos de reconocimiento de dígitos escritos a mano desde 'digits.png', luego entrene un clasificador SVM y KNearest y evalúe su precisión.
El conjunto de datos será preprocesado de la siguiente manera:

  • dewarping de momento basado en imágenes (ver función de corrección de distorsión())
  • La imagen digital se divide en 4 celdas de 10x10 y 16 bins, y se calcula un histograma de gradientes orientados para cada bin
  • Convierta el histograma a espacio utilizando la métrica de Hellinger (ver [1] (RootSIFT))

el código se muestra a continuación

int main(int /* argc */, char *argv[])
{
    
    
    help(argv);

    vector<Mat> digits; // 训练数据
    vector<int> labels; // 标签

    // 加载训练数据和标签
    load_digits(DIGITS_FN, digits, labels);

    cout << "preprocessing..." << endl;

    // 数据打乱
    shuffle(digits, labels);

    vector<Mat> digits2;

    // 扭曲图像
    for (size_t i = 0; i < digits.size(); i++)
    {
    
    
        Mat deskewed_digit;
        deskew(digits[i], deskewed_digit);
        digits2.push_back(deskewed_digit);
    }

    Mat samples;

    // 预处理求hog算子
    preprocess_hog(digits2, samples);
    // imshow("samples", samples);
    // waitKey(0);

    // 90%的数据做训练集
    int train_n = (int)(0.9 * samples.rows);
    Mat test_set;

    // 存储测试数据
    vector<Mat> digits_test(digits2.begin() + train_n, digits2.end());
    // 马赛克式将小图像拼成大图像
    mosaic(25, digits_test, test_set);
    imshow("test set", test_set);
    imwrite("test_image.jpg", test_set);

    // 训练数据和测试数据划分
    Mat samples_train = samples(Rect(0, 0, samples.cols, train_n));
    Mat samples_test = samples(Rect(0, train_n, samples.cols, samples.rows - train_n));
    vector<int> labels_train(labels.begin(), labels.begin() + train_n);
    vector<int> labels_test(labels.begin() + train_n, labels.end());

    Ptr<ml::KNearest> k_nearest;
    Ptr<ml::SVM> svm;
    vector<float> predictions;
    Mat vis;

    // K最近邻算法
    cout << "training KNearest..." << endl;
    k_nearest = ml::KNearest::create();
    // 模型训练
    k_nearest->train(samples_train, ml::ROW_SAMPLE, labels_train);

    // KNearest做结果预测
    k_nearest->findNearest(samples_test, 4, predictions);
    // 模型评估,计算错误率
    evaluate_model(predictions, digits_test, labels_test, vis);
    imshow("KNearest test", vis);
    imwrite("KNearest-test.jpg", vis);
    k_nearest.release();

    // SVM算法
    cout << "training SVM..." << endl;
    svm = ml::SVM::create();
    svm->setGamma(5.383);
    svm->setC(2.67);
    svm->setKernel(ml::SVM::RBF);
    svm->setType(ml::SVM::C_SVC);
    svm->train(samples_train, ml::ROW_SAMPLE, labels_train);

    // predict digits with SVM
    svm->predict(samples_test, predictions);
    evaluate_model(predictions, digits_test, labels_test, vis);
    imshow("SVM test", vis);
    imwrite("SVM-test.jpg", vis);
    cout << "Saving SVM as \"digits_svm.yml\"..." << endl;
    // 训练的结果保存
    svm->save("digits_svm.yml");
    svm.release();

    waitKey();

    return 0;
}

Los resultados del entrenamiento son los siguientes:

KNearest  error: 2.80 %
SVM  error: 2.40 %

La imagen de prueba es la siguiente:
inserte la descripción de la imagen aquí

KResultados de la prueba del algoritmo más cercano (la marca roja es el resultado de un error de reconocimiento):
inserte la descripción de la imagen aquí

Resultados de la prueba del algoritmo SVM (las marcas rojas son los resultados de errores de reconocimiento):
inserte la descripción de la imagen aquí

Más aprendizaje puede referirse a libros:

"Aprendiendo OpenCV4: Algoritmos Prácticos Basados ​​en Python"

"Práctica de visión artificial de aprendizaje profundo"

Supongo que te gusta

Origin blog.csdn.net/lxiao428/article/details/129518876
Recomendado
Clasificación