×

Mendapatkan Nilai Pixel berdasarkan Event Click Mouse

Mendapatkan Nilai Pixel berdasarkan Event Click Mouse

1,192 Views

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.

See also  Belajar OpenCV bagian 1 - Setting OpenCV di Java

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.

See also  Konversi Warna dengan Matlab

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?

You May Have Missed