12.04.2011

Práce s obrázkem v Opencv (python)

Návod je určen pro jednoduché pochopení práce s opencv. Je to základní způsob jak zobrazit a zpracovávat obrázek.

Nejprve si načteme potřebné moduly pro python. Pokud je nemáte nainstalované tak je lze doinstalovat snadno v ubuntu příkazem.

sudo apt-get install python-opencv

V případě, že nemáte opencv obsažené ve vašich repozitářích distribuce, tak doporučuji se podívat na návod pro kompilaci Kompilace opencv na ubuntu 9.10 (10.4) .

Tak a teď se podíváme jak pracovat s opencv. Python je objektový jazyk a tak toho využijime k vytvoření třídy, která nám bude obstarávat hlavní smyčku:

class Main:
	def __init__(self):
		cv.NamedWindow("Obrazek", cv.CV_WINDOW_AUTOSIZE)

	def repeat(self):		
		return False

while Main().repeat():
	pass

Tato třída nám umožní se do nekočna cyklit, dokud ji nedáme příkaz k ukončení návratou hodnotou False. Do konstruktoru této třídy si vložíme kod pro načtení obrázku, ten se nám inicialituje pouze jednou.

	try:
		self.Img = cv.LoadImage("Lenna.png")
	except:
		print("Chyba: soubor se nepodařilo načíst")

Nyní už máme obrázek načtený, stačí nám jej jen zobrazit. V konstruktoru máme nadefinované první okno "Obrazek", do kterého jej zobrazíme. Aby se nám cyklus neukončil hned po zobrazení obrázku, nastavíme návratovou hodnotou na True. Tak donutíme hlavní cyklus ke smyčce

	cv.ShowImage("Obrazek",self.Img)

	key = highgui.cvWaitKey(-1)

Ještě obsloužíme stisky kláves. K tomu nám poslouží funkce cvWaitKey, která navrací hodnotu stisknuté klávesy. Je možné ji využít jako časovat, kde její první parametr určuje počet milisekund. To ale v naší situaci nevyužijeme a tak jej nastavíme na -1. Záporná hodnota nám určuje, že nás funkce pustí dále jen v případě, že uživatel stiskne klávesu. Ukončení programu přidáme na klávesu "q" a ke klávese "s" si přiráme přeuložení obrázku.

 	if key == "q":
		return False
	if key == "s":
		print("Save image .. ")
		cv.SaveImage("image.jpg", self.Img)
	
	return True

Celý kod vypadá následovně:

#!/bin/bash
# coding:utf-8

try:
	import cv
	from opencv import highgui
except:
	print("Není nainstalované python-cv")
	exit(0)


class Main:
	def __init__(self):
		try:
			self.Img = cv.LoadImage("Lenna.png")
		except:
			print("Chyba: soubor se nepodařilo načíst")

		cv.NamedWindow("Obrazek", cv.CV_WINDOW_AUTOSIZE)


	def repeat(self):
		cv.ShowImage("Obrazek",self.Img)

		key = highgui.cvWaitKey(-1)

	 	if key == "q":
			return False

		if key == "s":
			print("Save image .. ")
			cv.SaveImage("image.jpg", self.Img)
		
		return True

while Main().repeat():
	pass