Demo, sichqoncha hodisalari (events) | OpenCV
Amaliy
Bugun biz sizlar bilan OpenCV bo`yicha maqolalarimizning uchinchi qismini ko`rib chiqamiz. Bunda siz quyidagilarni o`rganasiz:
- Mouse-eventni OpenCVda ishlashini o`rganiz.
- cv2.setMouseCallback() funksiyasi bilan tanishish.
Dastlab sodda bir dastur yozamiz, bu dasturimiz sichqonchani bir yoki ikki marta bosganimizda bizga aylana chizib berishi kerak bo`ladi.
Buning uchun birinchi navbatda OpenCV da sichqoncha bosilganda qandavy hodisalar (eventlar)- ya`ni sichqonchadan biror tugma bosilganda chaqiriladigan funksiyalar bor ekanini ko`rib chiqaylik:
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
Bizga quyidagi eventlar chiqarildi:
[‘EVENT_FLAG_ALTKEY’,‘EVENT_FLAG_CTRLKEY’, ‘EVENT_FLAG_LBUTTON’, ‘EVENT_FLAG_MBUTTON’, ‘EVENT_FLAG_RBUTTON’, ‘EVENT_FLAG_SHIFTKEY’, ‘EVENT_LBUTTONDBLCLK’, ‘EVENT_LBUTTONDOWN’, ‘EVENT_LBUTTONUP’, ‘EVENT_MBUTTONDBLCLK’, ‘EVENT_MBUTTONDOWN’, ‘EVENT_MBUTTONUP’, ‘EVENT_MOUSEHWHEEL’, ‘EVENT_MOUSEMOVE’, ‘EVENT_MOUSEWHEEL’, ‘EVENT_RBUTTONDBLCLK’, ‘EVENT_RBUTTONDOWN’, ‘EVENT_RBUTTONUP’]
Bunday eventlar chaqirilganda bizga o`sha nuqtani, ya`ni sichqoncha kursori joylashgan nuqtani kordinatasini olishimiz mumkin bo`ladi. Bu ma`lumotlardan foydalanib quyidagi dasturni yozamiz:
Agar sichqoncha chap-tugmasi ikki marotaba bosilsa, ekranga ko`k rangdagi aylana chiziladi, ya`ni aylana ichi ko`k rang bilan to`ldiriladi
Bunda bir aylana_chizish
deb nomlangan funksiya yozib olamiz va bu funksiyamizni ichida bir shart operatori orqali sichqonchani chap tugmasini ikki bosilishi hodisasini kuzatamiz, agarda chap tugmasachasi ikki marotaba bosilsa. Keyin ekranga ko`k rang bilan to`ldirilgan aylana chizamiz.
import numpy as np
import cv2def aylana_chizish(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK: # 2 marotaba bosilsa...
cv2.circle(img, (x, y), 100, (255, 0, 0), -1)# 512x512 o'lchamadi qora oynani hosil qilamiz
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('Image')
cv2.setMouseCallback('Image', aylana_chizish)
while True:
cv2.imshow('Image', img)
if cv2.waitKey(1) & 0xFF == ord('q'): # 'q' - dasturni yakunlash
break
cv2.destroyAllWindows()

Yuqoridagi dasturni yaxshilab o`rganib chiqdingiz deb umid qilaman. Endi sizlar bilan biroz murakkabroq bo`lgan boshqa interaktiv dasturni yozib chiqamiz. Bu dasturda bir nechta sichqoncha hodisalari (mouse events)ni bir vaqtda foydalanib turli ishlarni amalga oshiramiz.
Dasturimizni ikki xil rejimda(mode): aylana chizish va to`rtburchak chizish rejimlaridan iborat bo`ladi. Shuning uchun bizni callback funksiyamiz ham 2 qismdan iborat bo`ladi: aylana va to`rtburchak.
import numpy as np
import cv2
drawing = False
mode = True # rejim, o'zgartirish uchun: 'm'
ix, iy = -1, -1
def function(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN: # sichqonchani chap tugmasi
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
if mode:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
Yuqoridagi biz ishlatmoqchi bo`lgan funksiyamizning umumiy ko`rinishi. Endi biz bu funksiyaga murojat etamiz va chizmani ekranga chiqaramiz.
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('Image')
cv2.setMouseCallback('Image', function)
while True:
cv2.imshow('Image', img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 'q':
break
cv2.destroyAllWindows()
Yuqoridagi dasturning natijasi quyidagicha bo`lib ekranga chiqariladi:

Mana ko`rib turganingizdek bizga dastur orqali yuqoridagi tasvirni hosil qildik. Bu maqolamiz amaliy bo`lgani bois barchasini kichik detallarigacha tushintirmadik. Lekin bu maqoldan eslab qolishimiz kerak bo`lgan asosiy narsa .setMouseCallback
funksiyasidir. Bu funksiyaga parameter sifatida biz boshqa funksiyani beramiz va u bizga biz parameter sifatida bergan oyna ustida turli amallar bajarib o`zgartiradi.
cv2.setMouseCallback('Image', function)
Bu maqolamizda ko`rsatmoqchi bo`lganlarimiz shulardan iborat edi xolos. O`ylaymanki siz ham bu dasturlarni o`ziz ishlatib ko`rasiz. Agarda bu narsalarni yodda saqlab qolish qiyin bo`lsa, xavotir olmang. Muhimi, shunday funksiya mavjud ekanini eslab qolsangiz kifoya.
Bizni ijtimoiy tarmoqlarda kuzating: github.com, youtube.com, facebook.com