[pyar] Existirá este software?

Leonardo M. Rocha leo.m.rocha en gmail.com
Jue Feb 17 07:51:14 ART 2011


Juanjo,

Comento, puesto qeu trabajo en un equipo en el que hacemos cosas del
estilo (no exactamente eso, pero si en el tema:
http://www-sop.inria.fr/pulsar/)

Perdon que mi respuesta NO es completamente de python, sino que se
refiere a utilizar otras librerias mediante los wrappers python. Y tb
pido perdon por no dar una explicacion comlpeta del tema, sino algunos
punteros para donde buscar (hoy hasta las manos ...)

> Message: 3
> Date: Wed, 16 Feb 2011 09:13:40 -0300
> From: Juanjo Conti <jjconti en gmail.com>
> Subject: [pyar] Existirá este software?
> To: Python Argentina <pyar en python.org.ar>
> Message-ID:
>        <AANLkTimzHNAHCx5sYu15kq6ezgaM6FPchuu=hOtxG5GV en mail.gmail.com>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Estoy buscando una aplicación que permita a un puesto de vigilancia,
> controlar lo que sucede en distintas salas en base a señales recibidas
> desde el exterior (las señales se pueden leer de una BD por ejemplo en
> donde otro programa las va cargando). Cada sitio tiene las señales:
>
> - puerta abierta
> - movimiento

En general este tipo de cosas lleva alguna IA adentro, y el estado de
las IA es bastante Ad-hoc para cada caso (y dos oficinas distintas
pueden llegar a necesitar parametrizaciones diferentes).
Para cada setup en particular se deben calibrar las camaras y ver que
identifique los elementos correspondientes. (Yo estuve trabajando
sobre deteccion de personas y deteccion de moscas blancas de la fruta,
ahora mas sobre arquitectura de soft para tratamiento de estas cosas)

Te recomiendo que le des un buen vistazo al proyecto OpenCV, tienen
wrappers para python.
http://opencv.willowgarage.com/documentation/
http://opencv.willowgarage.com

La documentacion de OpenCV deja mucho que desear y compilar con todas
las opciones (gstreamer ffmpeg, gpgpu, las librerias de intel para
hacer multi threading a nivel de kernel, etc) suele dar dolores de
cabeza para algunas plataformas.
De todas maneras, de entre lo libre es lo mejor que hay, es muy
completo y una vez que te acostumbras, es bastante usable y es muy
veloz a la hora de procesar (utiliza padding en sus data types para
poder hacer entrar las cosas en un ancho de palabra de instruccion
mmx, entonces basicamente usa procesamiento vectorial en vez de punto
a punto).

Para detectar movimiento, tengo funcionando algo sobre opencv
wrappeado a python ( perdon por no poder publicar ni el codigo ni el
framework ... en proceso de convencimiento), pero estas  funciones te
pueden dar una buena idea para deteccion de movimiento:

cvSegmentMotion
cvUpdateMotionHistory
cvCalcMotionGradient
cvCalcMotionGradient


Para el tema de la puerta abierta, te recomiendo ver primero el
ambiente (no es lo mismo un ambiente de oficina donde la luz no cambia
mucho, que una puerta exterior, que una puerta de vidrio o una puerta
completamente opaca)

Yo haria algo como aprender el background, tenes varios algoritmos
(mas rapidos o mas lentos)

Codebook
Codebook + connectedcomponents (en realidad tuve que escribir algo
para que estas dos cosas funcionaran como yo queria)

Hay otras cosas para modelos de background:
CvBGStatModel (es el modelo estadistico donde se guardan las cosas)
y aca algunos modelos:
CvFGDStatModelParams -> cvCreateFGDStatModel con su correspondiente
creator (OpenCV tiene formas medio extranias de hacer las cosas, qeu
son bien entendibles si comprendemos que empezo siendo escrita en C y
ahora estan implementado y pasandose a C++)
CvGaussBGStatModelParams -> cvCreateGaussianBGModel
cvUpdateBGStatModel (es la funcion que actualiza el background sin
importar cual modelo se cargo
O podrias hacer deteccion de bordes y ver cuando cambian

Intel tambien publico varios sets de cosas pre-aprendidas para
utilizar con los algoritmos Haar (caras, personas, autos, etc) , en
OpenCV es facil usarlos

Un par de funciones de ayuda:

CvHaarClassifierCascade *  cascade = (CvHaarClassifierCascade*)
cvLoad("haarcascade_frontalface_alt.xml", 0, 0, 0);

CvSeq *faces = cvHaarDetectObjects(o_img, cascade, storage, 1.1, 2,
CV_HAAR_DO_CANNY_PRUNNING, cvSize(40, 40));

Hay muchas cosas que te va a convenir hacerlas directamente en C++ y
escribir el wrapper a python (yo estoy usando SWIG, pero hay maneras
mas limpias)


Si se te complica con los casos simples, vas a tener que entrar con la
calibracion de la camara (esto hace un par de matrices y le dice cual
es la transformacion 2D a 3D que debe hacer, le pifia siempre en
muchas cosas como es inevitable, pero ayuda a por ejemplo, calcular
alturas aproximadas de personas o decidir si algo debe ser procesado o
no).

Cada camara necesita su propia calibracion.

OpenCV tiene muy buenos wrappers a python, y si escribes codigo en C o
C++, lo unico que debes hacer es un wrapper. Cuidado con las IplImages
que ya estan siendo deprecadas, en favor de CvMat, desde Python solo
vas a poder utililzar CvMat y a veces, todavia, te va a hacer falta
transformar desde tu clase C++ mediante una funcion de opencv in_img =
cvGetImage(i_img,&tempImg1); donde i_img es CvMat*, in_img es
IplImage* y tempImg1 es IplIimage (solo modifica las cabeceras, no es
casi nada de overhead) para poder usarla correctamente.

Bueno,
espero que eso haya sido de algo de ayuda y perdon nuevamente por: que
no se trate exclusivamente de python y por que no tengo permitido
publicar todo el framework y los plugins que tengo armados.


Exitos

Leo


> y también se sabe si alguna persona se identificó (por ejemplo con una
> tarjeta RFID). Lo que ando buscando es justamente una interfaz para
> esto. M imagino algo web, en la que un guardia puede ver el estado de
> todas las salas que controla, etc...
>
> Tal vez sea muy custom y hay que desarrollarlo, pero no quería dejar
> de preguntar.
>
> Saludos!
> --
> Juanjo Conti
> blog: http://www.juanjoconti.com.ar
>


-- 
Ing. Leonardo Manuel Rocha
Ingénieur Expert
INRIA Sophia Antipolis
Projet PULSAR
+33(0)49238 5007
leonardo.rocha en inria.fr



More information about the pyar mailing list