TI/Programowanie dla Fizyków Medycznych:Zadania openCV: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 4 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 1: Linia 1:
 +
[https://brain.fuw.edu.pl/edu/index.php/%22Programowanie_dla_Fizyk%c3%b3w_Medycznych%22 Programowanie dla fizyków medycznych]
 +
 
==Instalacja Open CV==
 
==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 __work_ (jest w nim dużo miejsca, którego brakuje w Twoim katalogu domowym).
+
Otwórz terminal. Wejdź do katalogu _work_ (jest w nim dużo miejsca, którego brakuje w Twoim katalogu domowym).
 
*cd _work_
 
*cd _work_
 
Wpisz komendy:
 
Wpisz komendy:
Linia 93: Linia 95:
 
*Konstruktor __init__, któremu jako parametry przekazywane jest początkowe położenie punktu odniesienia i wierzchołków
 
*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
 
*Narysowanie trójkąta na obrazie przekazanym jako parametr
*Sprawdzenie, czy punkt o danych współrzędnych znajduje się wewnątrz trójkąta
+
*Sprawdzenie, czy punkt o danych współrzędnych znajduje się wewnątrz lub na brzegu trójkąta
*Zmiana położenia (translacja) punktu odniesienia
+
*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
 
*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

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.