viernes, 24 de octubre de 2008

Detección de rostros en PHP con Facedetect y OpenCV

Con el auge de las tecnologías de detección de rostros de las camaras fotográficas, decidi investigar un poco al respecto y me topé con la biblioteca OpenCV (Open Computer Visión Library). Esta biblioteca permite hacer análisis y transformaciónes a videos e imágenes así como detección de formas usando inteligencia artificial. Logré compilar una extensión para reconocimiento de personas en PHP llamada Facedetect el cual contiene dos funciones disponibles para enlazarlas con PHP5:

face_count(): Devuelve el numero de rostros encontradas en la imagen.
face_detect(): Devuelve un array con las coordenadas de los rostros disponibles.


Imágen sin procesar

Después de procesar
Numero de personas en la foto: 10


Monté la plataforma utilizando un servidor Ubuntu Hardy Heron con Apache2 y php5.

script:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;" />
<title>Detector de Rostros</title>
</head>
<body>
<h1>Open Computer Vision - Contador de personas</h1>
<form action="<?=$_SERVER['PHP_SELF']?>" method="post" ENCTYPE="multipart/form-data">
Archivo<input type="file" name="file">
<input type="submit" value="subir">
<input type="hidden" name="uploadflag" value="1">
</form>
<br>
<?php
if($_POST['uploadflag']==1){
if(
$_FILES['file']['tmp_name'] != ""){
$imagenfinal = "imagenes/foto".date("Ymdhis").".jpg";
$cascade = "/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml";
move_uploaded_file($_FILES['file']['tmp_name'],$imagenfinal);
$format = strtolower(substr(strrchr($imagenfinal,"."),1));
switch(
$format)
{
case
'gif' :
$type ="gif";
$img = imagecreatefromgif($imagenfinal);
break;
case
'png' :
$type ="png";
$img = imagecreatefrompng($imagenfinal);
break;
case
'jpg' :
$type ="jpg";
$img = imagecreatefromjpeg($imagenfinal);
break;
case
'jpeg' :
$type ="jpg";
$img = imagecreatefromjpeg($imagenfinal);
break;
default :
die (
"<br>ERROR: tipo de archivo desconocido: $imagenfinal");
break;
}
$total = face_count($imagenfinal, $cascade);
$faces = face_detect($imagenfinal ,$cascade);

echo
"Numero de personas en la foto: ".$total;
$color = imagecolorallocate($img, 132, 135, 28);
for(
$i=0; $i<$total; $i++) {
$face = $faces[$i];
$x1 = $face['x'];
$y1 = $face['y'];
$x2 = $x1+$face['w'];
$y2 = $y1+$face['h'];
imagerectangle($img, $x1, $y1, $x2, $y2, $color);
echo(
"<br>persona ".($i+1)." : ($x1,$y1) - ($x2,$y2)");
}

if(
$total>0) {
$dest = "imagenes/nuevafoto_".date("Ymdhis").".jpg";
if(
$type=="gif") imagegif($img, $dest);
if(
$type=="jpg") imagejpeg($img, $dest);
if(
$type=="png") imagepng($img, $dest);
if(
$type=="bmp") imagewbmp($img, $dest);
echo
'<br><img src="'.$dest.'"><br>';
}
echo
'<a href="'.$_SERVER['PHP_SELF'].'"></a>';
} else{ echo
"<br>Debe subir una imagen<br>"; }
echo
'<br><br><a href="'.$_SERVER['PHP_SELF'].'">Recargar</a>';
}
?>
</body>
</html>