Pengantar Pemrograman OpenCV C++ di Linux


Bismillahirrahmanirrahim.

Tulisan ini tersedia dalam PDF.

Tulisan ini ditujukan kepada pemula OpenCV di Linux. Tulisan ini dibuat untuk siapa saja yang ingin tahu bagaimana menggunakan IDE untuk memrogram OpenCV dengan C++ di Linux. Tulisan ini juga dibuat untuk pengguna Microsoft Visual C++ di Windows yang ingin mencoba OpenCV di Linux. Tulisan ini mencakup pengenalan singkat, instalasi di Linux, dan contoh-contoh kode OpenCV. Tulisan ini juga berisi tip-tip memulai OpenCV semisal membaca dokumentasi resmi dan mencari sumber daya. Tulisan ini tidak berisi algoritma atau bahasan-bahasan OpenCV lanjutan yang lain. Tulisan ini hanya pengantar singkat untuk pemula. Tujuan dari tulisan ini adalah Anda mampu mengatur sendiri IDE di Linux untuk OpenCV dan bisa menjalankan kode sumber program dengan benar. Semoga tulisan ini bermanfaat.

Isi Tulisan Ini

  1. Apa Itu OpenCV?
  2. Apa yang Bisa Dilakukan dengan OpenCV?
  3. Instalasi OpenCV di Linux
  4. Pilihan Editor/IDE untuk Memrogram OpenCV di Linux
  5. Cara Mengonfigurasi Build Options Kompiler g++ untuk OpenCV di Geany
  6. Contoh-Contoh Kode Sumber Program OpenCV
  7. Sumber Referensi Belajar OpenCV
  8. Tip-Tip Belajar OpenCV
  9. Penutup

1. Apa Itu OpenCV?

OpenCV (Open Computer Vision) Pustaka computer vision yang open source dan dipakai secara luas di macam-macam sistem operasi dan arsitektur komputer untuk keperluan pengolahan citra.

2. Apa yang Bisa Dilakukan dengan OpenCV?

Tentu saja untuk memrogram suatu sistem yang berhubungan dengan citra. Contohnya sebagai berikut.

  1. Mengakses webcam laptop secara langsung.
  2. Melakukan object tracking via kamera.
  3. Melacak kontur suatu objek 2D.
  4. Membuat perangkat lunak pengolah gambar (semisal Photoshop atau GIMP).
  5. Memberikan efek tertentu pada gambar bitmap.
  6. Pattern recognition.
  7. Face recognition.
  8. Fingerprint recognition.
  9. Optical Character Recognition.

Supaya nyata, berikut ini saya bawakan skrinsot dari situs resmi OpenCV sendiri mengenai pengenalan kontur:

Sumber
Bounding_Rects_Circles_Source_Image
Hasil
Bounding_Rects_Circles_Result

Kedua Gambar diambil dari http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html.

3. Instalasi OpenCV di Linux

3.1 Ubuntu

Ikuti saja panduan resmi dari Ubuntu https://help.ubuntu.com/community/OpenCV dan OpenCV akan diinstal secara otomatis. Lakukan apa yang tertera di situ. Saya pernah melakukan instalasi OpenCV dari repo resmi dan hasilnya tidak memuaskan. Cara terbaik (untuk saat ini) adalah panduan resmi di atas.

3.2 Archlinux

pacman -S opencv opencv-samples

http://morf.lv/modules.php?name=tutorials&lasit=8

3.3 Debian

http://indranilsinharoy.com/2012/11/01/installing-opencv-on-linux/

3.4 Fedora

https://sites.google.com/a/asu.edu/wireless-video-sensor/how-to-1/how-to-install-ffmpeg-opencv-under-fedora

3.5 Mint

http://daily-ravel.blogspot.com/2012/09/installing-opencv-on-linux-mint-maya.html

3.6 Slackware

http://xathrya.web.id/blog/2013/02/07/installing-opencv-with-slackware64-14-0/

3.7 Linux Secara Umum

http://docs.opencv.org/trunk/doc/tutorials/introduction/linux_install/linux_install.html?highlight=install%20opencv

4. Pilihan Editor/IDE untuk Memrogram OpenCV di Linux

Jika Anda terbiasa dengan Microsoft Visual C++ di Windows, mulailah mengenali IDE-IDE lain yang bisa dipakai untuk memrogram dengan OpenCV. Silakan pilih sendiri dari daftar yang sudah saya tulis di https://malsasa.wordpress.com/2014/02/17/aplikasi-editor-pemrograman-di-linux/. Untuk tulisan ini, saya memilih Geany sebagai editor. Geany saya pakai karena sangat mudah dikonfigurasi dan sangat mudah dikontrol.

opencv-geany

5. Cara Mengonfigurasi Build Options Kompiler g++ untuk OpenCV di Geany

Tentu saja ini dilakukan dengan mengikuti panduan g++ build options pada pranala resmi Ubuntu di atas. Perhatikan dulu perintah berikut. Perintah ini berasal dari pranala resmi di atas.

gcc -ggdb `pkg-config --cflags opencv` -o `basename opencvtest.c .c` opencvtest.c `pkg-config --libs opencv`

Jelasnya, jika Anda menggunakan perintah di atas begitu saja dalam IDE Anda, maka Anda harus selalu mengganti nama berkas menjadi opencvtest.c. Tentu saja itu sangat merepotkan. Tak bisakah yang diganti cukup perintah di atas sehingga Anda bisa membuat nama berkas apa pun? Tentu bisa. Perhatikan pola perintah berikut dan masukkan ke dalam Geany (atau IDE yang Anda pakai). Build Options Geany berada di menu Build > Set Build Options.

Untuk Compile (ini perintah kompilasi dengan g++):

g++ -Wall -c "%f"

Untuk Build (ini perintah linking dengan g++ bersama pustaka OpenCV, ini yang terpenting):

g++ "%f" `pkg-config --cflags --libs opencv` -o "%e"

Anda benar. Nama berkas bisa digantikan dengan variabel %f dan %e. Itulah fleksibilitas build options di Geany (dan semua IDE lainnya). Silakan lihat skrinsot berikut untuk kejelasannya.

purge-apache6

6. Contoh-Contoh Kode Sumber Program OpenCV

Berikut ini saya bawakan kode sumber program OpenCV yang sudah saya tes sendiri dengan g++ dan Geany di atas Ubuntu dan bekerja dengan baik. Silakan salin tempel (copy paste) kode-kode berikut ke dalam Geany Anda dan jalankan. Pastikan Anda telah mengonfigurasi semuanya dengan benar.

6.1 Buka Sebuah Gambar Digital


// latihan_opencv_1_bukagambar.cpp
// program pembaca dan penampil gambar bitmap
// program ini akan membaca 1.jpg (harus ada di dalam 1 direktori yang sama dengan program), menyimpan ke dalam memori, lalu menayangkannya dalam jendela ke layar monitor
// kunci program ini ada pada kelas Mat, fungsi imread(), dan fungsi imshow()
// fungsi waitKey() harus diisi argumen 0 agar dia terus memunculkan jendela dan tidak langsung mati sesaat setelah dieksekusi
// program ini ditulis dengan vim pada Friday, June 27, 2014 02:01 AM
// Ade Malsasa Akbar <https://malsasa.wordpress.com>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
Mat variabel_gambar_1;
variabel_gambar_1 = imread("1.jpg");

imshow("TAYANGKAN GAMBAR", variabel_gambar_1);
waitKey(0);
return(0);
}

Hasil

opencv-linux1

6.2. Buka, Olah, Simpan Gambar Digital

// latihan_opencv_2_efek.cpp
// program ini bersumber dari http://docs.opencv.org/doc/tutorials/introduction/load_save_image/load_save_image.html
// program ini disunting dengan vim pada Sunday, June 29, 2014 11:12 AM
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{

 Mat image;
 image = imread("1.jpg");

 Mat gray_image;

 // fungsi cvtColor bertugas mengubah gambar asli (objek image) menjadi objek gray (objek gray_image) dengan argumen CV_BGR2GRAY
 cvtColor( image, gray_image, CV_BGR2GRAY );

 // fungsi imwrite bertugas membuat suatu berkas gambar berdasarkan objek yang sudah diberi efek
 // argumen pertama adalah nama berkas, argumen kedua adalah objek Mat dari sumber yang sudah diberi efek
 imwrite( "gambar_gray.jpg", gray_image );

 // fungsi namedWindow berguna untuk menentukan nama dan ukuran jendela
 namedWindow( "Gambar Asli", CV_WINDOW_AUTOSIZE );
 namedWindow( "Gambar Gray", CV_WINDOW_AUTOSIZE );

 // fungsi imshow berguna untuk menayangkan gambar di dalam jendela
 imshow( "Gambar Asli", image );
 imshow( "Gambar Gray", gray_image );

 // fungsi waitkey harus ada supaya program dapat terus berjalan
 waitKey(0);

 return 0;
}

Hasil

opencv-2
opencv-linux96.3 Akses Webcam Laptop


// latihan_opencv_3_webcam.cpp
// http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=video%20capture#VideoCapture
// kata kunci: opencv video capture
// kata kunci: opencv camera capture
// diunduh pada Friday, June 27, 2014 02:33 AM
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

// namespace untuk cv; karena sebetulnya tidak ada VideoCapture, Mat, imshow(), dan waitKey()
// yang ada adalah cv::VideoCapture, cv::Mat, cv::imshow(), dan cv::waitKey()
// ditulis pada Friday, June 27, 2014 07:42 PM
// untuk memahaminya, bacalah http://www.cplusplus.com/doc/tutorial/namespaces/
using namespace cv;

int main(int, char**)
{
// buka kamera default yakni nomor 0
// ganti nomornya dengan 1 atau 2 jika kamera berada di posisi lain
VideoCapture cap(0);

while(true)
{
// deklarasi objek frame dari kelas Mat
Mat frame;

// objek video dari kamera dipasangkan ke dalam frame
cap >> frame;

// fungsi imshow() menayangkan objek Mat yang sudah berisi objek video kamera
// argumen pertama adalah string untuk judul jendela
// argumen kedua adalah objek Mat
imshow("Kamera", frame);

// fungsi waitKey() (didefinisikan dalam header highgui) dibutuhkan oleh imshow() (yang juga dari highgui)
// tanpa waitKey(), imshow() tidak akan melakukan window event semisal redraw, resize, input event, dan sebagainya
// argumen angka di dalam waitKey menentukan berapa milisekon delay untuk key event yang dibutuhkan oleh imshow()
// panggillah walau hanya untuk 1 milisekon
// singkatnya, ini sepele tetapi wajib ada
// sumber 1: http://stackoverflow.com/questions/12452118/what-does-waitkey-30-mean-in-opencv
// sumber 2: http://docs.opencv.org/modules/highgui/doc/user_interface.html#waitkey
if(waitKey(3) >= 0) break;
}

return 0;
}

Hasil

opencv-linux7

6.4 Operasi Logika (AND, OR, XOR, dan NOT) Terhadap 2 Gambar


// AND OR XOR NOT terhadap 2 gambar
// sumber kode ada 2, yaitu http://opencvexamples.blogspot.com/2013/10/bitwise-and-or-xor-and-not.html
// dan http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html
// karena ia harus bisa menyimpan gambar dahulu baru kemudian mengoperasikannya
// baru kemudian menayangkannya
// kode ini diubah dengan vim pada Friday, June 27, 2014 12:45 AM
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( )
{
// kelas Mat ini berfungsi untuk menampung gambar
Mat variabel_gambar_1; //objek dari kelas Mat akan dipakai sebagai variabel penyimpan gambar
Mat variabel_gambar_2;
Mat variabel_gambar_3;

// proses menyimpan gambar JPG ke dalam variabel Mat
variabel_gambar_1 = imread("1.jpg");
variabel_gambar_2 = imread("2.jpg");

// deklarasi objek-objek (variabel-variabel) Mat untuk menyimpan hasil operasi
Mat simpan_hasil_and;
Mat simpan_hasil_or;
Mat simpan_hasil_xor;
Mat simpan_hasil_not;

// proses operasi AND, OR, XOR, dan NOT untuk dua gambar yang disimpan dalam dua variabel
// hanya proses NOT yang melibatkan satu gambar, karena memang NOT operasi logika untuk satu operand saja
bitwise_and(variabel_gambar_1, variabel_gambar_2, simpan_hasil_and); //dua gambar di-AND
imshow("AND",simpan_hasil_and); //kemudian isi variabel simpan_hasil_and ditayangkan

bitwise_or(variabel_gambar_1, variabel_gambar_2, simpan_hasil_or); //dua gambar di-OR
imshow("OR", simpan_hasil_or);

bitwise_xor(variabel_gambar_1, variabel_gambar_2, simpan_hasil_xor); //dua gambar di-XOR
imshow("XOR", simpan_hasil_xor);

bitwise_not(variabel_gambar_1, simpan_hasil_not); //satu gambar di-NOT
imshow("NOT", simpan_hasil_not);

// catatan:
// bitwise_and() adalah fungsi untuk melakukan AND LOGIC OPERATION terhadap dua gambar
// demikian pula untuk *_or, *_xor, dan *_not

waitKey(0);
return(0);
}

Hasil

opencv-linux6

7. Sumber Referensi Belajar OpenCV

  1. http://docs.opencv.org/index.html (dokumentasi resmi OpenCV)
  2. http://opencvexamples.blogspot.com/ (kumpulan contoh kode OpenCV siap pakai)
  3. http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html (panduan perkenalan OpenCV akademik)
  4. http://dasl.mem.drexel.edu/~noahKuntz/openCVTut1.html (tutorial OpenCV akademik)
  5. http://www.cs.rit.edu/~gsp8334/ (tutorial OpenCV akademik)
  6. http://opencv-srf.blogspot.com/ (blog khusus OpenCV yang berisi banyak contoh + analisis kode program yang berguna)
  7. http://opencv-code.com/ (blog khusus OpenCV)
  8. http://www.shervinemami.info/openCV.html (blog Computer Vision yang memiliki kategori OpenCV)
  9. http://blog.damiles.com/category/tutorials/opencv-tutorials/ (blog lain yang memiliki kategori OpenCV)
  10. http://www.tutorialspoint.com/java_dip/introduction_to_opencv.htm (tutorial OpenCV dengan Java)
  11. http://opencvpython.blogspot.com/ (tutorial OpenCV dengan Python)
  12. http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_tutorials.html (tutorial OpenCV dengan Python)
  13. http://docs.nvidia.com/tegra/Content/OpenCV_Main.html (tutorial OpenCV dari NVIDIA untuk Tegra)
  14. http://opencv.wikispaces.com/ (wiki OpenCV dari komunitas)

8. Tip-Tip Belajar OpenCV

  1. Cari contoh kode, kompilasikan, lihat hasilnya.
  2. Analisis baris-baris penting di dalam kode yang diperoleh dengan memberinya komentar.
  3. Ubah kode sedikit demi sedikit, lihat hasilnya.
  4. Menulislah tentang OpenCV di blog Anda sendiri.

9. Penutup

Tulisan ini mulai dibuat draft-nya pada 3 April 2014 dan diselesaikan pada 29 Juni 2014. Tulisan ini lebih dulu direncanakan untuk ditulis daripada tulisan mengenai OpenGL. Tulisan ini tidak ditutup kemungkinannya untuk direvisi. Semoga tulisan ini bermanfaat.

7 thoughts on “Pengantar Pemrograman OpenCV C++ di Linux

    1. Ade Malsasa Akbar Penulis Tulisan

      Tidak juga, Kang. Asal kita berani memulainya, saya yakin kita bisa menulis tulisan yang terbaik. Lakukan saja sebaik mungkin. Urusan nanti ada orang lain yang lebih baik, itu sudah sebuah kepastian. Akang juga tetaplah berkarya.

      Balas
  1. ridwanbejo

    Saya sendiri baru sebatas mencoba source code dari Buku dan memodifikasinya :D, dan yang PyCV pun sudah mencoba. Hanya saja tidak pernah ditulis. Mungkin nanti akan saya tulis, dengan implementasi yang lebih nyata.

    Balas
  2. Ping balik: Instalasi OpenCV 2.3.1a dan ffmpeg 0.8.15 di Ubuntu 12.04 dengan Kompilasi Manual | RESTAVA

Dilarang menggunakan 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