Porting CanvasFrame ke JFrame

Permasalahan

Dalam tulisan sebelumnya kita tahu bahwa JavaCV menggunakan kelas CanvasFrame sebagai tempat untuk menampilkan gambar yang telah ditangkap oleh webcam. Problemnya adalah CanvasFrame merupakan turunan dari JFrame, sehingga kita tidak bisa membuat interface yang cantik dengan menggunakan fasilitas GUI editor Netbeans karena menurut aturannya, suatu JFrame tidak dapat diinisialisasikan kedalam JFrame. Perlu dilakukan rekayasa tambahan yang akan dijelaskan di tulisan kali ini.

CanvasFrame extends JFrame

Misalnya kita ingin membuat interface untuk kontrol webcam dengan tombol “Start” untuk memulai capturing image dari webcam dan “Stop” untuk menghentikannya.

Interface yang ingin dihasilkan

Solusi

Langkah yang dilakukan

  1. Konstruksi kelas Canvas, dengan prosedur paintComponent
  2. Membuat Thread untuk mengendalikan proses keluaran gambar webcam

Kuncinya adalah merubah kelas CanvasFrame menjadi kelas Canvas. Kemudian kelas Canvas tersebut dapat disisipkan kedalam JFrame yang menjadi container interface yang akan dibuat.

</pre>
//Class Canvas yang akan dipergunakan untuk menampilkan gambar webcam

private class Canvas extends JComponent {
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image.asIplImage().getBufferedImage(), 0, 0, rootPane);  //menampilkan gambar yang ditangkap webcam ke Canvas
}
}
}

//Thread untuk mengendalikan proses menampilkan gambar webcam

private class Grabby extends SwingWorker<Void, Void> {
protected Void doInBackground() throws Exception {
// Konstruksi webcam
try {
grabber = FrameGrabber.createDefault(0); //koneksi dengan webcam
grabber.start(); //mulai mengambil gambar
}
catch (Exception e) {
try {
if (grabber != null) grabber.release(); //kasus kosong, jika terjadi unexpected error, release grabber terlebih dahulu
grabber = new OpenCVFrameGrabber(0); //koneksi dengan webcam
grabber.start(); //mulai mengambil gambar
}
catch (Exception e2) {
}
}
while (!isCancelled()) {
image = grabber.grab().asCvMat(); //konversi ke bentuk CvMat
canvas.repaint(); //memanggil method repaint (paintComponent yang telah dibuat di kelas Canvas sebelumnya)
Thread.sleep(100); //Frame delay
}
//Destruktor
grabber.stop(); //stop ambil gambar
grabber.release(); //dekonstruksi
grabber = null;
return null;
}
}
<pre>

Hasil

Hasilnya

Tinggalkan Balasan

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