Mendapatkan Nilai Pixel berdasarkan Event Click Mouse
Mendapatkan Nilai Pixel berdasarkan Event Click Mouse – Mengetahui nilai pixel pada sebuah gambar bisa kita lakukan secara mudah menggunakan OpenCV. Salah satunya menggunakan passing perintah setMouseCallback(). Cara kerja event click mouse OpenCV akan memanggil perintah function berdasarkan argument pada setMouseCallback(). Pada artikel ini kita akan bahas 3 topik utama yaitu nilai pixel-koordinatnya, operasi croping, serta perbaikan skew atau deskewing gambar.
Mendapatkan Nilai Pixel berdasarkan Event Click Mouse yang kita akan buat nanti berisikan informasi koordinat mouse serta nilai pixel itu sendiri menggunakan format BGR. Untuk membedakannya tersebut, kita akan atur ketika user klik kiri mouse cv2.EVENT_LBUTTONDOWN berisi lokasi x,y mouse, sedangkan klik kanan mouse cv2.EVENT_RBUTTONDOWN berisi nilai pixel BGR.
Beberapa jenis event mouse yang ada di OpenCV beserta flagnya
- cv2.EVENT_MOUSEMOVE = 0,
- cv2.EVENT_LBUTTONDOWN = 1,
- cv2.EVENT_RBUTTONDOWN = 2,
- cv2.EVENT_MBUTTONDOWN = 3,
- cv2.EVENT_LBUTTONUP = 4,
- cv2.EVENT_RBUTTONUP = 5,
- cv2.EVENT_MBUTTONUP = 6,
- cv2.EVENT_LBUTTONDBLCLK = 7,
- cv2.EVENT_RBUTTONDBLCLK = 8,
- cv2.EVENT_MBUTTONDBLCLK = 9,
- cv2.EVENT_MOUSEWHEEL = 10,
- cv2.EVENT_MOUSEHWHEEL = 11
Event yang lain bisa kalian pelajari di https://docs.opencv.org/3.4/d0/d90/group__highgui__window__flags.html
Nilai Pixel dan Koordinat
Mendapatkan Nilai Pixel berdasarkan Event Click Mouse tentunya membutuhkan library OpenCV sehingga kalian install terlebih dahulu package tersebut. Perhatikan kode berikut click_event, dimana variable img merupakan variabel global.
import cv2 def click_event(event, x, y, flags, params): font = cv2.FONT_HERSHEY_SIMPLEX if event == cv2.EVENT_LBUTTONDOWN: print(x, ' ', y) cv2.putText(img, 'x:'+str(x) + ',' + 'y:'+str(y), (x,y), font, 1, (255, 0, 0), 2) cv2.imshow('image', img) if event==cv2.EVENT_RBUTTONDOWN: b = img[y, x, 0] g = img[y, x, 1] r = img[y, x, 2] cv2.putText(img, 'b,g,r:'+str(b) + ',' + str(g) + ',' + str(r), (x,y), font, 1, (255, 255, 0), 2) cv2.imshow('image', img)
Berikut kita akan membaca gambar dari sebuah file sekaligus mendaftarkan event_click cv2.setMouseCallback('image', click_event)
. Kode lengkap untuk memanggil click_event mouse sebagai berikut
if __name__=="__main__": # membaca gambar img = cv2.imread('D:/matang.png', 1) # display gambar cv2.imshow('image', img) # daftarkan event mouse cv2.setMouseCallback('image', click_event) cv2.waitKey(0) cv2.destroyAllWindows()
Berikut hasil dari Mendapatkan Nilai Pixel berdasarkan Event Click Mouse. Ketika user melakukan klik kiri maka koordinasi akan tertulis gambar begitu juga untuk klik kanan akan berisikan informasi nilai pixel BGR nya.
Koordinat Pixel untuk Croping
Kode diatas, bisa kita kembangkan untuk melakukan croping sehingga butuh variable counter dan point yang bersifat global untuk menyimpan lokasi mouse serta menghitung jumlah click. Setiap click mouse dilakukan akan di append terhadap sebuah variabel bernama point sehingga ketika jumlah click sebanyak 2 kali, maka akan langsung coping area. Oiya kita juga butuh library numpy untuk menyimpan array. Tampilannya sebagai berikut
Kita akan sedikit untuk mengubah kodenya, agar lebih baik yaitu membutuhkan keypres misalkan q untuk exit dan r untuk restart looping sehingga rectangle akan terhapu secara otomatis. Berikut kode yang digunakan
import cv2 import numpy as np point_matrix = np.zeros((2,2),np.int) counter = 0 def click_event(event, x, y, flags, params): global counter font = cv2.FONT_HERSHEY_SIMPLEX if event==cv2.EVENT_RBUTTONDOWN: pass if event == cv2.EVENT_LBUTTONDOWN: print(x, ' ', y) cv2.imshow('image', img) point_matrix[counter] = x,y cv2.circle(img, (x,y), radius=5, color=(0, 255,0), thickness=5) counter = counter + 1 if counter == 2: counter = 0 starting_x = point_matrix[0][0] starting_y = point_matrix[0][1] ending_x = point_matrix[1][0] ending_y = point_matrix[1][1] cv2.rectangle(img, (starting_x, starting_y), (ending_x, ending_y), (0, 255, 0), 3) cv2.imshow('image', img) img_cropped = clone[starting_y:ending_y, starting_x:ending_x] cv2.imshow("ROI", img_cropped) # driver function if __name__=="__main__": # membaca gambar img = cv2.imread('D:/matang.png', 1) clone = img.copy() cv2.namedWindow("image") cv2.setMouseCallback('image', click_event) while True: # display gambar cv2.imshow('image', img) key = cv2.waitKey(1) & 0xFF if key == ord("q"): break if key== ord("r"): img = clone.copy() cv2.destroyAllWindows()
Memperbaiki Deskewing
Apakah kalian sering menggunakan aplikasi android untuk melakukan scan dokument? tentu kalian tidak asing dengan fitur auto deskewing, itu lho ketika miring-miring tidak sejajar ambil foto untuk menghindari bayangan kamera. Bahkan aplikasi akan tahu kalau kalian ambilnya malah terbalik!
Sebenarnya fitur ini ada kok di OpenCV yaitu
matrix = cv2.getPerspectiveTransform(pts1,pts2) result = cv2.warpPerspective(img, matrix, (512,512)
Menurut perintah diatas, kita butuh point1 dan point2, dimana point 1 sebagai skew dan point 2 sebagai deskewing nya.
Perhatikan gambar berikut yang sudah didapatkan informasi mengenai cornernya
Kita akan ubah menjadi berikut
Wow sangat menarik bukan? Tentu untuk mendapatkan corner dari object kudu otomatis kalau bisa, nah kalian bisa menggunakan teknik Corner Detection (Shi-Tomasi) yang sudah diimplementasikan di OpenCV dengan perintah cv2.goodFeaturesToTrack()
. Kalian bisa baca corner detection
Nah gimana menurut kalian? OpenCV adalah library Computer Vision yang paling banyak fitur nya serta banyak sekali implementasi dalam beragam bahasa seperti Java, Android, Python. Bila kalian ingin belajar fundamental OpenCV bisa ikuti terus artikel yang saya buat disini
Kalian ingin mendapatkan kode lengkapnya?