RkBlog

Hardware, programming and astronomy tutorials and reviews.

Wykrywanie twarzy na zdjęciach - OpenCV w akcji

OpenCV to wieloplatformowa otwarta biblioteka do obróbki obrazu. Za jej pomocą można m.in. wykrywać twarze na zdjęciach. Staje się to łatwiejsze gdy użyjemy API dla Pythona. Poniżej przykładowy skrypt testujący skuteczność OpenCV przy wykrywaniu twarzy.

OpenCV to wieloplatformowa otwarta biblioteka do obróbki obrazu. Za jej pomocą można m.in. wykrywać twarze na zdjęciach. Staje się to łatwiejsze gdy użyjemy API dla Pythona. Poniżej przykładowy skrypt testujący skuteczność OpenCV przy wykrywaniu twarzy.

import sys, os
from opencv.cv import *
from opencv.highgui import *
import Image, ImageDraw

def tescv():
	files = os.listdir('./')
	for i in files:
		if i.endswith('jpg'):
			print i
			image = cvLoadImage(i)
			grayscale = cvCreateImage(cvSize(image.width, image.height), 8, 1)
			cvCvtColor(image, grayscale, CV_BGR2GRAY)
			
			storage = cvCreateMemStorage(0)
			cvClearMemStorage(storage)
			cvEqualizeHist(grayscale, grayscale)
			cascade = cvLoadHaarClassifierCascade('/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml', cvSize(1,1))
			faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
						CV_HAAR_DO_CANNY_PRUNING, cvSize(50,50))
			ret = []
			if faces:
				for f in faces:
					ret = []
					im = Image.open(i)

					draw = ImageDraw.Draw(im)
					wsp = '%s, %s / %s, %s' % (str(f.x), str(f.x+f.width), str(f.y), str(f.y+f.height))
					print '%s: %s' % (i, wsp)
					draw.rectangle(((f.x, f.y), (f.x+f.width, f.y+f.height)), fill=5)
					del draw 
					
					# write to stdout
					im.save(i, "JPEG")
					ret.append([f.x, f.y, f.x+f.width, f.y+f.height])
				print ret

tescv()
Umieść skrypt w katalogu z testowymi zdjęciami i go odpal. NOTKA: użyj kopii zdjęć jako że PIL narysuje na nich czarne kwadraty - w miejscach gdzie OpenCV znajdzie "twarz" :) Wymagania to PIL oraz OpenCV z API dla Pythona.
RkBlog

28 April 2009;

Comment article