Pregunta

He hecho el trabajo duro, volviendo la cámara iSight en mi MacBook en una cámara infrarroja, convertido, establecer el umbral etc .. y ahora tienen una imagen que se ve algo como esto:

alt texto

Mi problema es ahora; Necesito saber cuántas gotas están en mi imagen agrupando los píxeles blancos. No quiero utilizar cvBlob / cvBlobsLib, prefiero sólo tiene que utilizar lo que ya está en OpenCV.

puede bucle a través de los píxeles y agruparlos por la comprobación de umbrales concretos () píxeles blancos tocar, pero que supongo es probable que haya una manera muy fácil de hacer esto desde OpenCV?

supongo que no puedo usar cvFindContours ya que esto va a recuperar todos los píxeles blancos en una gran variedad, en lugar de separarlos en "grupos". ¿Alguien podría recomendar? (Tenga en cuenta estos no son círculos, sólo la luz emitida desde pequeños LEDs IR)

Muchas gracias de antemano!
tommed

¿Fue útil?

Solución

Bucle a través de la imagen en busca de píxeles blancos. Cuando encuentra uno que utilice cvFloodFill con ese píxel como semilla. A continuación, incrementar el valor de relleno para cada región, de modo que cada región tiene un color diferente. Esto se conoce como el etiquetado.

Otros consejos

Sí, puede hacerlo con cvFindContours(). Se devuelve el puntero a la primera secuencia que se encontró. El uso de ese puntero se puede recorrer a través de todas las secuencias encontradas.

    // your image converted to grayscale
    IplImage* grayImg = LoadImage(...);

    // image for drawing contours onto
    IplImage* colorImg = cvCreateImage(cvGetSize(grayImg), 8, 3);

    // memory where cvFindContours() can find memory in which to record the contours
    CvMemStorage* memStorage = cvCreateMemStorage(0);

    // find the contours on image *grayImg*
    CvSeq* contours = 0;
    cvFindContours(grayImg, memStorage, &contours);

    // traverse through and draw contours
    for(CvSeq* c = contours; c != NULL; c = c->h_next) 
    {
         cvCvtColor( grayImg, colorImg, CV_GRAY2BGR );
         cvDrawContours(
                        colorImg,
                        c,
                        CVX_RED,
                        CVX_BLUE,
                        0, // Try different values of max_level, and see what happens
                        2,
                        8
         );
    }

Además de este método, yo le aconsejo que eche un vistazo a cvBlobs o cvBlobsLib. uno de los Últimos está integrado en OpenCV 2.0 como lib oficial reconocimiento de regiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top