TI/Programowanie dla Fizyków Medycznych:Zadania openCV
Spis treści
Instalacja Open CV
Dla potrzeb tego zadania każdy powinien stworzyć własne Virtual Enviorment (wirtualne środowisko).
Otwórz terminal. Wejdź do katalogu _work_ (jest w nim dużo miejsca, którego brakuje w Twoim katalogu domowym).
- cd _work_
Wpisz komendy:
- virtualenv -p python3 ve
- source ve/bin/activate
(po tej komendzie powinno sie pojawic ve na poczatku)
- pip install --upgrade pip
- pip install opencv-python
Komendę source ve/bin/activate trzeba będzie wywołać za każdym razem, kiedy będziemy zaczynać pracę w tym wirtualnym środowisku. Wychodzi się z niego komendą:
- deactivate
A spydera w terminalu uruchamia się komendą
- spyder3
Należy uruchomić go kiedy działa virtualenv. W Tools->Preferences->Console->Advanced Settings należy wybrać Use the following Python interpreter i wpisać tam pełną ścieżkę do mojego _work_/ve/bin/python3.
Podstawowe metody w Open CV
(Tutorial można znaleźć tu: OPENCV)
Wczytanie i wyświetlenie obrazka.
import cv2
import numpy as np
img = cv2.imread('obrazek.jpg', cv2.IMREAD_COLOR)
#Uwaga! Nie RGB, tylko BGR
#jeśli ma być wczytane w skali szarości wpisz cv2.IMREAD_GRAYSCALE
#jeśli ma być wczytane w oryginalnej skali barw, to cv2.IMREAD_UNCHANGED
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
#ta linijka jest potrzebna, jeśli chcemy, by okienko było rozciągliwe
cv2.imshow('image',img)
k=cv2.waitKey(0) #czas czekania w ms, 0 - czekaj do skutku
print("Wcisnales:", k)
#Sprawdź, co zostanie wypisane, jeśli teraz zamkniesz okienko myszką
cv2.destroyAllWindows()
Na wszelki wypadek, aby zawsze została wykonana komenda zamykająca okienko, również w przypadku pojawienia się błędu w programie, warto użyć słów try: i finally:
import cv2
import numpy as np
try:
img = cv2.imread('obrazek.jpg',cv2.IMREAD_COLOR)
cv2.imshow('image',img)
k=cv2.waitKey(0)
finally:
cv2.destroyAllWindows()
Sprawdź, jakiego typu obiektem jest img?
Rysowanie
import cv2
import numpy as np
try:
img = np.zeros([512, 512,3])
cv2.imshow('image',img)
k=cv2.waitKey(0)
cv2.line(img,(0,0),(511,511),(255,0,0),1)
#tablica, poczatek, koniec, kolor, grubosc
cv2.imshow('image',img)
k=cv2.waitKey(0)
img = cv2.rectangle(img,(20,20),(50,100),(0,255,0),3)
#tablica, jeden rog, przeciwlegly rog, kolor, grubosc linii
cv2.imshow('image',img)
k=cv2.waitKey(0)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(0,100), font, 0.5,(255,255,255),1,cv2.LINE_AA)
#tablica, tekst, polozenie, font, wielkosc, kolor, grubosc linii, typ linii
cv2.imshow('image',img)
k=cv2.waitKey(0)
finally:
cv2.destroyAllWindows()
Zadanko na próbę
Napisz pętlę, w której za pomocą klawiszy będzie się zmieniało położenie i wielkość napisu, tak długo aż nie zostanie wciśnięty ENTER lub myszką zamknięte okno.
Zadanie
Obiekt: trójkąt
Zdefiniuj klasę opisującą trójkąt. Powinna mieć następujące pola:
- Współrzędne wierzchołków względem punktu odniesienia
- Współrzędne punktu odniesienia na obrazie
Powinna zawierać następujące metody:
- Konstruktor __init__, któremu jako parametry przekazywane jest początkowe położenie punktu odniesienia i wierzchołków
- Narysowanie trójkąta na obrazie przekazanym jako parametr
- Sprawdzenie, czy punkt o danych współrzędnych znajduje się wewnątrz lub na brzegu trójkąta
- Sprawdzenie, czy trójkąt dotyka lub wychodzi poza krawędź obrazu, a jeśli tak, to którą
- Zmiana położenia (translacja) punktu odniesienia o wektor
- Ustawienie nowego położenia punktu odniesienia
- Obrót trójkąta wokół punktu odniesienia o zadany kąt
Dla ułatwienia poniżej kod, od którego można zacząć pisanie programu lub się na nim wzorować.
# -*- coding: utf-8 -*-
"""
Created on Sun Dec 3 15:30:22 2017
@author: jginter
"""
import cv2
import numpy as np
class trojkat (object):
def __init__ (self,A,B,C,O):
self.pkt=[A,B,C]
self.O=list(O)
self.pkt1=self.pkt.copy()
self.aktualizuj()
#self.pkt1=[(int(P[0]+self.O[0]), int(P[1]+self.O[1])) for P in self.pkt]
#self.O1=(int(O[0]),int(O[1]))
def aktualizuj(self):
self.pkt1=[(int(P[0]+self.O[0]), int(P[1]+self.O[1])) for P in self.pkt]
self.O1=(int(self.O[0]),int(self.O[1]))
def rysuj (self, im):
#w,h=img.shape[:2]
img=im.copy()
for i in range(len(self.pkt1)):
cv2.line(img, self.pkt1[i-1], self.pkt1[i],(0,0,0),1)
img[self.O1[1], self.O1[0]]=(0,0,255)
return img
def translacja (self, W):
self.O[0]+=W[0]
self.O[1]+=W[1]
self.aktualizuj()
def idzdo (self, P) :
self.O=P.copy()
self.aktualizuj()
try:
img0=np.zeros([400,400,3], dtype='uint8')+np.array([255, 250, 140], dtype='uint8')
img1=cv2.imread("clouds.jpg")
Tr=trojkat((-10,10),(10,10),(0,-10),(50,200))
img=Tr.rysuj(img0)
cv2.imshow('Obrazek 0', img)
k=-1
t=0.0
cv2.waitKey(0)
while k<0:
Tr.idzdo([200+50*np.sin(t), 200+50*np.cos(t)])
t+=0.01
img=Tr.rysuj(img1)
cv2.imshow('Obrazek 1', img)
k=cv2.waitKey(10)
finally:
cv2.destroyAllWindows()
Obiekt: figura
Zdefiniuj klasę opisującą figurę złożoną z wielu trójkątów. Powinna mieć podobne pola i metody jak trójkąt, ale być tworzona nie jako zbiór trzech punktów, tylko jako zbiór wielu trójkątów. Powinna zawierać metodę dodawania nowego trójkąta.
W oparciu o tę klasę zdefiniuj piłkę. Napisz taki program, by piłka odbijała się od ścianek obrazu i zatrzymała się, kiedy dotknie jakiegoś specjalnego punktu.