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

Bibliothèques C++ Discussion :

appel d'une fonction utilisant Opencv depuis une dll c++


Sujet :

Bibliothèques C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 32
    Points
    32
    Par défaut appel d'une fonction utilisant Opencv depuis une dll c++
    Bonsoir,

    J'ai créé une dll d'un programme C++ qui utilise la bibliothèque Opencv. Je suis en train d'essayer l'appel de l'une des fonctions depuis le dll dans un programme c#.
    Mon problème c'est lorsque j'effectue un appel d'une fonction faisant elle même l'appel d'une fonction opencv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    extern "C"
    {
    int EXPORT_API PrintChannelsNumber(std::string image){
      cv::Mat im = cv::imread(image);
      int s=im.channels();
      return s;
    }
    }
    une fenêtre apparaît affichant l'erreur suivante :

    Debug Assertion Failed!
    Program: C:\...\.exe
    File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
    Line: 52
    Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
    For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

    Pouvez-vous me dire s'il vous plaît que peut être le problème et comment le résoudre?
    Merci d'avance pour vos réponses.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Le problème, c'est certainement le paramètre std::string de la fonction PrintChannelsNumber.

    Il faut utiliser un WCHAR* ou (wchar_t*) dans le paramètre de la dll. Ensuite il faut convertir de WCHAR* ou (wchar_t*) à std::string. Le mieux serait d'utiliser std::wstring. Mais il est étrange que la fonction openCV nécessite un std::string. Il faut vérifier s'il n'y a pas une surchage, sinon cela voudrait que la fonction openCV ne gère pas les accents. Et puis vérifier la compilation sous UNICODE.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 32
    Points
    32
    Par défaut
    Bonjour,
    Merci tout d'abord pour votre réponse.

    Citation Envoyé par moldavi Voir le message
    Il faut utiliser un WCHAR* ou (wchar_t*) dans le paramètre de la dll. Ensuite il faut convertir de WCHAR* ou (wchar_t*) à std::string. Le mieux serait d'utiliser std::wstring.
    Mais il est étrange que la fonction openCV nécessite un std::string. Il faut vérifier s'il n'y a pas une surchage, sinon cela voudrait que la fonction openCV ne gère pas les accents.
    J'ai vérifié alors dans la documentation de OpenCV et j'ai trouvé que la fonction imread prend comme paramètres : un char* et 1 donc j'ai modifié le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int EXPORT_API PrintChannelsNumber(std::wstring image){
      char* img=(char*)image.c_str(); 
      cv::Mat im = imread(img,1);
      int s=im.channels();
      return s;
    }
    et en c#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	[DllImport ("dllOpencvUnity")]
    	private static extern int PrintChannelsNumber([MarshalAs (UnmanagedType.LPWStr)] string str);
    Le problème est toujours le même!
    Merci encore pour votre aide.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 21
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    C'est la signature de votre fonction C PrintChannelsNumber qui pose problème.
    Pour faire de l'interop C <=> C#, vous ne pouvez pas utiliser des types C++, pas de std::string.

    La signature de votre fonction C# devrait être la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport ("dllOpencvUnity")]
    private static extern int PrintChannelsNumber([MarshalAs (UnmanagedType.LPStr)] string str);
    et celle de votre fonction C correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int EXPORT_API PrintChannelsNumber(const char* image);
    [MarshalAs (UnmanagedType.LPStr)] signifie au compilateur C# qu'il doit automatiquement convertir le type System::String en char[] à terminaison zéro pour réaliser l'appel de la fonction externe. LPWStr aurait converti en w_char[] à terminaison zéro.

    Puis comme dit par moldavi, si la fonction imread() veut un const char* en entrée, c'est bon. Si c'est un std::string, alors imread(std::string(image)) devrait faire l'affaire. Je vous laisse adapter les signatures C# et C si jamais c'est un w_char* ou un std::wstring que imread veut.

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 27
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par Volfoni Voir le message
    et celle de votre fonction C correspondante :
    int EXPORT_API PrintChannelsNumber(const char* image);

    [MarshalAs (UnmanagedType.LPStr)] signifie au compilateur C# qu'il doit automatiquement convertir le type System::String en char[] à terminaison zéro pour réaliser l'appel de la fonction externe. LPWStr aurait converti en w_char[] à terminaison zéro.
    Merci Volfoni :)

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/10/2012, 16h01
  2. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  3. passage d'une fonction en parametre d'une fonction
    Par psylox dans le forum Langage
    Réponses: 5
    Dernier message: 06/10/2008, 16h40
  4. Réponses: 3
    Dernier message: 30/04/2008, 17h44
  5. Réponses: 1
    Dernier message: 25/05/2007, 14h33

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