Reconocer texto en imágenes con Php (phpOcr)

Por el 18 de diciembre de 2007

en: Programacion

El software de reconocicmiento óptico de caracteres es habitualmente conocido como OCR (Optical character recognition) y es capar de extraer / reconocer caracteres o formas dentro de una imagen.

Dentro de este tipo de software tendríamos también los OMR (optical mark recognition) que reconocerían una marca dentro de una imagen por lo que en la vida real podríamos aplicarlo a un corrector automático de exámenes tipo test o también el mecanismo que detecta las casillas marcadas en una quiniela.

PhpOcr

phpOCR es una librería que nos permite reconocer el texto que esta impreso en una imagen, como hemos dicho nos valemos del reconocimiento óptico de caracteres (Optical Character Recognition).

Que nadie se vaya a pensar que podrá hacer un gran número de cosas con esta libreria… ya que es bastante básica, ya que sólo reconoce texto en imágenes de un solo color (preferiblemente blanco sobre negro) y hay que entrenarla previamente para que alcance una precisión relevante pero no por esto deja de ser útil e interesante.

Ejemplo de PhpOcr

Si nos descargamos la clase encontraremos 25 archivos y una carpeta, la gran mayoria de los archivos son imágenes necesarias para los ejemplos (todas monocromo) y la carpeta (“storage”) es donde se van almacenando los conocimientos del programa… por ejemplo nada más descargarnolos reconocerá las letras: z, m, b, w y el símbolo +.

Descarga el ejemplo que se detalla a continuación

El motivo de que contenga más imágenes de ejemplo que el número de letras citado es que hay letras duplicadas en diferentes tamaños para poder apreciar el verdadero aprendizaje del caracter.

example.php -> Ejemplo de como reconocer y almacenar nuevas letras o formas
example1.php -> Ejemplo de detección de formas o letras, devolverá si es o no es conocidad esa letra o forma dependiendo de si tenía previamente memorizada en la carpeta “storage” alguna letra o forma parecida.

Tras descargarnos la clase y ejecutar estos dos ejemplos básicos podemos proceder a “memorizar una nueva forma / letra”.

Example.php

Lo que hacemos en este primer ejemplo es almacenar la información de los caracteres citados anteriormente.

<?php
include_once("config.php");
include_once("OCR.class.php");

$char = new OCR();

$char->Learn("W");
$char->saveResult();
echo 'Almacenar información de "W"<br>';

$char->Learn("z");
$char->saveResult();
echo 'Almacenar información de "z"<br>';

$char->Learn("M");
$char->saveResult();
echo 'Almacenar información de "M"<br>';

$char->Learn("B");
$char->saveResult();
echo 'Almacenar información de "B"<br>';
?>

Si quisiéramos ampliar un poco el ejemplo y reconocer una nueva forma o caracter deberemos añadir unas líneas a este ejemplo para que almacene en la carpeta “storage” la información del nuevo elemento.

Por ejemplo podríamos hacer una forma compuesta por las letras “TF” y llamar a la forma tufunción.

Tendremos que crearnos una imagen monocroma con nuestra forma del tipo que se muestra en la imagen inferior.

$char->LearnFromImage("tf.png","tufuncion");
$char->saveResult();
echo 'Almacenar información de "tufuncion"<br/><img src="tf.png"/>';

La ejecución de este nuevo ejemplo debería quedarnos muy parecida a la siguiente imagen:

Example1.php

<?php

include_once("config.php");
include_once("OCR.class.php");

$char = new OCR();

echo "<hr/><img src='M.png'/><br/>";
$res = $char->Recognition('M.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='M1.png'/><br/>";
$res = $char->Recognition('M1.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='z11.png'/><br/>";
$res = $char->Recognition('z11.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='z1.png'/><br/>";
$res = $char->Recognition('z1.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='Z.png'/><br/>";
$res = $char->Recognition('Z.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='B.png'/><br/>";
$res = $char->Recognition('B.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='B1.png'/><br/>";
$res = $char->Recognition('B1.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='W.png'/><br/>";
$res = $char->Recognition('W.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='W1.png'/><br/>";
$res = $char->Recognition('W1.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='W2.png'/><br/>";
$res = $char->Recognition('W2.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

echo "<hr/><img src='plus1.png'/><br/>";
$res = $char->Recognition('plus1.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}
?>

Ahora de la misma manera que hemos hecho en el ejemplo anterior queremos añadir unas líneas para probar esta clase, como anteriormente hemos almacenado la nueva forma ahora podremos con estas líneas reconocer la imagen que hemos creado para el ejemplo anterior (ó una de diferente tamaño…).

echo "<hr/><img src='tf.png'/><br/>";
$res = $char->Recognition('tf.png');
if ($res!==false){
	echo "<b>".$res->getName()."</b>";
}else{
	echo "No reconocido.<br/>";
}

Este es el resultado que obtenemos si seguimos este ejemplo…

Caso OK


En caso de utilizar una imagen diferente o en el que la forma varie de forma ostensible obtendríamos una salida parecida a la siguiente…

Caso Error


Descarga el ejemplo | PhpOCR

Reconocmiento Facial

Estos días he estado leyendo algunas cosas con un tema muy relacionado… “El reconocimiento facial”.

En los últimos años, el desarrollo de ingenios y programas informáticos para sistemas de seguridad ha experimentado un gran impulso. Entre ellos, destacan los sistemas biométricos de reconocimiento facial, que se perfilan como los más prometedores.

Aunque parecen extraídas de películas futuristas, lo cierto es que estas tecnologías son muy reales.

Por ejemplo, los escáneres de reconocimiento óptico del iris, que es uno de los sistemas más difundidos por su rapidez, eficacia y precio, ya han llegado a aeropuertos y hoteles.

El concepto biometría proviene de las palabras bio (vida) y metría (medida), lo que significa que todo equipo biométrico mide e identifica alguna característica propia de la persona. Todos los seres humanos tenemos características morfológicas únicas que nos diferencian.
Por tanto, la medición biométrica se puede considerar como el método ideal de
identificación humana.

Con aplicaciones de reconocimiento de objetos se puede llegar a conseguir detectar una cara dentro de una imagen, siempre y cuando haya una única cara… cuando nos encontramos más de una cara el proceso es bastante más complejo.


… y esta otra fotografía corresponde a la funcionalidad ofrecida por Google en Gmail hace poco más de un año para recortar rostros en las fotografias y poder de este modo tener bien ordenaditas las caras de sus usuarios:


Para ejemplos más avanzados de este tipo de aplicaciones os recomiendo un par de enlaces:

Face Processing Demos
Torch3vision
Face Detection and Face Recognition | BetaFace

Dejar un comentario