Skip navigation

Gyakorló feladatok

Egyszerű rajzolóprogram

Készítsünk egyszerű rajzolóprogramot!

  • A program indításakor hozzunk létre egy 480 sorból és 640 oszlopból álló BGR színes képmátrixot, np.uint8 típussal.
  • A képet töltsük fel fehér színnel ([255, 255, 255] BGR érték) és jelenítsük meg.
  • A program kezelje az egéreseményeket az OpenCV lehetőségeit használva.
  • Egy globális változóban tároljuk, hogy a bal egérgomb lenyomásra vagy felengedésre került legutóbb. A program indulásakor feltételezzük, hogy nincs lenyomva.
  • Az egér mozgás eseménykor, amennyiben az egér bal gombja lenyomott állapotban van (az előző pontban tárgyalt globális változó lenyomott állapotot jelez), akkor az egér pozícióba rajzoljunk ki egy adott sugarú és színű, kitöltött kört. (Ne felejtsük el újra megjeleníteni a képet a rajzolás után!)
  • A kör aktuális sugarát szintén globális változóban tároljuk, alapértéke legyen 10. A színt szintén, az legyen vörös [0, 0, 255].
  • A + és a - billentyűk lenyomására növeljük, illetve csökkentsük a rajzolandó kör sugarát 5 egységgel! A sugár értéke maradjon az [5, 100] tartományban.
  • Az r, g, b, k, w billentyűk lenyomásával állítsuk a rajzolószínt vörösre ([0, 0, 255]), zöldre ([0, 255, 0]), kékre ([255, 0, 0]), feketére ([0, 0, 0]), illetve fehérre ([255, 255, 255]).
  • t billentyű lenyomására töltsük fel a teljes képet fehér színnel (törlés).
  • Az s billentyű lenyomására rögzített nevű fájlba mentsük el az aktuális képmátrixot, PNG formátumban.
  • A q vagy az ESC billentyű lenyomásával léphessünk ki a programból.

Készítsünk saját rajzot a programmal és mentsük el PNG fájlba!

A rajzolóprogram bővítése

Az előző rajzolóprogramunk működik, de használata nem kényelmes. Nem látjuk, hogy a bal egérgomb lenyomásával milyen színű és méretű elem rajzolódik ki. Bővítsük úgy a programot, hogy az egér mozgatásakot lássuk, milyen elem jelenne meg!

Ötlet: Legyen két képmátrixunk. Egy, amely az érvényes rajzolásokat tartalmazza, és egy másik, amire pluszban ideiglenesen rárajzoljuk azt az elemet is, ami kattintással megjelenne. Arra kell figyelni, hogy egy következő ideiglenes elem rajzolását az érvényes rajzolást tartalmazóra kell elhelyezni. Megjeleníteni az ideiglenest kell. Figyeljünk arra is, hogy mentéskor melyik képmátrixot használjuk!

További lehetséges rajzolási funkciók

A rajzolóprogramunkat további funkciókkal bővthetjük. Néhány ötlet:

  • Ne üres fehér képből induljunk, hanem fájlból töltsünk be egyet. A t billentyűvel ekkor az eredeti képet állítsuk vissza.
  • Rajzolásra választhassunk más geometriát is a kör helyett.

Szálkereszt rajzolás

Rajzoljunk célkeresztet az egér ablakterületen való követéséhez! Színes kép esetén a vonal színe legyen sárga, szürkeárnyalatos kép esetén 192 intenzitású szürke!

Ötlet: Mentsük el a bementi kép másolatát, és minden újrarajzoláskor annak másolatára rajzoljunk!

  

Keret rajzolás

Rajzoljunk a képmátrixba képkeretet! Megadható legyen a keret mérete és színe/intenzitása! Kétféle megoldás is szóba jöhet:

  • Az eredeti kép szélső sorai és oszlopai felülíródnak a keret mérete szerint.
  • A megadott keretmérettel bővített új képmátrixot hozunk létre.

Eredmény az OpenCV-logo.png képre 15 méretű kerettel, [0, 192, 192] sárgásbarna színnel:

Képbe rajzolt keret Kép köré rajzolt keret

A megoldás kerete lehet az alábbi:

import cv2
import numpy as np

border = 15
bgcolor = [0, 192, 192]



def draw_inner_border(im_in, b, c):
# Készítsünk másolatot a bemeneti im_in képmátrixról
# A másolat szélső b darab sorát és oszlopát töltsük fel c színnel
# Adjuk vissza eredményként


def draw_outer_border(im_in, b, c):
# Hozzunk létre új üres képmátrixot, amely mérete 2 * b sorral és oszloppal nagyobb, mint a bemeneti
# Másoljuk be ennek a képnek a közepére a bementi im_in képet
# Hívjuk meg a belső keret rajzoló függvényt és adjuk vissza az eredményét


im = cv2.imread('OpenCV-Logo.png', cv2.IMREAD_COLOR)
cv2.imshow('im', im)

imbi = draw_inner_border(im, border, bgcolor)
cv2.imshow('imbi', imbi)

imbo = draw_outer_border(im, border, bgcolor)
cv2.imshow('imbo', imbo)

cv2.waitKey(0)
cv2.destroyAllWindows()

Automatikus képkivágás

Képenyőképek készítésekor gyakori probléma, hogy nagy és egyenetlen méretű, de egyforma színű/intenzitású keret jelenik meg. A feladat az, hogy ilyen képek esetén határozzuk meg a kerettől eltérő színű/intenzitású terület befoglaló téglalapját, és ennek a tartalmát másoljuk át egy olyan képmátrix közepére, ahol az átalunk megadott méretű keret áll elő!

  • A körülvevő szín/intenzitás a képmátrix bal felső sarkában szereplő elem legyen.
  • Meg lehessen adni paraméterként, hogy az eredmény képen mekkora keret vegye körül a lényegi részt.
  • Figyeljünk arra, hogy ha nincs elegendő méretű keret a képen, akkor növelni szükséges a képmátrix méretét!

A megoldás a korábbi, keret rajzoló feladattal is kombinálható: 0 méretű keretre vágás után adjunk hozzá megadott méretű és színű keretet.

Ötlet: A Numpy argwhere() függvényével lekérhetjük, melyek azok a koordináták, ahol a függvénynek paraméterként átadott feltétel teljesül (a képmátrix képpont értéke nem egyenlő a háttérszínnel). Az eredmény koordináták minimum és maximum x és y koordinátáit kell meghatározni, és azt kivágni a kiindulási képmátrixból. Ha szükséges, ehhez adhatunk külső keretet a háttér színével.

Az alábbi táblázatban láthatunk példát a 03_pr_formula.png bemeneti képre, és az azon elvégzett két eredményre.

Eredeti kép, egyenetlen méretű margókkal Kivágott belső rész, margó nélkül Kivágott belső rész + 5 képpontos keret

További tesztképek a példatárban:

  • 03_pr_table.png
  • 03_pr_fig.png