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

OpenCV Discussion :

Région d'intérêt


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Par défaut Région d'intérêt
    Est-il possible grâce à OpenCV de sélectionner un contour sur une image avec la souris?
    Ce que j'aimerai faire:
    1) afficher une image (j'ai déjà le code pour cette action)
    2) Définir un contour (Polygone) en sélectionnant des points avec la souris et stocker cette ROI dans une matrice binaire (0 si pixel hors de la ROI, 1 sinon) de la même façon que sous Matlab avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Img = imread('essai.jpg');
    figure;imagesc(Img, [0, 255]);colormap(gray);hold on;
    BW = roipoly;
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Par défaut
    Pas avec les ROI qui sont carré.
    Je ne sais pas s'il existe de méthode plus simple mais je pense qu'un moyen correct serait de créer un masque correspondant à ta zone sélectionnée et d'appliquer ce masque sur ton image de base.
    Un petit algo :
    Initialiser une nouvelle image de même dimension que ton image de base dont tout les pixels sont noir.(avec cvsetscalar, l'image c'est ton masque)
    Reporter les clics sur ton images de base pour dessiner des lignes blanche sur ton masque, (penser a fermer en dessinant la ligne entre le 1er et dernier point)
    Remplir la forme (avec cvfloodfill ou un truc comme ca)
    Appliquer le masque à ton image de base (avec cvadd)

  3. #3
    Membre averti
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Par défaut
    Citation Envoyé par Jérôme.L Voir le message
    Pas avec les ROI qui sont carré.
    Je ne sais pas s'il existe de méthode plus simple mais je pense qu'un moyen correct serait de créer un masque correspondant à ta zone sélectionnée et d'appliquer ce masque sur ton image de base.
    Un petit algo :
    Initialiser une nouvelle image de même dimension que ton image de base dont tout les pixels sont noir.(avec cvsetscalar, l'image c'est ton masque)
    Reporter les clics sur ton images de base pour dessiner des lignes blanche sur ton masque, (penser a fermer en dessinant la ligne entre le 1er et dernier point)
    Remplir la forme (avec cvfloodfill ou un truc comme ca)
    Appliquer le masque à ton image de base (avec cvadd)
    Merci pour ce petit algo, c'est effectivement ce que je pensais faire. Par contre je ne sais justement pas comment faire pour dessiner les lignes sur l'image de base et pouvoir envoyer les coordonnées correspondantes dans la matrice du masque.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Par défaut
    J'espère que cvline n'est pas la réponse à "comment faire pour dessiner les lignes sur l'image de base" ?
    Pour récupérer les coordonnées du clic sur l'image et ben ça dépend.
    Moi qui utilise Qt par exemple j'implémente mousePressEvent(QMouseEvent *event) et mouseReleaseEvent(QMouseEvent *event).

  5. #5
    Membre averti
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Par défaut
    Citation Envoyé par Jérôme.L Voir le message
    J'espère que cvline n'est pas la réponse à "comment faire pour dessiner les lignes sur l'image de base" ?
    Pour récupérer les coordonnées du clic sur l'image et ben ça dépend.
    Moi qui utilise Qt par exemple j'implémente mousePressEvent(QMouseEvent *event) et mouseReleaseEvent(QMouseEvent *event).
    J'ai étudié de plus près Qt et OpenCV et je pense n'utiliser que OpenCV étant donner qu'OpenCV dispose d'un GUI et permet de gérer les Mouse events.
    Je pense qu'en utilisant cvFillPoly cela me permettrait d'obtenir un masque pour déterminer ma ROI.
    Par contre FillPoly prend comme paramètre un contour qui correspond à un tableau de points.
    Avec ce petit code je peux récupérer les coordonnées d'un point de l'image en cliquant dessus:
    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
    //Includes
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <stdio.h>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
     
    using namespace std;
    using namespace cv;
     
    void on_mouse(int, int, int, int, void* );
     
    int main() 
     
    {
    	Mat img = imread("C:/img.jpg",0);
    	namedWindow("myWindow", CV_WINDOW_AUTOSIZE);
    	cvSetMouseCallback("myWindow", on_mouse, 0);
        imshow("myWindow", img);
    	waitKey(0);
    }
     
    void on_mouse(int evt, int x, int y, int flags, void* param)
    {
     
        if(evt == CV_EVENT_LBUTTONDOWN)
    	{
    		Point pt(x,y);
    		cout<<"Coordonnees du point pt : "<<x<<","<<y<<endl;
    	}
    }
    Ce que j'aimerai faire c'est stocker les coordonnées des points sur lesquels je clique dans un tableau afin de pouvoir utiliser ce tableau comme paramètre dans la fonction FillPoly.
    Comment puis-je faire pour ajouter les coordonnées de chaque point à chaque clique dans un tableau?

    EDIT: C'est bon, en utilisant des variables statiques.
    Sujet résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/09/2010, 01h35
  2. Réponses: 6
    Dernier message: 16/05/2008, 11h25
  3. Réponses: 7
    Dernier message: 11/06/2007, 14h11
  4. Réponses: 3
    Dernier message: 04/06/2007, 12h26
  5. Réponses: 10
    Dernier message: 25/05/2007, 10h54

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