#JuliNgeblog Der zweite Tag : Delegate Mouse Event Signal on QLabel

Selamat datang kembali!

Tulisan hari kedua sudah mulai masuk ke topik yang teknis. Persoalannya adalah ketika mau menangkap sinyal tetikus (press, release, move) untuk menggambar. Ketika menggunakan delphi dulu, prosedur untuk menangani event tetikus bisa dibuat terpisah dari komponen yang menjadi tempat terjadinya event. Misalnya, ketika ada event mouse di atas komponen Image, maka prosedur penanganannya bisa dibuat sebagai method dari objek Form. Salah satu contoh skenarionya adalah ketika terjadi sesuatu di komponen ini, maka akan disimpan perintah menggambar dan proses penggambaran di komponen yang bisa menggambar bisa didekorasi dengan penunjuk objek apa yang akan digambar tanpa mengganggu kondisi yang sudah ada (misal. rubberband).

dip

Masalah muncul ketika mau menerapkan cara serupa pada konteks Qt di python (PyQt atau PySide). Pada konteks ini, kelas yang memiliki buffer untuk menggambar ada di QImage. Agar gambar di objek ini dapat ditampilkan, Objek QImage perlu dipasang di Objek QLabel. Penanganan event mouse dilakukan di QLabel. Pendekatan untuk menangani proses semacam ini adalah dengan membuat kelas turunan QLabel atau QWidget untuk kebutuhan yang berbeda yang tentu saja merepotkan. Saya perlu satu komponen kecil yang bisa dipakai untuk beberapa konteks penggambaran yang berbeda tapi memiliki mekanisme yang sama (prosedur penanganan ada di objek lain).

Setelah membaca manual, ternyata membuat sinyal event cukup mudah:

  1. deklarasikan objek sinyal internal
  2. lempar sinyal sesuai dengan keadaan yang diinginkan (dalam hal ini, setiap terjadi mouse event)

Penjelasan lebih lanjut dapat dilihat di kode berikut :

class QMLabel(QtGui.QLabel):
	mousePressed = QtCore.Signal(QtGui.QMouseEvent)
	mouseMove = QtCore.Signal(QtGui.QMouseEvent)
	mouseReleased = QtCore.Signal(QtGui.QMouseEvent)

	def __init__(self, parent):
		super(QMLabel, self).__init__(parent)
		self.setMouseTracking(True)

	def mousePressEvent(self, event):
		self.mousePressed.emit(event)
		super(QMLabel, self).mousePressEvent(event)

	def mouseMoveEvent(self, event):
		self.mouseMove.emit(event)
		super(QMLabel, self).mouseMoveEvent(event)

	def mouseReleaseEvent(self, event):
		self.mouseReleased.emit(event)
		super(QMLabel, self).mouseReleaseEvent(event)

Di kode tersebut, saya membuat tiga event yang akan dilempar (didelegasikan). Pada setiap kode penangan event, saya lempar sinyal internal (prosedur emit).

Cara menggunakan kelas ini sama seperti ketika menggunakan komponen lain. rinciannya bisa dilihat di kode berikut :

class PickWidget(QtGui.QWidget):
	postAction = QtCore.Signal()
	def __init__(self, parent):
		super(PickWidget, self).__init__(parent)

		#offline buffer
		self.trackimage = QtGui.QImage(660, height, QtGui.QImage.Format_RGB32)

		self.tracklabel = QMLabel(self)
		self.tracklabel.setPixmap(QtGui.QPixmap.fromImage(self.trackimage))
		self.tracklabel.adjustSize()

		self.tracklabel.mousePressed.connect(self.mousepress)
		self.tracklabel.mouseReleased.connect(self.mouserelease)
		self.tracklabel.mouseMove.connect(self.mousemove)

	def mousepress(self, event):
		pass

	def mouserelease(self, event):
		pass

	def mousemove(self, event):
		pass

Sekian dulu catatan kali ini. Mudah-mudahan bermanfaat bagi saya sendiri kalau sewaktu-waktu lupa atau untuk anda kalau bertemu dengan persoalan yang sama.

Wassalam,

Iklan

dua angka terakhir pemangkatan bilangan bulat

Berawal dari status kawan di facebook tentang tantangan kecil di hackerrank 2 minggu yang lalu. Akhirnya saya ikutan mencoba membuat program sederhana dengan python. Sebetulnya hanya iseng saja di sela-sela menulis.

Persoalannya adalah diberikan dua buah angka yaitu K dan N.  Hal yang ditanyakan adalah 2 angka terakhir dari deret S = 1^N + 2^N + … + K^N
Read More

Simple Entity Extraction from News Article in Bahasa Indonesia

Tulisan kali ini membahas cara mengekstrak informasi dari teks berita menggunakan python. Entitas yang dimaksud adalah entitas berupa tempat, orang, organisasi atau entitas lain yang diketahui dalam basis pengetahuan. Basis pengetahuan yang dipakai dalam tulisan ini adalah dbpedia bahasa Indonesia. Sebetulnya DBPedia sudah menyediakan layanan semacam ini yaitu Spotlight namun sayangnya belum tersedia dalam bahasa Indonesia.
Read More

Histogram of Oriented Gradient in Numpy

Di tulisan terdahulu saya pernah mencoba menulis tentang menghitung fitur HOG lalu tulisan tentang mempercepat perhitungan hog dengan menggunakan inlince c++ dari scipy. Tulisan kali ini sebetulnya hampir sama dengan tulisan terdahulu, yaitu menghitung fitur yang sama, yang berbeda adalah tulisan yang dulu dibuat dengan menggunakan interface opencv versi 1 (import cv) sedangkan tulisan kali ini dibuat menggunakan interface versi kedua (cv2). Pada opencv versi pertama, objek citra disimpan menggunakan struktur berbasis C (IplImage) sedangkan di versi 2, objek citra sudah terintegrasi dengan Numpy array (ndarray) dan opencv versi 2 sudah ditulis ulang dengan menggunakan C++. Dengan terintegrasinya struktur penyimpanan citra menjadi array numpy, maka operasi2 pengolahan citra jadi seperti yang dilakukan dengan MATLAB. operasi-operasi tertentu juga menjadi makin mudah melalui operasi array slicing yang ada pada Numpy. Oleh sebab itu, saya coba membuat algoritma penghitungan fitur HOG yang mengeksploitasi fasiltas yang ada di Numpy yang lebih cepat karena menghindari loop yang eksplisit dilakukan pada kode python tetapi mendelegasikan operasi yang bersifat element-wise ke numpy.

modul yang diimpor
kalau di versi opencv pertama modul yang digunakan adalah cv, maka sekarang adalah cv2. modul cv masih dapat diakses untuk menjaga kompatibilitas ke versi sebelumnya menjadi submodul di dalam cv2.

# jika ingin menggunakan antarmuka opencv versi 1
import cv2.cv as cv 
# interface opencv versi 2
import numpy as np
import cv2

Menghitung HOG secara umum
fitur HOG yang dibahas pada tulisan ini adalah varian penyederhanaan dari varian-varian utama yang digunakan saat ini :

  • varian HOG Dalal-Triggs untuk pedestrian detection
  • varian HOG Felzenswalb untuk deformable part model di PASCAL VOC (Visual Object Categories/Classes) Challenge

Read More

Google Summer of Code 2013: Hello world!

Hello world! This is my first post about GSoC. I usually write post to this blog using Indonesian language so people who are from Indonesia can easily understand and also to contribute to probably technical corpora which is written in Indonesian. For the next posts that will be using gsoc2013 tag also will be written in English.

Now, a little bit of background won’t hurt.
This is my first experience in Google Summer of Code, applying and being accepted. My last status as student was 2010 which is almost three years ago. Now that I am back as student, I am eligible to apply as participant. Yay!

The project I am working on is under the organization of Computational Science and Engineering of Vienna University of Technology. Altough I am also a student in TU Wien, The Mentors are from different institute. My Mentors are from Department of Geodesy and Geoinformation. The project itself is implementing transformation algorithm for vertical datums. For me, this is something that is quite new. I did projects using spatial data before, but the inner working of the knowledge behind that was actually done by another person which background is geodesy. Well, the availability of libraries like PROJ.4, GDAL/OGR really helped me a lot back then. That’s why I thought this might be the way I can contribute back.
Read More

Converting XML Schema to OWL in Python

Beberapa minggu terakhir saya dapat mainan baru setelah bermain-main dengan scraping (ini bukannya serius belajar malah main-main terus). Persoalannya adalah mengonversi skema data dari bentuk XML Schema ke Ontologi (dalam OWL). XML Schema adalah dokumen XML yang berisi spesifikasi komposisi sebuah dokumen XML.

XML Schema
Pada dasarnya dokumen XML Schema berisi tag-tag “element” yang mengacu pada tag di dokumen yang dispesifikasikan. Untuk mempermudah spesifikasi, jenis dari element ini dibagi menjadi dua tipe yaitu simpleType dan complexType. simpleType adalah tag yang hanya berisi data (numerik/string) sedangkan complexType adalah tipe tag yang memiliki paling tidak atribut tag atau child tag (tag di dalam tag). Komposisi tag di dalam tag dapat berupa komposisi sederhana seperti simpleType tapi memiliki atribut, hanya berisi tag, atau berisi campuran antara teks dengan tag (seperti pada tag body dalam HTML). simpleType dan complexType dapat dideklarasikan tersendiri dan diberi nama. Untuk alasan reusability, maka type dibuat memiliki sifat inheritance dan polymorphism. yaitu suatu tipe dapat dideklarasikan sebagai turunan dari tipe lain yang lalu dispesialisasi/dibatasi atau diperluas.

Web Ontology Language (OWL)
Ontologi merupakan deskripsi formal pengetahuan tentang konsep2 dan hubungan antar konsep. Pada kasus pendefinisian skema basis data, hal yang biasanya dilakukan adalah membuat representasi konseptual (conceptual data model) dari pengetahuan yang dimiliki oleh pengembang sistem. Adanya formalisasi pengetahuan dalam bentuk ontologi bertujuan agar mesin juga dapat ‘mengerti’ sehingga proses integrasi data dapat berlangsung secara otomatis.

Sekian dulu bahasan abstraknya, selanjutnya adalah bagaimana menyelesaikan persoaln konversi XML Schema ke OWL. Sayangnya saya tidak menemukan ada tool konversi yang ditulis dalam python sehingga saya membuat dari awal. Saya menggunakan dua pustaka pembantu yaitu lxml untuk mengurai data dari dokumen XML dan RDFLib untuk membangkitkan ontologi. Sayangnya RDFLib belum memiliki serializer untuk OWL sehingga saya tidak bisa menggunakan format OWL (XML) sebagai keluaran dan sebagai gantinya saya menggunakan format Turtle yang sepertinya juga lebih mudah dibaca oleh manusia.

Sebetulnya makalah yang berisi cara melakukan konversi ini lumayan banyak jadi saya pakai yang paling banyak dikutip dan posisi teratas dari pencarian di google scholar saja:

Bohring, Hannes, and Sören Auer. “Mapping xml to owl ontologies.” Leipziger Informatik-Tage 72 (2005): 147-156.

Read More

Web scraping dengan Python : cuaca kota Wina

Ketika saya masih di Indonesia, Saya jarang sekali memeriksa temperatur udara. Setelah sampai Wina jadi sering memeriksa temperatur karena penasaran dengan temperatur yang terukur di cuaca musim semi tetapi terasa masih dingin dan masih bersalju. Kebetulan akhir-akhir ini sedang sering bermain dengan scraping (ekstraksi data dari dokumen web), akhirnya pada suatu malam sebelum tidur saya iseng membuat skrip untuk mendapat cuaca saat ini di kota Wina.

Saya menggunakan library beautifulsoup untuk mengurai isi dokumen HTML yang kemudian bisa diekstrak bagian tertentu (dalam hal ini adalah elemen DIV yang mencakup data temperatur). Elemen ini diketahui dari mengaktifkan panel “Inspect Element” di peramban Google Chrome (atau bisa juga dengan menampilkan kode sumber dari halaman aktif di peramban lain).

from urllib2 import urlopen
from BeautifulSoup import BeautifulSoup as BS

temps = [float(tag.string.replace(u"\xb0", '')) for tag in BS(urlopen("http://www.wetter.at/wetter/oesterreich/wien").read()).findAll("div", {"class": "temp"})]
if len(temps)>0: print "%0.2f C" % (sum(temps)/len(temps))

Data temperatur yang diberikan halaman tersebut merupakan data pengukuran temperatur di beberapa distrik kota. Karena saya hanya perlu tahu satu data saja sebagai gambaran umum temperatur kota maka saya menghitung rata-rata dari data tersebut.

Oya, tulisan ini juga sekalian untuk mencoba aggregator blog dari komunitas Python Indonesia. tampil tidak yaa..? tampil tidak yaa…?