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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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