Ayuda Proyecto Camara Vigilancia

Hola, lo primero agraceder a todos el aporte y la ayuda que esta web nos ha dado a tantos, el problema que tengo entre manos es la creacion de un programa en C para el control de un servo futaba con el que controlare una camara de vigilancia, quiero que rote de 0 a 180º en pasos de 20º continuamente y que cuando detecte movimiento siga al objeto detectado. Para el montaje y programacion estoy usando un at89c51rd2 de la familia del 8051.Cualquier ayuda sera bien recibida.

Muchas Gracias.
 
Última edición:
Lo de rotar lo veo fácil, lo de detectar movimiento imposible.
¿Como detectas el movimiento?
Analizando la imagen---- Si rotas no puedes hacer eso, al menos fácilmente, si de por sí detectar movimiento por análisis de la imagen es complejo solo falta que rote.
Con un sensor de movimiento--- ¿Eso te dice donde está lo que se mueve?

¿Que compilador de C usas?
Yo hice un proyecto con SDCC hace ya años y el mismo micro
 
detectar movimiento es muy fácil, seguir ese movimiento va a ser lo difícil.
Para detectar movimiento tan fácil como esto:
mover la cámara en la dirección que se desee. sabiendo que la cámara no esta en movimiento, tomas una imagen y obtienes todos sus pixeles. luego obtienes otra y la comparas pixel a pixel con la anterior, y das un rango de equivocación***, si sobrepasa ese rango es por que hay algo en movimiento, como eso se hace rápidamente en el pc, podrías tomar varias imágenes, así la que obtengas la comparas con la anterior. Osea si quieres tomar 4 por ejemplo seria algo asi:

anterior=obtener una imagen (1°)
actual=obtener otra imagen (2°)
compara(anterior, actual)
anterior=actual
actual = obtener otra imagen (3°)
compara(anterior, actual)
anterior=actual
actual= obtener otra imagen (4°)
compara(anterior, actual)

Después de eso mueves la cámara en otro angulo (le mandas las instrucciones al micro para que mueva la cámara) y haces lo mismo nuevamente, eso es muy fácil yo lo hice en java tiempo atrás y funciona muy bien, y eso que usaba la librería JMF que es muy lento y pesado en lo que es imagen (en realidad toda la librería).

De ahí es fácil detectar movimiento, seguirlo va a ser lo difícil, o quizás no tanto por que tendrías que ver que pixeles fueron los que sufrieron cambios y de ahí concluir que hacer, pero ya seria meterse bastante en la programación cosa innecesaria ya que existen soluciones mas fáciles para esto. Una de las librerías que existen y justamente en C, que es el lenguaje en el que quieres programar, es la openCV y la otra opción que conozco es MatLab que también posee buenas librerías para lo que es visión, pero esta ultima es de pago y por lo que dices para ti es mejor la OpenCV, yo personalmente no e trabajado con esta librería pero si e visto buenos trabajos que han realizado compañeros de estudio.

Te dejo unos videos sobre estas librerias y referido a lo que quieres.
OpenCV

MatLab

Saludos!!

*** con rango de equivocación me refiero a que aunque compares 2 imágenes tomadas muy rápidamente una de otra y sin que exista ningún movimiento, igual tendrás un error, que me parece que es del 10% mas o menos (si mal no recuerdo y que varia según la calidad de la imagen), cosa que puedes comprobarlo fácilmente haciendo una comparación y viendo el valor de equivocación que te dio, igual es bastante, pero yo pude llegar a detectar el movimiento de algo de 2 cm a unos 5 metros de distancia sin ningún problema. Así si te da un rango de equivocación sin movimiento de un 10% entonces le das un 20% de equivocación(solo como ejemplo) y si pasa ese 20, entonces existe movimiento.
 
Última edición:
Ya lo he visto en youtube. No se como lo hicieron. Yo empezaria por hacer en el barrido secuencial que la camara se detenga un determinado tiempo para evaluar si en los proximos N cuadros hay variacion y a que % corresponde para que sea significativo, sino que siga.

En caso de detectar movimiento, que quede en un loop de retardo. En ese loop debera haber un analisis de los cuadros para determinar tendencia de ejes en ese movimiento para que puedas orientar la camara en un seguimiento.

Donde lo veo complicado es que pasa si toma dos movimientos simultaneos, deberias ponderar con un indice el control de lo que seria la tendencia. Tambien seria bueno almacenar los ultimos N cuadros para tomarlos como referencia y poder entrar en el primer loop de secuencia en caso de perdida del objetivo en movimiento..

Evaluacion del proyecto:
Fuera del desafio que merece el proyecto se deberia analizar el objetivo del proyecto a ver si con dos camaras de 90o de cobertura cada una podes cumplirlo, sin tener que motorizar una.

a)Se va a grabar la secuencia?
b)Que es lo que va monitorear?
c)Habra alguna persona mirando las imagenes en tiempo real?
 
Hay programas de PC para detectar movimiento en las cámaras que uno ponga. Hacer algo similar con un 8051 es algo, ehm, más difícil. Para empezar, ¿cómo conectar la cámara a un micro con unos pocos KB (o menos) de RAM?

Hacer rotar un servo siguiendo instrucciones de un PC (o cualquier cosa similar) es algo relativamente fácil.

Quizás usando una BeagleBoard y OpenCV...
 
Bueno, hay derivados de 8052 ara aburrir, algunos con 40 MIPS pero ciertamente el análisis de imágenes le viene grande, muy grande.
Como no pongas 20 sensores de movimiento direccionales, decalados unos grados, no se me ocurre nada.
Me parece mejor poner tres o cuatro cámaras que cubran todo el ángulo.
 
Hola Scooter, muchas gracias por contestar, voy a ir por partes asique lo primero que acometere sera la rotacion del servo programando en C, no he usado lo suficiente este lenguaje como para entenderlo,por eso os pido ayuda en el foro haber si me podeis hechar un mano.

Gracias
 
Te echamos lo que quieras, pero el hecho es que tendrás que estudiar tu.
Si te sirve de consuelo, yo me aclaro poco con el C.
Busca alguno de los libros de internet del tipo "aprenda c como si estuviera en primero" y luego mira los ejemplos del compilador que uses. Ten en cuenta que hay bastantes diferencias entre un PC y un 8052 a la hora de definir punteros etc.
 
Atrás
Arriba