[C++] Membuat Aplikasi Pengenalan Karakter dengan Qt Creator di Linux

Bismillahirrahmanirrahim.

qtcreatorSaya membuat sebuah program GUI sederhana untuk mengenali karakter (character recognition). Bentuk GUI yang saya buat adalah sebuah jendela dengan 16 x 16 (256) buah QPushButton yang dijadikan toggle button dengan mengaktifkan checked pada propertinya. Cara kerja aplikasi ini adalah dengan menerima input berupa bentuk huruf dari tombol-tombol (toggle) yang ditekan, menjadikan input itu array 16 x 16, memroses input itu dengan suatu algoritma, lalu mencocokkan hasil-hasilnya dengan variabel pengukur. Jika dinyatakan mirip A, maka huruf itu dikatakan huruf A. Jika mirip B, maka B. Jika mirip C, maka C. Jika mirip H, maka H. Saya membuat program ini dengan mengacu kepada referensi utama makalah karya Wim Permana yang berjudul Pengenalan Pola Huruf A, B, dan H dengan Perceptron. Referensi lain saya tuliskan di akhir tulisan ini. Proses pembuatan aplikasi ini adalah dengan drag and drop awalnya pada GUI Builder lalu dilanjutkan dengan menulis kodenya. Semoga tulisan ini bermanfaat.

Sistem

  • Sistem operasi: Ubuntu 12.04
  • Kompiler: g++
  • Build system: Qmake
  • IDE: Qt Creator

Kode Sumber

Saya mohon maaf. Kode sumber untuk program kali ini 3.000 baris lebih. Tidak mungkin saya muat di sini semuanya. Namun saya muat bagian paling pentingnya saja. Peringatan penting, di dalam proyek ini, saya memakai sejumlah source code file yang terpisah di antaranya mainwindow.cpp, deklarator.cpp, dan matikan.cpp. Mereka semua menampung fungsi-fungsi khusus yang saya tunjuk dari dalam mainwindow.cpp ini.

mainwindow.cpp


// tombol CEK
// ================================================================/\/\/\/\//
void MainWindow::on_pushButton_2_clicked()
{
    // percobaan WEIGHT dari pdf "Pengenalan Pola Huruf A, B, dan H dengan Perceptron" Wim Permana
    bool W[4][64] = {{0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,0,0,0,1,1},
                     {1,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,1,1,1,1,0},
                     {1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1},
                     {1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1}};
    // ternyata 3 baris array di atas adalah masing-masing 64 karakter, setiap baris adalah ASCII Art yang menggambarkan A, kemudian B, kemudian H
    // baris keempat adalah huruf C dari saya sendiri (Malsasa)

    // perulangan untuk mencetak tulisan pb* di konsol
    for(int vara=0; vara<=256; vara++)  // diselesaikan pada Wednesday, March 18, 2015 01:46 PM
    {
        cout << "pb" << vara << "=" << this->kotak[vara] << "   " << flush;
    }

    // anak-anak, ayo menggambar matriks

    cout << "Matriks Input: " << endl;
        bool kuas[16][16];                             // daripada susah konversikan kotak (bool) ke int, mending kuas (int) yang dijadikan bool
        int majuterus = 0;                             // inilah sebab musabab array kotak dapat ditransfer isinya ke dalam kuas sehingga dapat digambar, karena ia bersifat sekuensial sama dengan array kotak itu sendiri
           for (int i = 0; i < 16; i++)                // looping 16 x 16, dilakukan dengan for dua kali, i dan j, hasilnya setiap 16 karakter akan ada newline sampai 16 baris (16 x 16 = 256)
           {
              for (int j = 0; j < 16; j++)
              {
                  kuas[i][j] = kotak[majuterus++];      // majuterus++ membuat array satu dimensi 'kotak' yang nilainya sekuensial 0 - 256 dapat dibaca sampai akhir
                                                        // dan dapat menghasilkan output matriks 16x16 di konsol Thursday, March 19, 2015 08:59 AM
                      cout << kuas[i][j] << " ";        // ini petugas printing untuk isi dari kuas[i][j] yang sudah menerima data dari kotak[majuterus++] hasilnya adalah matriks 16x16 di konsol
              }
                       cout << endl;                    // ini petugas yang memotong setiap 16 baris dengan newline, dia petugas paling penting
           }

     // saatnya kerja
    int A = 0, B = 0, C = 0,  H = 0;

    // inilah yang disebut training
    // wim permana melakukan training sebanyak 64 kali untuk 3 kontainer, jadi 3 x 64
    for (int m=0; m<=64; m++)
    {
       A = A + ((kotak[m]-W[0][m])*(kotak[m]-W[0][m]));
       B = B + ((kotak[m]-W[1][m])*(kotak[m]-W[1][m]));
       C = C + ((kotak[m]-W[3][m])*(kotak[m]-W[1][m]));  // bagian C pada array W dibuat belakangan, makanya nomornya juga 3
       H = H + ((kotak[m]-W[2][m])*(kotak[m]-W[2][m]));
    }

    double bobotA = sqrt(A);
    double bobotB = sqrt(B);
    double bobotC = sqrt(C);
    double bobotH = sqrt(H);
    double temp1 = min(bobotA, bobotB);
    double temp2 = min(bobotB, bobotC);
    double temp3 = min(bobotA, bobotH);
    double jarakF = min(temp1, temp2);
    double jarakG = min(temp2, temp3);
    double jarakTerkecil = min(jarakF, jarakG);


    cout << "Hasil pencarian jati diri: " << endl;

    if (jarakTerkecil == bobotA)
    {
         cout << "Input termasuk huruf A" << endl;
         cout << "Nilai dari jarakTerkecil = " << jarakTerkecil << endl;
         cout << "Nilai dari bobotA = " << bobotA << endl;
         cout << "Nilai dari bobotB = " << bobotB << endl;
         cout << "Nilai dari bobotC = " << bobotC << endl;
         cout << "Nilai dari bobotH = " << bobotH << endl;

         // hubungan dengan GUI Thursday, March 19, 2015 12:28 PM
          ui->penampil_huruf->setText("A");
          ui->penampil_jarakTerkecil->setText(QString::number(jarakTerkecil));
          ui->penampil_bobotA->setText(QString::number(bobotA));
          ui->penampil_bobotB->setText(QString::number(bobotB));
          ui->penampil_bobotC->setText(QString::number(bobotC));
          ui->penampil_bobotH->setText(QString::number(bobotH));
    }
         else if (jarakTerkecil == bobotB)
         {
         cout << "Input termasuk huruf B" << endl;
         cout << "Nilai dari jarakTerkecil = " << jarakTerkecil << endl;
         cout << "Nilai dari bobotA = " << bobotA << endl;
         cout << "Nilai dari bobotB = " << bobotB << endl;
         cout << "Nilai dari bobotC = " << bobotC << endl;
         cout << "Nilai dari bobotH = " << bobotH << endl;

         // hubungan dengan GUI
         ui->penampil_huruf->setText("B");
         ui->penampil_jarakTerkecil->setText(QString::number(jarakTerkecil));
         ui->penampil_bobotA->setText(QString::number(bobotA));
         ui->penampil_bobotB->setText(QString::number(bobotB));
         ui->penampil_bobotC->setText(QString::number(bobotC));
         ui->penampil_bobotH->setText(QString::number(bobotH));
    }
         else if (jarakTerkecil == bobotC)
         {
         cout << "Input termasuk huruf C" << endl;
         cout << "Nilai dari jarakTerkecil = " << jarakTerkecil << endl;
         cout << "Nilai dari bobotA = " << bobotA << endl;
         cout << "Nilai dari bobotB = " << bobotB << endl;
         cout << "Nilai dari bobotC = " << bobotC << endl;
         cout << "Nilai dari bobotH = " << bobotH << endl;

         // hubungan dengan GUI
         ui->penampil_huruf->setText("C");
         ui->penampil_jarakTerkecil->setText(QString::number(jarakTerkecil));
         ui->penampil_bobotA->setText(QString::number(bobotA));
         ui->penampil_bobotB->setText(QString::number(bobotB));
         ui->penampil_bobotC->setText(QString::number(bobotC));
         ui->penampil_bobotH->setText(QString::number(bobotH));
    }
        else if (jarakTerkecil == bobotH)
        {
            cout << "Input termasuk huruf H" << endl;
            cout << "Nilai dari jarakTerkecil = " << jarakTerkecil << endl;
            cout << "Nilai dari bobotA = " << bobotA << endl;
            cout << "Nilai dari bobotB = " << bobotB << endl;
            cout << "Nilai dari bobotC = " << bobotC << endl;
            cout << "Nilai dari bobotH = " << bobotH << endl;

            // hubungan dengan GUI
            ui->penampil_huruf->setText("H");
            ui->penampil_jarakTerkecil->setText(QString::number(jarakTerkecil));
            ui->penampil_bobotA->setText(QString::number(bobotA));
            ui->penampil_bobotB->setText(QString::number(bobotB));
            ui->penampil_bobotC->setText(QString::number(bobotC));
            ui->penampil_bobotH->setText(QString::number(bobotH));
    }
    // akhir kode perhitungan algoritma Perceptron <<<==========================>>>

}

Qt Creator dan Kode


qtcreator-matriks-cpp3
Tahap perancangan GUI secara drag and drop
qtcreator-matriks-cpp2
Tahap penulisan kode

Hasil


Program ini jauh dari sempurna. Ia baru mampu mengenali huruf A, B, C, dan H. Itu pun masih beserta sekian error yang belum dapat saya ketahui dan atasi.

Pengenalan Huruf A

qtcreator-matriks-cpp4

Pengenalan Huruf B

qtcreator-matriks-cpp5

Pengenalan Huruf C

qtcreator-matriks-cpp6

Pengenalan Huruf H

qtcreator-matriks-cpp7

Output Teknikal

Saya mau program saya informatif dan bertanggung jawab seperti perangkat lunak Linux lainnya. Maka saya membuat agar dia mengeluarkan output ke konsol (standard output) setiap kali suatu aksi penting dilakukan. Di antaranya adalah output nilai per tombol setiap kali ada klik, nilai-nilai dari seluruh array (baca: ASCII Art) ketika gambar sudah dibuat lalu tombol PROSES ditekan, dan output dari semua variabel penting yang digunakan semacam bobot* dan jarakTerkecil, dan yang paling penting huruf apa yang sedang ditangkap oleh algoritma program.

Output Nilai Per Tombol yang Sedang Aktif

qtcreator-matriks-cpp12

Output Total Seluruh Kotak Secara Gestalt

qtcreator-matriks-cpp11
Huruf H

Output Seluruh Nilai Bersamaan

qtcreator-matriks-cpp10
Yang ini dibikin sebelum semuanya dibikin, jadi kacau pun tak mengapa

Error


Program ini juga mengandung banyak error.

Salah Pengenalan Karakter

qtcreator-matriks-cpp13

Saya tidak menjelaskan panjang karena saya sendiri belum paham dengan algoritma ini. Saya tidak memberikan analisis seperti biasanya karena ini blog bleeding edge.

Unduh Kode Sumber


Referensi


  1. Adhiyaksa, A. & Susmikanti, M. (2005). Identifikasi Huruf Menggunakan Metode Pembelajaran Perceptron dalam Jaringan Neural. Diambil pada 18 Maret 2015 dari http://km.ristek.go.id/assets/files/NEW/Prosiding/PDF%20Prosiding_2005/Mike%20Susmikanti.pdf.
  2. Novianto, Ary., Hastono, S. P., & Wahyono dkk. (Tanpa Tahun). Pengenalan Huruf Berbasis Jaringan Syaraf Tiruan Menggunakan Algoritma Perceptron. Diambil pada 18 Maret 2015 dari https://www.scribd.com/doc/30003421/Pengenalan-Huruf-Berbasis-Jaringan-Syaraf-Tiruan-Menggunakan-Algoritma-Perceptron.
  3. Permana, Wim. (Tanpa Tahun). Pengenalan Pola Huruf A, B, dan H dengan Perceptron. Diambil pada 18 Maret 2015 dari https://wimkhan.files.wordpress.com/2008/02/perceptron.pdf.
Iklan

5 thoughts on “[C++] Membuat Aplikasi Pengenalan Karakter dengan Qt Creator di Linux

  1. malam gans,
    ane masih sangad awam dan kepo bgt nh sm programing QT ini, karna bs multiplatform gtu(menurut search google).
    yang jadi pertanyaan mendasar, QT ini bisa dibuat untuk menjadi aplikasi apa aj sh? dalam artian komersial gtu gans. klo boleh bs kasih contoh nya gans.

    thanx klo bs respons

    salam

    • Qt (bukan QT) adalah framework untuk bahasa C++ untuk membangun software dengan tampilan GUI. Qt di dunia internasional setara dengan GTK+, untuk membuat software dengan tampilan GUI pula. Segala apa pun yang bisa dibuat dengan bahasa/framework Microsoft Visual Basic atau Microsoft Visual C++, secara umum, itu bisa dibuat dengan Qt. Mulai program konsol, game, POS, sampai program-program besar yang rumit yang mengandalkan database dan networking. Jika ada yang dibingungkan, silakan tanya kembali.

Mohon jangan gunakan emotikon:

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s