IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[vtk] imagerie medicale


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut [vtk] imagerie medicale
    Bonjour,

    je me lance dans un projet d'imagerie medicale (charger, visualiser, traiter et sauver des donnees 2 ou 3d au format raw ou autre). J'utilise pour la premiere fois la librairie vtk.
    Je code directement en c++ et j'ai du mal a trouver de la bonne documentation ou des exempls simples d'utilisation (surtout que la plupart sont ecrits en Tcl), c'est pourquoi j'ouvre ce sujet.

    J'utilise un CMakeList.txt pour dire quelles librairies sont utiles et creer les liens necessaires a la compilation.

    Premier probleme qui se pose, pour une simple visualisation basique d'une image 2d au format raw. Je la lit avec ImageReader, et je souhaite la visualiser avec vtkImageViewer.
    J'ai trouve certains exemples ou imageviewer est utiliser avec reslice. Un autre exemple ou image viewer est utilise avec QT. Dans tous les cas le code etaient incomplet et je n'ai donc pas reussit a refaire cela. Pouvez-vous m'aider?
    pourquoi a-ton besoin de QT? Dans ce cas, si on utilise QVTKWidget.h, quel package doit-on inclure dans le CMakeList?

    Voici mon CMakeList :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PROJECT( test )
     
    SET( VTK_DIR /usr/lib/vtk-5.0 )
     
    INCLUDE ( ${CMAKE_ROOT}/Modules/FindVTK.cmake )
     
    IF ( USE_VTK_FILE )
      INCLUDE( ${USE_VTK_FILE} )
    ENDIF ( USE_VTK_FILE )
     
    INCLUDE_DIRECTORIES(${OT_SOURCE_DIR})
     
    ADD_EXECUTABLE( test main.cpp)
     
    TARGET_LINK_LIBRARIES( test vtkIO vtkGraphics vtkRendering QVTKWidget)

    et un essai de lecture affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include "vtkImageReader.h" // to read an image
     
    #include "vtkImageViewer.h" //to display a 2d image
     
    //QT
    #include "QVTKWidget.h"
    #include "qapplication.h"
     
     
     
    #include <iostream>
     
     
     
    using namespace std ;
     
     
    int main(int argc, char **argv) {
     
     
     QApplication app(argc, argv);
     
      QVTKWidget widget;
      widget.resize(256,256);
     
    #if QT_VERSION < 0x040000
      app.setMainWidget(&widget);
    #endif
     
     
     
    //lecture. essai fichier 2d
    vtkImageReader *monImg = vtkImageReader::New();
    monImg->SetFileName("data/r15noise-slice110.vtk.dcm.raw");
    monImg->SetNumberOfScalarComponents(1);
    monImg->SetDataExtent(0,511,0,511,0,0);
    monImg->SetDataScalarTypeToUnsignedChar();
     
    //simple visualisation 2d
     
      vtkImageViewer* image_view = vtkImageViewer::New();
      image_view->SetInputConnection(monImg->GetOutputPort());
     
      widget.SetRenderWindow(image_view->GetRenderWindow());
      image_view->SetupInteractor(widget.GetRenderWindow()->GetInteractor());
     
      image_view->SetColorLevel(138.5);
      image_view->SetColorWindow(233);
     
      widget.show();
     
      app.exec();
     
     
      image_view->Delete();
      monImg->Delete();
     
    return 0;
     
    }

    J'ai reussi a faire afficher l'image avec un simple viewer (je le cree, j'y met mon image puis je fais un Render) mais l'image s'affiche un quart de seconde et se ferme.

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    VTK travaille sur un renderer (en fait c'est une "zone écran" OpenGL). Mais il ne gère pas l'affichage de la fenêtre qui contient cette "zone écran". Pour cela il te faut utiliser une librairie graphique. Avec le langage C++ tu peux utiliser la librairie Qt (http://qt.nokia.com/products/) et la classe QVTKWidget te permet de lier le rendu de VTK avec la fenêtre Qt.

    Ton problème est que tu ne passes pas en "mode interactif" cad que l'appli fait son taf (charge l'image et l'affiche) et ensuite quitte. Pour éviter cela tu dois aller dans la boucle évènementielle de Qt (qui normalement est exec...) et qui ne doit sortir que lorsque tu appuies sur la croix de la fenêtre (ou alt+f4 enfin les trucs classiques quoi). Donc je ne comprends pas trop pourquoi ça ne marche pas mdr .

    Essaye de voir un exemple d'utilisation de Qt avec VTK (pas dans les fichiers tests, de vrais exemples), vois un exemple de Hello World avec Qt. Essaye de rajouter cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );
    Dans tous les cas c'est plus un problème côté Qt que VTK (un problème d'évènement)...

    J'espère t'avoir aidé à cerner un peu plus le problème.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    donc je suis obligee d'utiliser QT pour un simple viewer? Ou bien il y a d'autres solutions?

    Et mon probleme lorsque j'utilise QT avec vtk, est que je ne sais pas quel element je dois inclure dans le CMakeList. Parceque pour l'instant quand je compile, le compilo ne connait aucunes des fonctions de QT.

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Et bien tu dois lier la librairie Qt à ton programme. Va voir du côté de la doc de Qt pour la compilation de ce dernier, un lien :

    http://qt.developpez.com/doc/latest/installation.html

    Et tu dois apprendre cmake.

    Après y'a peut-être des exemples d'utilisation de VTK avec Qt avec la CMakeList déjà faite mais je connais pas, à toi de trouver.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    ok merci.
    Mais j'ai fait une version, ou je fais moi meme le pipeline reader, interactor, actor, render et renderer. Dans ce cas la fenetre reste bien affichee (mais noire car je ne lui ai rien passe).
    Par contre je ne sais pas a quelle etape je dois passer mon image lue (monImg) a mon ensemble actor/interactor/render. Dans les exemples cela passe par un mapper qui est lui-meme passe a l'actor, mais je ne pense pas que le mapper soit indispensable ici, donc j'essaye de passer directement l'image a l'actor sans succes.

    aussi je rencontre souvent l'erreure comme quoi la suite SetInput(monImg->GetOutput()) est incorrect... que la fonction SetInput n'existe pas etc, alors que c'est ce qui est utilise en Tcl " ‘class vtkActor’ has no member named ‘SetInput’").

    voici le code sans utiliser le ImageViewer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include "vtkImageReader.h"
    #include "vtkImageReslice.h"
    #include "vtkImageViewer.h"
    #include "vtkJPEGWriter.h"
     
     
    #include "vtkRenderer.h"
    #include "vtkRenderWindow.h"
    #include "vtkRenderWindowInteractor.h"
    //#include "vtkActor.h"
     
     
    #include <iostream>
     
    using namespace std ;
     
    void function4()
    {
     
    //lecture. essai fichier 3d
    vtkImageReader *monImg = vtkImageReader::New();
    monImg->SetFileName("data/r15noise-slice110.vtk.dcm.raw");
    monImg->SetNumberOfScalarComponents(1);
    monImg->SetDataExtent(0,511,0,511,0,0);
    monImg->SetDataScalarTypeToUnsignedChar();
    monImg->Update();
     
     
    //simple visualisation 2d 
     
    //RenderWindow and Renderer
    vtkRenderer *ren1 = vtkRenderer::New();
    vtkRenderWindow *renWin = vtkRenderWindow::New();
    renWin->AddRenderer(ren1);
    renWin->SetSize(512,512);
     
     
    //Interactor
    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
    iren->SetRenderWindow(renWin);
     
    // add actor to the scene
    vtkActor * actor = vtkActor::New();
    actor->SetInput(monImg->GetOutput());
    ren1->AddActor(actor);
     
    // render an image
    ren1->Render();
     
    // begin mouse interaction
    iren->Start();
     
     
    }

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Un imagereader permet simplement de lire une image d'un fichier mais ne permet pas de l'afficher dans la scène 3D. Pour cela il faut le transformer en un DataSet (qui contient des points et un ensemble de polygones définis sur ces points) qui va être transmis à un mapper (qui va décider de l'affichage de ces données) qui va être transmis à un actor (qui va décider du matériaux, de la position de l'ensemble etc.). Il y a plusieurs algos qui permettent de passer d'un image à un polydata par exemple vtkImageToPolyData.

    Pour les images il existe un raccourci : vtkImageActor. Mais il faut transformer ton image en unsigned char voir le warning de :

    http://www.vtk.org/doc/nightly/html/...mageActor.html

    Un exemple :

    http://public.kitware.com/cgi-bin/vi...ype=text/plain

    Pense bien que VTK c'est des données (une image ou un vtkSource) qui sont passées dans des filtres (par exemple vtkImageSlice... ou vtkImageToPolyData) qui arrivent dans un mapper qu'on connecte à un actor et qu'on affiche.

    Je te conseille de lire ceci en entier et de bien l'assimiler :

    http://cherokee.ncsa.uiuc.edu/~semer...3_document.htm

    Ca t'explique toute la philosophie de VTK. Avec ça tu devrais y voir plus clair.

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    merci beaucoup pour tes reponses.
    J'ai deja lu ce tutoriel (et plein d'autres), mais effectivement jvoyais qu'il y avait un probleme du fait que j'avais une ImageData et qu'on travaille souvent sur des PolyData. Donc avec la transformation ca devrait aller.
    J'avais tout de meme reussi sans faire ca un psuedo volumerendering.

    Par contre j'ai fait un test ou simplement je lis les donnes avec un ImageReader, et ensuite jles ecris dans un nouveau fichier raw, avec ImageWriter. Et effectivement ca ne marche pas, il y a un probleme quelque part, donc la aussi il faut passer par PolyData?

    Encore merci, jvais retourner tester ca et me documenter un peu plus.

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    premier probleme resolu, pour la lecture visualisation : en fait je faisais un "monImg->SetDataScalarTypeToUnsignedChar();" lors de la lecture de mon fichier raw. Apparament ca faisait tout foirer. Par contre pour le volume rendering il le faut...
    Par contre, avec ImageViewe(1 ou 2) voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    vtkImageReader *monImg = vtkImageReader::New();
    monImg->SetFileName("data/SL59-r15noise.raw");
    monImg->SetNumberOfScalarComponents(1);
    monImg->SetDataExtent(0,511,0,511,0,40);
    //monImg->SetDataScalarTypeToUnsignedChar();
    monImg->Update();
     
     
    //simple visualisation 2d d'une slice
     
    vtkImageViewer2* image_view = vtkImageViewer2::New();
    image_view->SetInputConnection(monImg->GetOutputPort());
    image_view->SetZSlice(20);
    image_view->SetColorLevel(138.5);
    image_view->SetColorWindow(233);
     
    vtkRenderWindowInteractor* viewInt = vtkRenderWindowInteractor::New();
    image_view->SetupInteractor(viewInt);
     
     
    //Interactor
    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
     
    image_view->SetupInteractor(iren);
    image_view->Render();
    iren->Start();
    ca affiche bien la premiere slice, et les interactions avec la souris se font. Par contre si j'utilise le setZSlice, j'ai le message "setZslice is deprecated blablabla" apparament il a ete supprime des nouvelles versions. On me conseille d'utiliser SetSlice avec ImageViewer2, je le fais mais ca ne marche pas vraiment non plus (l'image s'affiche un quart de seconde et disparait).

    voici l'erreure associee :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X Error of failed request:  GLXBadDrawable
      Major opcode of failed request:  144 (GLX)
      Minor opcode of failed request:  11 (X_GLXSwapBuffers)
      Serial number of failed request:  89
      Current serial number in output stream:  89

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Tu vas sur des sentiers qui me sont inconnus, désolé je ne peux plus t'aider sur ce coup là.

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    ah zut, merci quand même. Mais j'ai trouvé une de mes erreures, je lisais des UnsignedShort, alors que mes données sont des SignedShort, donc j'utilise maintenant la fonction SetDataScalarToShort (ca donne bien des signed? ou il y a une fonction a ajouter?). quelqu'un sait-il comment récupérer les valeurs maximales et minimales d'une image?
    Et par contre je n'arrive pas à écrire un fichier raw, qui devrait être identique à celui écrit. Je ne sais pas si ca vient de cette histoire de signed short. Aussi j'ai remarqué que sous vtk l'ordre des données selon y est inversé. Ca peut aussi venir de là...

Discussions similaires

  1. Imagerie IRM : de coupes à 3D
    Par emilieGre dans le forum Images
    Réponses: 20
    Dernier message: 05/11/2012, 14h12
  2. Faire apparaitre les os [Imagerie medicale]
    Par Djang0 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 29/04/2009, 08h31
  3. imagerie medicale 3d
    Par mourad7519 dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 09/05/2008, 01h49
  4. Fusion en imagerie
    Par kmaniche dans le forum Traitement d'images
    Réponses: 14
    Dernier message: 12/10/2006, 16h21
  5. Réponses: 3
    Dernier message: 11/01/2005, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo