OpenCV agrupación de píxeles blancos
-
24-09-2019 - |
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:
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
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.