13 votes

L'extraction de blobs dans OpenCV

Je suis en train d'utiliser OpenCV pour filtrer une image pour certaines couleurs, donc j'ai une image binaire des régions détectées.

Maintenant je veux éroder ces zones et ensuite me débarrasser des plus petites, et trouver les coordonnées x, y du plus grand 'blob'

Je cherchais des recommandations sur la meilleure bibliothèque à utiliser ? J'ai vu cvBlob et cvBlobsLib mais je ne suis pas trop sûr de comment les configurer. Est-ce que je veux les compiler avec le projet ou les compiler et les installer sur le système (comme je l'ai fait avec OpenCV) ?

Je suis actuellement en train d'utiliser l'IDE Code::Blocks sur Ubuntu (bien que cela ne devrait pas limiter les choses)

11voto

etarion Points 6822

Vous pouvez utiliser findContours pour cela, consultez le manuel d'opencv et un Didacticiel pour trouver des composants connectés.


Éditer : Code du didacticiel (via Archive.org)

#include 
#include 
#include 

int main(int argc, char *argv[])
{
    IplImage *img, *cc_color; /*IplImage est une image dans OpenCV*/
    CvMemStorage *mem;
    CvSeq *contours, *ptr;
    img = cvLoadImage(argv[1], 0); /* charge l'image à partir de la ligne de commande */
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY);
    mem = cvCreateMemStorage(0);
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP,
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) {
        CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
        cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
    }

    cvSaveImage("result.png", cc_color);
    cvReleaseImage(&img);
    cvReleaseImage(&cc_color);
    return 0;
}

11voto

jason Points 81

Je suis en retard pour la fête, mais j'aimerais simplement ajouter qu'il existe un moyen de faire des composants connectés dans opencv, ce n'est juste pas encore inclus dans la version principale.

Mise à jour: Cela fait partie de la version principale, mais cela est en attente depuis plusieurs années en raison de la sortie de la version 3.0. Lien vers la documentation

Voir http://code.opencv.org/issues/1236 et http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

Avertissement - Je suis l'auteur.

10voto

Paul R Points 104036

Malheureusement, OpenCV ne dispose pas de fonctionnalité d'étiquetage de composants connectés, ce qui semble être une omission sérieuse pour une bibliothèque de vision par ordinateur. Quoi qu'il en soit, j'ai récemment eu une exigence similaire, donc j'ai mis en œuvre ma propre routine CCL - il existe quelques algorithmes différents décrits sur la page Wikipedia sur l'étiquetage des composantes connexes et ils sont tous assez simple à mettre en œuvre.

0voto

Je pense que la meilleure et la plus facile option pour travailler avec des blobs avec OpenCV est d'utiliser la bibliothèque cvBlob. C'est une bibliothèque complémentaire à OpenCV et c'est tellement facile à utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X