Skip to content
Snippets Groups Projects
Commit acad2303 authored by Romain Garrigues's avatar Romain Garrigues
Browse files

Modification de l'application de visualisation de l'apprentissage supervisée.

parent 4a013642
Branches
Tags
No related merge requests found
......@@ -277,23 +277,23 @@ public:
// Overlay
bool cOverlay;
/*! Activate overlay on image */
void ActivateOverlay(bool b);
/*! Activate overlays on image */
void ActivateOverlayFirst(bool b);
void ActivateOverlaySecond(bool b);
bool cViewOverlayData;
/*! Specify the 3D image to view as an overlay */
void SetInputOverlay( OverlayPointer newOverlayData,
OverlayPointer newOverlayDataClassRed,
OverlayPointer newOverlayDataClassBlue);
void SetInputOverlay( OverlayPointer newOverlayDataClassFirst,
OverlayPointer newOverlayDataClassSecond);
/*! Return a pointer to the overlay data */
const OverlayPointer & GetInputOverlay(void) const;
/*! Return a pointer to the overlay data for the Red Class*/
const OverlayPointer & GetInputOverlayClassRed(void) const;
const OverlayPointer & GetInputOverlayClassFirst(void) const;
/*! Return a pointer to the overlay data for the Blue Class*/
const OverlayPointer & GetInputOverlayClassBlue(void) const;
const OverlayPointer & GetInputOverlayClassSecond(void) const;
/*! Turn on/off the viewing of the overlay */
void ViewOverlayData(bool newViewOverlayData);
......@@ -335,18 +335,25 @@ protected:
//Mthodes utilises pour l'overlay de l'image
bool cValidOverlayData;
//Booleens permettant l'affichage des overlays de la classification
bool cViewOverlayClassFirst;
bool cViewOverlayClassSecond;
float cOverlayOpacity;
// Overlay utilis pour afficher le rsultat de la classification
OverlayPointer cOverlayData;
// Overlay utilis pour afficher le rsultat de la classe #Rouge
OverlayPointer cOverlayDataClassRed;
// Overlay utilis pour afficher le rsultat de la classe #Bleu
OverlayPointer cOverlayDataClassBlue;
// OverlayPointer cOverlayData;
// Overlay utilis pour afficher le rsultat de la classe #C1
OverlayPointer cOverlayDataClassFirst;
// Overlay utilis pour afficher le rsultat de la classe #C2
OverlayPointer cOverlayDataClassSecond;
void (* cViewOverlayCallBack)(void);
ImageModeType cImageMode;
unsigned char * cWinOverlayData;
//unsigned char * cWinOverlayData;
unsigned char * cWinOverlayDataFirst;
unsigned char * cWinOverlayDataSecond;
unsigned int cOverlayColorIndex;
ColorTablePointer cColorTable;
......
......@@ -42,9 +42,12 @@ GLVectorImageViewClick() : VectorImageView<TPixel>(), Fl_Gl_Window(0,0,0,0,0)
cOverlay = false ;
cValidOverlayData = false;
cViewOverlayData = false;
cViewOverlayClassFirst = false;
cViewOverlayClassSecond = false;
cViewOverlayCallBack = NULL;
cOverlayOpacity = 0.0;
cWinOverlayData = NULL;
cWinOverlayDataFirst = NULL;
cWinOverlayDataSecond = NULL;
cOverlayColorIndex = 7; //default white
cClickMode = CM_SELECT;
......@@ -396,7 +399,8 @@ update()
//memset( this->cWinImData, 0, this->cWinDataSizeX*this->cWinDataSizeY );
if( this->cValidOverlayData )
{
memset(this->cWinOverlayData, 0, this->cWinDataSizeX*this->cWinDataSizeY*4);
memset(this->cWinOverlayDataFirst, 0, this->cWinDataSizeX*this->cWinDataSizeY*4);
memset(this->cWinOverlayDataSecond, 0, this->cWinDataSizeX*this->cWinDataSizeY*4);
}
IndexType ind;
......@@ -425,18 +429,32 @@ update()
{
ind[0] = j;
m = (int)*((unsigned char *)&(cOverlayData->GetPixel(ind)));
cWinOverlayData[l+0] =
((unsigned char *)&(cOverlayData->GetPixel(ind)))[0];
cWinOverlayData[l+1] =
((unsigned char *)&(cOverlayData->GetPixel(ind)))[1];
cWinOverlayData[l+2] =
((unsigned char *)&(cOverlayData->GetPixel(ind)))[2];
if (cWinOverlayData[l+0]==255)
cWinOverlayData[l+3] = (unsigned char)(0);
//m = (int)*((unsigned char *)&(cOverlayDataFirst->GetPixel(ind)));
//Donnees pour l'overlay de la classe #C1
cWinOverlayDataFirst[l+0] =
((unsigned char *)&(cOverlayDataClassFirst->GetPixel(ind)))[0];
cWinOverlayDataFirst[l+1] =
((unsigned char *)&(cOverlayDataClassFirst->GetPixel(ind)))[1];
cWinOverlayDataFirst[l+2] =
((unsigned char *)&(cOverlayDataClassFirst->GetPixel(ind)))[2];
if (cWinOverlayDataFirst[l+0]==255)
cWinOverlayDataFirst[l+3] = (unsigned char)(0);
else
cWinOverlayData[l+3] = (unsigned char)(255);
cWinOverlayDataFirst[l+3] = (unsigned char)(255);
//Donnees pour l'overlay de la classe #C2
cWinOverlayDataSecond[l+0] =
((unsigned char *)&(cOverlayDataClassSecond->GetPixel(ind)))[0];
cWinOverlayDataSecond[l+1] =
((unsigned char *)&(cOverlayDataClassSecond->GetPixel(ind)))[1];
cWinOverlayDataSecond[l+2] =
((unsigned char *)&(cOverlayDataClassSecond->GetPixel(ind)))[2];
if (cWinOverlayDataSecond[l+0]==255)
cWinOverlayDataSecond[l+3] = (unsigned char)(0);
else
cWinOverlayDataSecond[l+3] = (unsigned char)(255);
l+=4;
//if(j-this->cWinMinX >= (int)this->cWinDataSizeX)
// continue;
......@@ -537,17 +555,27 @@ void GLVectorImageViewClick<TPixel,TPixelOverlay>::draw(void)
glDrawPixels(this->cWinDataSizeX,this->cWinDataSizeY,
GL_RGB,GL_UNSIGNED_BYTE,this->cWinImData );
}
}
}
// Affichage de l'overlay
if(cOverlay && cValidOverlayData && cViewOverlayData)
{
// Affichage de l'overlay de la classe #C1
if(cOverlay && cValidOverlayData && cViewOverlayData && cViewOverlayClassFirst)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawPixels(this->cWinDataSizeX, this->cWinDataSizeY, GL_RGBA,
GL_UNSIGNED_BYTE, this->cWinOverlayData);
glDisable(GL_BLEND);
}
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawPixels(this->cWinDataSizeX, this->cWinDataSizeY, GL_RGBA,
GL_UNSIGNED_BYTE, this->cWinOverlayDataFirst);
glDisable(GL_BLEND);
}
// Affichage de l'overlay de la classe #C2
if(cOverlay && cValidOverlayData && cViewOverlayData && cViewOverlayClassSecond)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawPixels(this->cWinDataSizeX, this->cWinDataSizeY, GL_RGBA,
GL_UNSIGNED_BYTE, this->cWinOverlayDataSecond);
glDisable(GL_BLEND);
}
// Selection Box display
if (this->cSelectRectangle)
......@@ -775,12 +803,11 @@ ViewClickedPoints()
template <class TPixel, class TPixelOverlay>
void
GLVectorImageViewClick<TPixel, TPixelOverlay>
::SetInputOverlay( OverlayPointer newOverlayData,
OverlayPointer newOverlayDataClassRed,
OverlayPointer newOverlayDataClassBlue)
::SetInputOverlay( OverlayPointer newOverlayDataClassFirst,
OverlayPointer newOverlayDataClassSecond)
{
RegionType newoverlay_region =
newOverlayData->GetLargestPossibleRegion();
newOverlayDataClassFirst->GetLargestPossibleRegion();
SizeType newoverlay_size = newoverlay_region.GetSize();
......@@ -789,22 +816,28 @@ GLVectorImageViewClick<TPixel, TPixelOverlay>
&& (newoverlay_size[1] == this->cDimSize[1])
)
{
this->cOverlayData = newOverlayData;
this->cOverlayDataClassRed = newOverlayDataClassRed;
this->cOverlayDataClassBlue = newOverlayDataClassBlue;
// this->cOverlayData = newOverlayData;
this->cOverlayDataClassFirst = newOverlayDataClassFirst;
this->cOverlayDataClassSecond = newOverlayDataClassSecond;
//this->cViewOverlayData = true;
this->cOverlay=true;
this->cViewOverlayData = true;
this->cValidOverlayData = true;
this->cOverlayOpacity = (float)0.0;
if(this->cWinOverlayData != NULL)
if(this->cWinOverlayDataFirst != NULL)
{
delete [] this->cWinOverlayData;
delete [] this->cWinOverlayDataFirst;
}
if(this->cWinOverlayDataSecond != NULL)
{
delete [] this->cWinOverlayDataSecond;
}
const unsigned long bufferSize = this->cWinDataSizeX * this->cWinDataSizeY * 4;
this->cWinOverlayData = new unsigned char[ bufferSize ];
this->cWinOverlayDataFirst = new unsigned char[ bufferSize ];
this->cWinOverlayDataSecond = new unsigned char[ bufferSize ];
}
else // return a warning
{
......@@ -844,19 +877,20 @@ GLVectorImageViewClick<TPixel, TPixelOverlay>
template <class TPixel, class TPixelOverlay>
const typename GLVectorImageViewClick<TPixel,
TPixelOverlay>::OverlayPointer &
GLVectorImageViewClick<TPixel, TPixelOverlay>::GetInputOverlayClassRed( void )
GLVectorImageViewClick<TPixel, TPixelOverlay>::GetInputOverlayClassFirst( void )
const
{
return this->cOverlayDataClassRed;
return this->cOverlayDataClassFirst;
}
template <class TPixel, class TPixelOverlay>
const typename GLVectorImageViewClick<TPixel,
TPixelOverlay>::OverlayPointer &
GLVectorImageViewClick<TPixel, TPixelOverlay>::GetInputOverlayClassBlue( void )
GLVectorImageViewClick<TPixel, TPixelOverlay>::GetInputOverlayClassSecond( void )
const
{
return this->cOverlayDataClassBlue;
return this->cOverlayDataClassSecond;
}
template <class TPixel, class TPixelOverlay>
......@@ -1194,11 +1228,18 @@ void GLVectorImageViewClick<TPixel,TPixelOverlay>::boxMax(float x, float y, floa
template <class TPixel, class TPixelOverlay>
void
GLVectorImageViewClick<TPixel, TPixelOverlay>::
ActivateOverlay(bool b)
ActivateOverlayFirst(bool b)
{
cOverlay = b ;
cViewOverlayClassFirst = b ;
}
template <class TPixel, class TPixelOverlay>
void
GLVectorImageViewClick<TPixel, TPixelOverlay>::
ActivateOverlaySecond(bool b)
{
cViewOverlayClassSecond = b ;
}
......
......@@ -103,8 +103,8 @@ public:
/** Gestion des vnements associs aux bouttons */
void EraseLastClickedPoint();
void EraseAllClickedPoints();
void LearnAlgorythm();
void ClassificationAlgorythm();
void LearnAlgorithm();
void ClassificationAlgorithm();
void DisplayFirstClass();
void DisplaySecondClass();
void LoadLeftImage();
......
......@@ -442,31 +442,36 @@ ImageViewerAS<TPixel>::EraseAllClickedPoints()
template <class TPixel>
void
ImageViewerAS<TPixel>::LearnAlgorythm()
ImageViewerAS<TPixel>::LearnAlgorithm()
{
m_PrincipalViewBeforeClassif->LearnStep();
}
template <class TPixel>
void
ImageViewerAS<TPixel>::ClassificationAlgorythm()
ImageViewerAS<TPixel>::ClassificationAlgorithm()
{
m_PrincipalViewBeforeClassif->ClassificationStep();
m_PrincipalViewAfterClassif->SetInputOverlay(m_PrincipalViewBeforeClassif->GetInputOverlayClassFirst(),
m_PrincipalViewBeforeClassif->GetInputOverlayClassSecond());
}
template <class TPixel>
void
ImageViewerAS<TPixel>::DisplayFirstClass()
{
m_PrincipalViewAfterClassif->ActivateOverlay(true);
m_PrincipalViewAfterClassif->ActivateOverlayFirst(true);
m_PrincipalViewAfterClassif->ActivateOverlaySecond(false);
this->Update();
}
template <class TPixel>
void
ImageViewerAS<TPixel>::DisplaySecondClass()
{
m_PrincipalViewAfterClassif->ActivateOverlay(false);
m_PrincipalViewAfterClassif->ActivateOverlayFirst(false);
m_PrincipalViewAfterClassif->ActivateOverlaySecond(true);
this->Update();
}
......
......@@ -13,7 +13,7 @@ class otbImageViewerASGUI {open
label {Principal Window} open
xywh {469 33 710 575} type Double box PLASTIC_DOWN_BOX color 196 labelsize 12 align 33 visible
} {
Fl_Group glWindowGroupPrincipal {open selected
Fl_Group glWindowGroupPrincipal {open
xywh {-5 -5 715 580} color 40
} {
Fl_Button bUndo {
......@@ -23,12 +23,12 @@ class otbImageViewerASGUI {open
}
Fl_Button bLearn {
label Learn
callback {LearnAlgorythm();}
callback {LearnAlgorithm();}
xywh {215 420 64 25} box SHADOW_BOX color 55 labelfont 1 labelcolor 176
}
Fl_Button bClassif {
label Classif
callback {ClassificationAlgorythm();}
callback {ClassificationAlgorithm();} selected
xywh {215 450 64 25} box SHADOW_BOX color 55 labelfont 1 labelcolor 176
}
Fl_Button bReset {
......@@ -109,9 +109,9 @@ class otbImageViewerASGUI {open
} {}
Function {EraseAllClickedPoints()} {return_type {virtual void}
} {}
Function {LearnAlgorythm()} {return_type {virtual void}
Function {LearnAlgorithm()} {return_type {virtual void}
} {}
Function {ClassificationAlgorythm()} {return_type {virtual void}
Function {ClassificationAlgorithm()} {return_type {virtual void}
} {}
Function {DisplaySecondClass()} {return_type {virtual void}
} {}
......
......@@ -474,8 +474,8 @@ PrincipalImageViewAS<TPixel, TPixelOverlay>::ClassificationStep()
typedef otb::Image< TPixelOverlay, Dimension > OutputImageType;
typename OutputImageType::Pointer outputImage = OutputImageType::New();
typename OutputImageType::Pointer ImageClassBlue = OutputImageType::New();
typename OutputImageType::Pointer ImageClassRed = OutputImageType::New();
typename OutputImageType::Pointer ImageClassFirst = OutputImageType::New();
typename OutputImageType::Pointer ImageClassSecond = OutputImageType::New();
typedef itk::Index<Dimension> myIndexType;
typedef itk::Size<Dimension> mySizeType;
......@@ -496,23 +496,23 @@ PrincipalImageViewAS<TPixel, TPixelOverlay>::ClassificationStep()
outputImage->SetRegions( region );
outputImage->Allocate();
ImageClassBlue->SetRegions( region );
ImageClassBlue->Allocate();
ImageClassFirst->SetRegions( region );
ImageClassFirst->Allocate();
ImageClassRed->SetRegions( region );
ImageClassRed->Allocate();
ImageClassSecond->SetRegions( region );
ImageClassSecond->Allocate();
std::cout << "Image iterator" << std::endl;
typedef itk::ImageRegionIterator< OutputImageType> OutputIteratorType;
OutputIteratorType outIt( outputImage, outputImage->GetBufferedRegion() );
OutputIteratorType classRedIt( ImageClassRed, outputImage->GetBufferedRegion() );
OutputIteratorType classBlueIt( ImageClassBlue,outputImage->GetBufferedRegion() );
OutputIteratorType classSecondIt( ImageClassSecond, outputImage->GetBufferedRegion() );
OutputIteratorType classFirstIt( ImageClassFirst,outputImage->GetBufferedRegion() );
outIt.GoToBegin();
classRedIt.GoToBegin();
classBlueIt.GoToBegin();
classSecondIt.GoToBegin();
classFirstIt.GoToBegin();
TPixelOverlay MaxValue = static_cast<TPixelOverlay>(255);
TPixelOverlay MinValue = static_cast<TPixelOverlay>(0);
......@@ -523,25 +523,25 @@ PrincipalImageViewAS<TPixel, TPixelOverlay>::ClassificationStep()
ClassifierType::ClassLabelType label = m_iter.GetClassLabel();
if( label == -1 )
{
classBlueIt.Set(MaxValue);
classRedIt.Set(MinValue);
classFirstIt.Set(MaxValue);
classSecondIt.Set(MinValue);
}
if( label == 1 )
{
classBlueIt.Set(MinValue);
classRedIt.Set(MaxValue);
classFirstIt.Set(MinValue);
classSecondIt.Set(MaxValue);
}
outIt.Set(m_iter.GetClassLabel());
++m_iter ;
++outIt;
++classRedIt;
++classBlueIt;
++classSecondIt;
++classFirstIt;
}
// cOverlayData ....
this->SetInputOverlay(outputImage,ImageClassRed, ImageClassBlue );
this->SetInputOverlay(ImageClassFirst, ImageClassSecond );
//ViewOverlayData(true);
std::cout << "End Classif" << std::endl;
......@@ -549,6 +549,7 @@ std::cout << "End Classif" << std::endl;
}
template <class TPixel, class TPixelOverlay>
void
PrincipalImageViewAS<TPixel, TPixelOverlay>::SetClickable(bool b)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment