martes, 19 de mayo de 2009

Identificación

Hola.

Uno de los objetivos principales para contabilizar las velocidades era hacer una identificación de los vehículos que atraviesan el velocímetro con el fin de que estemos seguros de que ese es el coche al que queremos medir la velocidad.




En la anterior animación se puede observar como el coche verde adelanta al amarillo entre las dos balizas de velocímetros. Pues bien es por eso por lo que es necesario introducir la identificación, ya que si no se medirían ambas velocidades mal (aunque serían muy parecidas)

La idea es tener un identificador de color en el que se tenga la media de pixeles de los canales rojo, verde y azul (RGB) y comparar en ambos velocímetros. Esta medición se tiene que hacer en la imagen de color, en aquellos pixeles que dentro de la baliza, después de aplicar la "Sustracción de Fondo" sean blancos.

Lógicamente estos valores tienen que estar entre 0 y 255 y tuve el problema de que me daban valores superiores a 255. Gracias a la ayuda de Antonio vi que lo que me pasaba es que no inicializaba las variables locales y entonces tenían un valor basura.

Después de que Antonio me solucionase el anterior problema ahora me surgen otros dos:
  • El identificador de color se toma en un cambio de estado de la baliza. Los cambios de estado en ambas balizas teóricamente deberían producirse justo a la vez , pero esto no es así, lo cual me supone que el trozo que se toma de coche en la baliza izquierda, no es la misma que en la derecha para tomar el identificador.
  • El otro problema es que debido a la luz, a la hora de pasar la imagen a escala de grises, en la carretera por la que van los coches de los que estoy midiendo la velocidad, se ve todo casi del mismo color, y entonces se detectan pocos pixeles de ese coche, de no ser que sea un coche bastante oscuro.
Un saludo y hasta la próxima.

6 comentarios:

  1. Hola,
    Tengo el mismo problema que tu cuando accedo a los pixeles de una imagen en un solo canal, me salen valores muy superiores a 255. Me gustaria saber si puedes explicarme a que te refieres con lo de "inicializar varibles"...
    Si no me equivoco cuando accedes a un pixel de una imagen no tienes que inicializar nada,no?

    ResponderEliminar
  2. Hola Sergio.
    Me da la sensación de que intentas acceder a un pixel de forma erronea.
    En este enlace http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html
    hay un ejemplo que se llama hellow-world.cpp,en el cual se ve como se accede pixel a pixel(lo que hace el programa es dada una imagen, devolverla invertida).
    El acceso a píxeles tiene que hacerse con respecto a la posición x, la posición y y el canal (en el caso en el que sea una imagen a color, en la cual habrá tres canales) que se identifican del 0 al 2.

    Por último aclararte que las variables que yo no inicializaba y ahora inicializo es una suma de color en pixeles, porque yo lo que necesito es el color promedio de unos pocos pixeles por cada canal.

    Un Saludo.

    PD: si quieres puedes ponerte en contacto conmigo en robertosl86@gmail.com

    ResponderEliminar
  3. Hola de nuevo Rober,
    Mi programa tiene como entrada un video, el cual voy leyendo frame a frame y sobre cada uno de ellos hago lo siguiente:
    cvCvtColor(frame1,frame2,CV_BGR2GRAY);
    Hago una resta y paso la imagen a binario:
    CvAbsDiff(Primera,frame2,resta);
    cvTreshold(resta,binary,64,255,CV_THRESH_BINARY);
    Hasta aqui todo perfecto, el problema viene cuando accedo a un pixel utilizando:
    (unsigned char*)(binary->imageData + 50*binary->widthStep)[50];
    me salen numeros como:
    16777215
    -65536
    0
    -256
    ... cuando todo deberia ser o 0 o 1

    PD:teagrego al gmail por si acaso, jeje

    ResponderEliminar
  4. Hola Sergio.
    Me da la sensación de que lo que haces es una "Sustracción de Fondo" y te gustaría saber cuantos pixeles blancos hay en la imagen.

    Te comento. Lo que intentas hacer para acceder a un pixel es muy extraño.

    Déjame un mail de contacto y te contesto con la forma que tengo yo de hacerlo, que es totalmente distinta, pero desde mi punto de vista es más sencilla que lo que haces.

    Un saludo

    ResponderEliminar
  5. percu tio mola mucho el blog, no sabia que tenias uno, felicidades porque está mu chulo.

    sobre lo de medir la velocidad y eso... no me lo he leido todo porque me da pereza y estoy en el curro pero te puedo decir que los radares por sectores (miden la velocidad media en un tramo) lo que hacen es detectar las matriculas, es un sistema que está muyyy avanzado y es muy simple.

    ResponderEliminar