J'ai été la recherche autour de l'internet pour trouver un bon imfill fonction (comme celui de Matlab) mais travaillant en C++ avec OpenCV. Après quelques reaserches, j'ai finalement trouvé une solution :
IplImage* imfill(IplImage* src)
{
CvScalar white = CV_RGB( 255, 255, 255 );
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;
cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
cvZero( dst );
for( ; contour != 0; contour = contour->h_next )
{
cvDrawContours( dst, contour, white, white, 0, CV_FILLED);
}
IplImage* bin_imgFilled = cvCreateImage(cvGetSize(src), 8, 1);
cvInRangeS(dst, white, white, bin_imgFilled);
return bin_imgFilled;
}
Pour cela: d'Origine de l'Image Binaire
Résultat: Finale de l'Image Binaire
Le truc, c'est le réglage des paramètres de la cvDrawContours fonction:
cvDrawContours( dst, contour, blanc, blanc, 0, CV_FILLED);
- dst = image de destination
- contour = pointeur vers le premier contour
- blanc = la couleur utilisée pour remplir le contour
- 0 = niveau Maximal pour dessiner des contours. Si 0, seul le contour est dessiné
- CV_FILLED = Épaisseur des lignes, les contours sont dessinés avec de la. S'il est négatif (Par exemple, =CV_FILLED), le contour intérieur est établi.
Plus d'infos dans la openCV documentation.
Il y a probablement un moyen d'obtenir "heure d'été" directement comme une image binaire, mais je ne pouvais pas trouver comment utiliser les cvDrawContours fonction avec des valeurs binaires.