Segmentation image ( opencv)

coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010 - 10 oct. 2009 à 11:28
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010 - 22 oct. 2009 à 21:08
bonjour à tous
je suis novice dans le monde d'opencv ...comment segmenter en ligne une image
merci d'avance
A voir également:

8 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 oct. 2009 à 10:54
Salut

Il nous faut plus d'information sur ce que tu désires faire: "segmenter en ligne une image" ca ne me parle pas du tout.
Sans une présentation de l'image à segmenter ce n'est déjà pas facile à t'orienter mais sans explication, cela devient impossible...
A+


____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
21 oct. 2009 à 14:26
salut,
j'ai une chaine de caractere et je veux extraire chacun de ses caracteres
par exemple ma chaine est "abc" l'affichage désiré est a b c
j'arrive pas à implémenter ça en c++
quelqu'un peut il me guider?
merci
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
21 oct. 2009 à 15:18
J'essaie de comprendre: tu as une image dans laquelle il y a du texte, et tu veux extraire le text de l'image? Faire de OCR en quelque sorte?

A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
21 oct. 2009 à 16:45
oui exactement en fait l'application consiste à afficher une image la convertir en image binaire (jusque la c'est bon), faire la segmentation (extraire caractere par caractere) e enfin faire la reconnaissance de formes de ses caracteres
moi je me bloque dans l'étape d'extraction :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
21 oct. 2009 à 17:52
C'est pas une tache très facile...
Une fois que ton image est binarisé, il faut que toutes les lettres soient bien séparé. Si c'est le cas, tu n'auras pas de problème pour extraire chaque lettre. (Utilise une file FIFO pour extraire les composants connexes.) Cependant, si tes lettres se touchent ou s'il y a des faux positifs dans ton image binaire, il faut inséré une étape de filtrage de ton image binaire, Ouverture par reconstruction par exemple.


Après pour reconnaitre le texte, il faut utiliser des approches d'apprentissage "data mining", moins évident à comprendre...
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
21 oct. 2009 à 18:19
voici ci dessous le code:
 //console.cpp :  Defines the entry point for the console application.




#include "stdafx.h" //si vous avez choisi d'utiliser un en-tête précompilé dans votre projet
#include <cv.h>
#include 
#include <cxcore.h>
#include <highgui.h>
 

int main(int argc, char *argv[])
{


IplImage *img_nvg;
IplImage *img_bin; 
int seuil;
int inverser;
    // initialisation 
   IplImage *img=cvLoadImage("Sans titre.bmp");

   img_nvg=cvCreateImage(cvGetSize(img), img->depth, 1);
    img_bin=cvCloneImage(img_nvg);
   
//Contrôle de l'origine
    int flip=0;
    if(img->origin!=IPL_ORIGIN_TL){
        flip=CV_CVTIMG_FLIP;
    }
    cvConvertImage(img, img_nvg, flip);



   cvNamedWindow("originale", CV_WINDOW_AUTOSIZE);
   cvNamedWindow("binaire", CV_WINDOW_AUTOSIZE);
  

   cvShowImage("originale", img);
  
  //binarisation
    seuil=127;
    inverser=0;
   cvThreshold(img_nvg, img_bin, seuil, 255, CV_THRESH_BINARY);
     cvShowImage("binaire", img_bin);
 //********************************************************



 // size image
CvSize size = cvSize(img_bin->width,img_bin->height);

uchar *tabPixel;
tabPixel = (uchar *)img->imageData;

for(int i=0; i< size.height;i++) //lecture  ligne par ligne
{
for(int j=0; j< size.width;j++) // lecture colonne par colonne
{
CvScalar pixel;
pixel=cvGet2D(img_bin,i,j); //lecture du pixel ligne i colonne j
//std::cout<<" valeur du pixel : bleu "<<pixel.val[0]<<" Vert "<<pixel.val[1]<<" Rouge "<<pixel.val[2]<<std::endl;
int value = (int)pixel.val[1];
if (value<200)
tabPixel[i]=tabPixel[i]+ value ;
else
tabPixel[i]=tabPixel[i];

//std::cout<<"valeur du pixel :"<<pixel<<std::endl;

}
printf("%d ",tabPixel[i]);

}

printf("height \n %d ",size.height);
printf("width \n %d ",size.width);


//*************************************************
cvWaitKey(0);
cvDestroyWindow( "img" ); 
cvDestroyWindow( "img_bin" );

cvReleaseImage( &img );
cvReleaseImage( &img_bin ); 

   return 0;
}

le problème c'est que lors de l'affichage, la somme de pixels de chaque ligne est toujours à 255
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
21 oct. 2009 à 21:24
"La somme de pixels de chaque ligne est toujours à 255". Avec ca ca devrait aller mieux...t
int value;
for(int i=0; i< size.height;i++) //lecture  ligne par ligne
{
  tabPixel[i]=0;
  for(int j=0; j< size.width;j++) // lecture colonne par colonne
  {
    CvScalar pixel;
    pixel=cvGet2D(img_bin,i,j); //lecture du pixel ligne i colonne j
    value = (int)pixel.val[1];

   tabPixel[i]+=(int)pixel.val[1] ;
  }
printf("%d ",tabPixel[i]);
}


A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
22 oct. 2009 à 21:08
salut merci pour la réponse
j'ai fait quelques modifs sur le code en jouant sur la somme des pixels de chaque ligne pour savoir si c'est une ligne vide ou non..bref c'est bon ça marche maintenant je me bloque su un autre truc ..je veux afficher les différentes images caratères.. je les ai mis dans un tableau d'image mais apparamment manques quelques rectifications..
 //console.cpp :  Defines the entry point for the console application.

#include "stdafx.h" //si vous avez choisi d'utiliser un en-tête précompilé dans votre projet
#include <cv.h>
#include 
#include <cxcore.h>
#include <highgui.h>
 

int main(int argc, char *argv[])
{


IplImage *img_nvg;
IplImage *img_bin;
IplImage *img_caractere;
int seuil;
int inverser;
    // initialisation 
   IplImage *img=cvLoadImage("Sans titre.bmp");

   img_nvg=cvCreateImage(cvGetSize(img), img->depth, 1);
    img_bin=cvCloneImage(img_nvg);
   
//Contrôle de l'origine
    int flip=0;
    if(img->origin!=IPL_ORIGIN_TL){
        flip=CV_CVTIMG_FLIP;
    }
    cvConvertImage(img, img_nvg, flip);



   cvNamedWindow("originale", CV_WINDOW_AUTOSIZE);
   cvNamedWindow("binaire", CV_WINDOW_AUTOSIZE);
  

   cvShowImage("originale", img);
  
  //binarisation
    seuil=127;
    inverser=0;
   cvThreshold(img_nvg, img_bin, seuil, 255, CV_THRESH_BINARY);
     cvShowImage("binaire", img_bin);
 //********************************************************
CvSize size = cvSize(img_bin->width,img_bin->height);  // size image

int *tabPixel;
tabPixel = (int *)img->imageData;

IplImage *tabImage;
tabImage =  (IplImage *)img->imageData;


for(int i=0; i< size.height;i++) //lecture  ligne par ligne
{
tabPixel[i]=0;
for(int j=0; j< size.width;j++) // lecture colonne par colonne
{
CvScalar pixel;
pixel=cvGet2D(img_bin,i,j); //lecture du pixel ligne i colonne j
 tabPixel[i]+=(int)pixel.val[0] ;
}
double somPixel= 225*size.width;
if (tabPixel[i]==somPixel)
tabPixel[i]=0;
printf("%d ",tabPixel[i]);
}
int j=0;
int y=0;
int h;
int k=0;
do 
{
h=0;
while (tabPixel[j]==0 && j<=size.height)
{	
y++;
j++;
}
while (tabPixel[j]!=0 && j<=size.height)
 {
 h++;
 j++;
 }

cvSetImageROI(tabImage[k],cvRect(0,y,size.width,h)); // l'erreur est ici !!!!!!!
k++;
}
while (j<= size.height);


//*************************************************
cvWaitKey(0);
cvDestroyWindow( "img" ); 
cvDestroyWindow( "img_bin" );

cvReleaseImage( &img );
cvReleaseImage( &img_bin ); 

   return 0;
}
0
Rejoignez-nous