neděle 4. ledna 2015

SimpleCV + Python

Po instalaci SimpleCV přichází na řadu pár příkladů v Pythonu...

Příklad 1) Zobrazení obrazu z kamery a zjištění barvy určitého pixelu:







import subprocess
from SimpleCV import Image
import time


subprocess.call(“raspistill -n -w %s -h %s -o Obr_1.bmp” % (640, 480), shell=True)
img = Image(“Obr_1.bmp”)
img.show()
pixel = img[2, 2]
print pixel

Nejprve importujeme potřebné komponenty. Spustíme externí proces (raspistill) a uložíme snímek pod názvem Obr_1.bmp z kamery v rozlišení 640x480 pixelů. Do proměnné img načteme uložený obrázek a funkcí show ho zobrazíme. Funkcí img přistupujeme k samotnému obrázku. 

Výstupem je hodnota barvy na souřadnicích ve formátu: (153.0, 202.0, 199.0) 

V programu můžeme například onen pixel změnit na červený a upravený obrázek uložit pod názvem Obr_2.bmp takto:

img[2, 2] = (255,0,0)
img.save(“Obr_2.bmp”)
print pixel

Výsledkem je změna barvy pixelu na pozici x = 2, y = 2 (malá tečka na druhém obrázku). 



Příklad 2) Úprava obrázku funkcí binarize(), která převede obrázek do černobílé varianty.






#!/usr/bin/python
import subprocess
from SimpleCV import Image
import time

subprocess.call(“raspistill -n -w %s -h %s -o
 Obr3_1.png” % (640, 480), shell=True)
img = Image(“
Obr3_1.png”)
img.show()
time.sleep(5)
img = img.binarize()
img.show()
time.sleep(5)
macchie = img.findBlobs()
img.save(“
Obr3_2.png”)
img.show()
time.sleep(20)

Funkce binarize() má jeden parametr a tím je úroveň prahu, při kterém rozlišuje kdy bude pixel bílý a kdy černý. Hodnotu úrovně lze nastavit od 0 do 255. Ukázka hodnot 40, 100 a 200:

 
Funkce findBlobs() slouží k nalezení objektů, jejich orientace, tvar atp. Tyto parametry jsou důležité např. v robotice při vyhodnocení obrazu. Více v následující ukázce. 

Příklad 3) Hledání ploch, úhlů a středů v obrázku



U funkce binarize(40) jsem nastavil parametr na 40, aby nebyl výstup příliš dlouhý. Popravdě, není výstup příliš vhodný. Lépe by se vyhodnocoval obrázek s objekty na stole atp., kde by bylo vidět jednotlivé objekty, jejich plochy, orientaci a středy...

#!/usr/bin/python
import subprocess
from SimpleCV import Image
import time

subprocess.call(“raspistill -n -w %s -h %s -o Obr4_1.png” % (640, 480), shell=True)
img = Image(“Obr4_1.png”)
img.show()
time.sleep(5)
img = img.binarize(40)
img.show()
time.sleep(5)
macchie = img.findBlobs()
img.show()
time.sleep(5)
print “Areas: “, macchie.area()
print “Angles: “, macchie.angle()
print “Centers: “, macchie.coordinates()


Takže jsme prohledali obrázek a výstupem je:

Areas:  [  10.    10.5   13.5   27.5  136. ]
Angles:  [ 75.96375561  90.         -78.69007111  90.          90.        ]
Centers:  [[201 324]
 [200 308]
 [176 440]
 [596 361]
 [177 462]]

Výstup je zajímavý, ale trochu nepraktický. Lepší by bylo detekovat předmět dle barvy... resp. zda se daná barva na obrázku nachází včetně "příbuzných" barev, což jsou barvy trošku odlišné od referenční... a to bude v následující ukázce.

Příklad 4) Vyhledávání barvy z obrázku



#!/usr/bin/pythonimport subprocess
from SimpleCV import Color, Image
import time


subprocess.call(“raspistill -n -w %s -h %s -o Obr5_1.png” % (640, 480), shell=True)
img = Image(“Obr5_1.png”)
img.show()
time.sleep(5)
colore = (22,36,75)
blue_distance = img.colorDistance(colore).invert()
blobs = blue_distance.findBlobs()
blobs.draw(color=Color.BLACK, width=4)
blue_distance.save(“Obr5_2.png”)
blue_distance.show()
time.sleep(5)
img.addDrawingLayer(blue_distance.dl())
img.save(“Obr5_3.png”)
img.show()
time.sleep(5)





 Výsledkem je detekce modrých ploch. 

Příklad 5) Detekce hran  objektů

#!/usr/bin/python
import subprocess
from SimpleCV import Color, Image
import time

subprocess.call("raspistill -n -w %s -h %s -o Obr6_1.png" % (800, 600), shell=True)
img = Image("Obr6_1.png")
img.show()
time.sleep(2)

lines = img.findLines(threshold=150)
lines.draw(color=Color.RED, width=2)
img.save("Obr6_2.png")
img.show()
time.sleep(5)



U funkce threshold lze měnit úroveň rozpoznání. 





Příklad 6) Nalezení kruhů na obrázku

#!/usr/bin/python
import subprocess
from SimpleCV import Color, Image
import time

subprocess.call(“raspistill -n -w %s -h %s -o Obr6_1.png” % (640, 480), shell=True)
img = Image(“
Obr6_1.png”)
img.show()
time.sleep(5)
cerchi = img.findCircle(canny=250,thresh=200,distance=11)
cerchi.draw(color=Color.GREEN, width=4)
cerchi.show()
time.sleep(5)
cerchi = cerchi.sortArea()
cerchi[0].draw(color=Color.RED, width=4)
img_with_circles = img.applyLayers()
img_with_circles.save(“
Obr6
_2.png”)
img_with_circles.show()
time.sleep(5)





Žádné komentáře:

Okomentovat