Demo, sichqoncha hodisalari (events) | OpenCV

Yakhyokhuja Valikhujaev
3 min readApr 24, 2021

Amaliy

Bugun biz sizlar bilan OpenCV bo`yicha maqolalarimizning uchinchi qismini ko`rib chiqamiz. Bunda siz quyidagilarni o`rganasiz:

  1. Mouse-eventni OpenCVda ishlashini o`rganiz.
  2. 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 cv2
def 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()
Dastur chiqaradigan natija.

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

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response