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 :

Erreur de compilation lors d'un bitwise_and


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Erreur de compilation lors d'un bitwise_and
    Bonjour à tous,

    Je me permet de venir vous voir après de nombreuses recherches infructueuses sur un problème déjà connus mais auquel je n'arrive pas à trouver de solution.

    Ce que mon code doit faire : Récupérer une image (portrait sur fond relativement blanc) et la détourer.

    Voici comment je m'y prends :
    -Je fais passer mon image en niveau de gris
    -je lui applique un seuillage avec une valeur de seuil arbitraire
    -j'effectue un blur sur l'image
    -je fais un floodfill sur la forme afin d'avoir mon portrait remplit de noir et l'exterieur completement blanc avec erosion/dilatation (je ne suis un pur débutant en imagerie, je n'ai donc peut être pas appliqué les filtre/ouverture morphologique de la bonne manière mais le résultat correspond jusque là à ce que je recherche.

    Voici le code qui répond à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cvtColor(image, imageNB, CV_BGR2GRAY);
        imageNB.convertTo(imageNB, CV_8UC1);
        threshold(imageNB, imageNBThresholded, 160, 255, CV_THRESH_BINARY);
        blur( imageNBThresholded, imageNBBlured, Size(5,5));
        FiltreNB=findCannyDraw(imageNBBlured);
    Et ci-joint la fonction findCannyDraw :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Mat drawing = Mat::zeros(image.rows + 2, image.cols + 2, CV_8UC1);
       floodFill(image, drawing, Point(3,3), 255, 0, Scalar(), Scalar(), 4 + (255 << 8) + FLOODFILL_MASK_ONLY);
     
        Mat kernel;
        Point anchor(2, 2);
        Size ksize(5,5);
        kernel = getStructuringElement(MORPH_ELLIPSE, ksize, anchor);
        dilate(drawing, drawing, kernel);
        erode(drawing, drawing, kernel);
     
       // return drawing;
        return  drawing;
    A ce moment, j'ai donc FiltreNB qui qui est mon filtre binaire (et qui correspond au détourage que je recherche : la partie blanche est celle à détourer de mon image de base et la partie noir est la partie que je veux garder de mon image de base) et image qui est mon image de base.

    Jusque la, aucun problème donc. Il ne me reste donc plus qu'a faire un ET logique entre les deux images pour ne garder de mon image de base QUE les pixels noirs correspondant de mon filtre.

    J'ai donc appliqué la fonction bitwise_and après avoir fait passé mon image en monochannel (car c'est le problème qui est tout le temps remonté dans les recherches que j'ai pu effectuer) avec la fonction cvtColor.

    Voici donc les lignes de code correspondant à mon && logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        cvtColor(image, image, CV_BGR2GRAY);
        bitwise_and(image, FiltreNB, image);
    Seulement à la compilation j'ai le message d'erreur suivant :
    OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array') in binary_op, file C:\opencv\sources\modules\core\src\arithm.cpp, line 1021
    terminate called after throwing an instance of 'cv::Exception'
    what(): C:\opencv\sources\modules\core\src\arithm.cpp:1021: error: (-209) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function binary_op

    Je serais vraiment extrêmement reconnaissant si quelqu'un ici bas était susceptible de me donner un coup de main, car je dois reconnaitre que je suis en manque d'idée après avoir bloqué plusieurs heures sur le problème ...

    D'avance merci.

    Cordialement,

    Inso

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Ton image : finalShow vient d'ou ???
    Tu ne la definit pas dans le code que tu donne.

    Sinon, une image exemple nous aiderait a te conseiller sur une bonne methode pour resoudre ton probleme.
    Mais de ce que tu dis, une simple segmentation ou un active contour me semble bien adapate a ton probleme.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Tout d'abord merci pour ta réponse. Pour ce qui est du finalShow, c'est une erreur grotesque de copier coller. Il s'agit en fait du FiltreNB. J'ai édité mon message. Désolé pour cette erreur.

    Apparemment, mon problème vient de ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Mat drawing = Mat::zeros(image.rows + 2, image.cols + 2, CV_8UC1);
       floodFill(image, drawing, Point(3,3), 255, 0, Scalar(), Scalar(), 4 + (255 << 8) + FLOODFILL_MASK_ONLY);
    Qui étaient destinées à colorier l'extérieur de mon portrait en blanc et l'intérieur en noir.
    J'ai donc résolu mon problème en reprenant ma méthodologie :

    J'ai d'abords détecté les contours présents dans mon image (avec un findContours), puis j'ai sélectionné le plus grand contours.
    Je l'ai ensuite dessiné avec drawContours.

    Et ce n'est qu'ensuite que j'ai floodfill l'extérieux de ma shape en blanc.
    Ensuite, avec une simple convertion GRAY2RGB j'ai pu appliquer mon bitwise sans erreur de compilation cette fois.

    C'est très probablement due à une mauvaise utilisation du zeros et du floodFill que cette erreur est apparue.

    Je mets ici le code pour la détection du plus grand contours si ca peut interesser quelqu'un :

    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
     vector<vector<Point> > contours;
            vector<Vec4i> hierarchy;
     
            findContours(input, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
            double maxArea = 0;
            int index = -1;
            for(int i = 0 ; i < contours.size() ; i++){
                double area = contourArea(contours.at(i));
                if(maxArea<area){
                    maxArea=area;
                    index=i;
                }
            }
     
            if (index == -1) {
                std::cout << "Image file not found\n";
            }
            drawContours(input, contours, index, Scalar(255));
     
            floodFill(input, cv::Point(0,0), 255, 0, Scalar(), 255);
    Encore merci pour l'attention que tu as pu me porter.

    Cordialement,

    Inso

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/09/2012, 21h23
  2. Erreur de compilation lors d'appel d'autre classe
    Par DevLib dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 28/07/2011, 11h26
  3. [EJB3] Erreur de compilation lors de l'ajout des annotations
    Par rabebIF5 dans le forum Java EE
    Réponses: 4
    Dernier message: 05/04/2009, 19h40
  4. Réponses: 7
    Dernier message: 21/06/2007, 11h27
  5. Réponses: 20
    Dernier message: 14/09/2006, 10h56

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