TI/Programowanie dla Fizyków Medycznych:Zadania openCV: Różnice pomiędzy wersjami
(Nie pokazano 18 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 1: | Linia 1: | ||
− | =Instalacja Open CV= | + | [https://brain.fuw.edu.pl/edu/index.php/%22Programowanie_dla_Fizyk%c3%b3w_Medycznych%22 Programowanie dla fizyków medycznych] |
+ | |||
+ | ==Instalacja Open CV== | ||
Dla potrzeb tego zadania każdy powinien stworzyć własne Virtual Enviorment (wirtualne środowisko). | Dla potrzeb tego zadania każdy powinien stworzyć własne Virtual Enviorment (wirtualne środowisko). | ||
− | Otwórz terminal. Wejdź do katalogu | + | Otwórz terminal. Wejdź do katalogu _work_ (jest w nim dużo miejsca, którego brakuje w Twoim katalogu domowym). |
− | *cd | + | *cd _work_ |
Wpisz komendy: | Wpisz komendy: | ||
*virtualenv -p python3 ve | *virtualenv -p python3 ve | ||
Linia 10: | Linia 12: | ||
*pip install --upgrade pip | *pip install --upgrade pip | ||
*pip install opencv-python | *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: [https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html OPENCV]) | ||
+ | |||
+ | Wczytanie i wyświetlenie obrazka. | ||
+ | <source lang="python"> | ||
+ | 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() | ||
+ | |||
+ | </source> | ||
+ | |||
+ | 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: | ||
+ | <source lang="python"> | ||
+ | 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() | ||
+ | </source> | ||
+ | Sprawdź, jakiego typu obiektem jest img? | ||
+ | |||
+ | ==Rysowanie== | ||
+ | <source lang="python"> | ||
+ | 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() | ||
+ | </source> | ||
+ | ===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ć. | ||
+ | |||
+ | <source lang='python'> | ||
+ | # -*- 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() | ||
+ | </source> | ||
+ | |||
+ | ==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. |
Aktualna wersja na dzień 09:10, 21 gru 2017
Programowanie dla fizyków medycznych
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.