Segmentation image ( opencv)

Signaler
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010
-
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010
-
bonjour à tous
je suis novice dans le monde d'opencv ...comment segmenter en ligne une image
merci d'avance

8 réponses

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

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
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

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 :(
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

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
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
"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.
Messages postés
86
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
26 mai 2010

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;
}