Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer un objet avec un Qt pushbutton ?

Problème avec LibRaw

    16 avril 2018 à 23:40:07

    Bonjour,

    Je teste des algos de traitement d'image sur des raw (Canon CR2) en C++ avec LibRaw et openCV. (je commence à être familier)

    En console et tout dans le main, tout va bien. J'ai eu envie de faire une interface graphique simple avec Qt (je débute vraiment avec Qt)

    Et là, c'est le drame. J'ai 2 soucis, un général et un particulier.

    Premièrement, je voudrais créer un bouton "open" qui ouvre un fichier raw avec l'explorateur de windows. Le chemin d'accès ainsi récupéré devra permettre d'instancier un objet (LibRaw/openCV). Problème "d'architecture" : où l'instancier exactement ?

    Directement dans le slot du pushButton ça va pas, il est détruit à la fin. Je veux le récupérer pour faire du traitement derrière.

    Est ce que mon objet openCV doit être un attribut de la classe Mainwindow ?

    Est ce que je crée une classe spéciale qui dérive de Q_Object pour encapsuler un objet openCV ? ensuite il doit être possible d'utiliser les signaux/slots à fond ?

    Est ce qu'il faut créer l'objet dans le main et ruser pour le controler avec Qt (avec des pointeurs ou par référence peut être?) ?

    Quelles sont les bonnes pratiques, les pratiques à éviter ?

    J'ai déjà lu quelques articles sur le pattern "modèle vue controleur" mais ça m'aide pas bien en pratique. Et ça a pas l'air tout à fait adapté

    C'est sans doute une question classique mais je ne trouve pas les termes en anglais pour chercher moi même en profondeur.

    Second souci, un peu particulier.

    Comme j'avais pas les idées claires sur ma première question, j'ai pour l'instant fait au plus simple. J'ai déporté le gros du code dans le slot du pushButton. Le programme compile mais à l'execution il plante quand j'appuie sur le bouton :

    The inferior stopped because it triggered an exception.
    Stopped in thread 0 by: Exception at 0x7ff64f07a9e8, code: 0xc00000fd: stack_overflow, flags=0x0 (first chance).

    J'ai finis par comprendre que ça venait de l'instanciation de l'objet LibRaw.

    Exemple :

    ça, ça marche pas :

    void MainWindow::on_openFile_clicked()
    {
        QString rawFilename = QFileDialog::getOpenFileName(this,
                                                           "Open Input Image",
                                                           QDir::currentPath(),
                                                           "Images (*.CRW *.CR2 *.TIFF *.NEF *.jpg)");
        if(QFile::exists(rawFilename))
        {
           std::string rawFilenameSTD = rawFilename.toStdString();
           LibRaw myRaw;
           myRaw.open_File(rawFilenameSTD.c_str()); // LibRaw utilise des char et pas des string
        }
    }

    ça, ça marche :

    void MainWindow::on_openFile_clicked()
    {
        QString rawFilename = QFileDialog::getOpenFileName(this,
                                                           "Open Input Image",
                                                           QDir::currentPath(),
                                                           "Images (*.CRW *.CR2 *.TIFF *.NEF *.jpg)");
        if(QFile::exists(rawFilename))
        {
          std::string rawFilenameSTD = rawFilename.toStdString();
          cv::Mat toto;
          toto = cv::imread(rawFilenameSTD);
        }
    }


    Sur internet impossible de trouver une réponse. D'un côté on est pas beaucoup à utiliser LibRaw avec Qt... Manque de doc et de communauté.

    Mais bon, est ce que c'est moi qui fais un truc moche, ou c'est LibRaw qui a un problème ?

    Désolé pour le pavé, bonne nuit et merci par avance ;)



    -
    Edité par hamster1er 16 avril 2018 à 23:48:06

    • Partager sur Facebook
    • Partager sur Twitter
      19 avril 2018 à 17:30:26

      up ?

      Si ma question est vraiment trop débile il faut me le dire (quand même me donner 2/3 mots clés pour chercher correctement sur Google) ;-)

      Par ailleurs j'ai acheté ça : https://www.packtpub.com/application-development/computer-vision-opencv-3-and-qt5

      C'est pile poil ce qu'il me faut. Pour l'instant j'en suis au chapitre 3, mais j'espère trouver la réponse à mon problème dans le chapitre 5, 6 ou 8...

      (si c'est pas le cas, je reviendrai sans doute ici lol )

      Pour LibRaw par contre j'arrive pas à trouver le souci...

      Question subsidiaire : j'ai lu sur ce forum qu'il ne fallait pas lancer de tâches lourdes dans un slot. ça parait logique, mais dans ce cas quand on veut contrôler un objet avec une interface graphique, quand est ce qu'on doit calculer ? (sous entendu où dans le code ? on est pas toujours obligé d'utiliser QThread si ?)

      -
      Edité par hamster1er 19 avril 2018 à 17:36:19

      • Partager sur Facebook
      • Partager sur Twitter

      Créer un objet avec un Qt pushbutton ?

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown