OUTDATED – Modes d’erreur pour OpenCV

J’utilise OpenCV 1 pour effectuer certains traitements d’image et je suis confus quant à la fonction cvSetErrMode (qui fait partie de CxCore).

OpenCV a trois modes d’erreur.

  • Feuille: Le programme est terminé après l’appel du gestionnaire d’erreurs.
  • Parent: Le programme n’est pas terminé, mais le gestionnaire d’erreurs est appelé.
  • Silence: similaire au mode parent, mais aucun gestionnaire d’erreurs n’est appelé.

Au début de mon code, j’appelle cvSetErrMode (CV_ErrModeParent) pour passer du mode “feuille” par défaut au mode “parent” afin que mon application ne se termine pas avec une fenêtre contextuelle d’exception / assertion. Malheureusement, le mode ‘parent’ ne semble pas fonctionner. La boîte de dialog du message s’affiche toujours et mon application se termine toujours.

Si j’appelle cvSetErrMode (CV_ErrModeSilent), il devient alors silencieux et ne ferme plus l’application ou n’ouvre une boîte de dialog … mais cela signifie également que je ne sais pas qu’une erreur s’est produite. Dans ce cas, je pense que le mode est correctement défini.

Quelqu’un at-il déjà eu ce comportement auparavant et pourrait-il être en mesure de recommander une solution?

Références:

  • Référence de la fonction cvSetErrMode

  • Ouvrir la référence du mode de traitement des erreurs CV

Je vais répondre à ma propre question, car après quelques manipulations, j’ai trouvé ce qui se passait.

Lorsque vous passez en mode ‘parent’ au lieu du mode feuille, il existe un gestionnaire d’erreurs appelé cvGuiBoxReport (). cvGuiBoxReport () est le gestionnaire d’erreurs par défaut. Il semble que même en mode parent, cvGuiBoxReport () termine toujours votre application! Oops.

Donc, pour contourner ce problème, vous pouvez écrire votre propre gestionnaire d’erreurs, redirect l’erreur à traiter et NE PAS mettre fin à l’application.

Un exemple de gestionnaire d’erreur:

int MyErrorHandler(int status, const char* func_name, const char* err_msg, const char* file_name, int line, void*) { std::cerr << "Woohoo, my own custom error handler" << std::endl; return 0; } 

Vous pouvez configurer le mode parent et redirect votre erreur avec:

 cvSetErrMode(CV_ErrModeParent); cvRedirectError(MyErrorHandler); 

Au cours d’une semaine de plantage de serveurs après le téléchargement d’images vides ou corrompues sur notre serveur de traitement d’images, voici quelques reflections sur la façon dont j’ai résolu les subtilités de la gestion des erreurs OpenCV. Nous utilisons V2.2 sur un serveur C ++.

Le problème se pose dans cv::imread() et cv::imdecode() lorsque l’image à charger est corrompue (ou vide). Normalement, OpenCV se contente de quitter le processus avec quelques messages d’erreur, ce qui n’est pas une bonne idée lorsque vous exécutez un serveur qui devrait fonctionner à tout moment.

Vérification du code source à l’ adresse https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/core/include/opencv2/core/core.hpp. J’ai ignoré l’allusion dans les commentaires sources de cv::setBreakOnError() et a découvert que le modèle suivant fonctionne:

 cv::setBreakOnError(true); // Can be set globally ... ... cv::Mat srcImage = cv::imread(filename, 1); if (!srcImage.data) throw std::exception("bad image"); 

cv::imread() ne va plus quitter le processus, mais passe le contrôle à votre propre gestion des exceptions, vous permettant ainsi de faire ce que vous voulez.

Cette découverte a permis de sauver beaucoup de chagrin.