10
votes

OpenCV Imwrite 2.2 provoque une exception avec le message "Erreur OpenCV: erreur non spécifiée (impossible de trouver un écrivain pour l'extension spécifiée)" Sous Windows 7

Je porte une application OpenCV 2.2 à partir d'UNIX (qui fonctionne) sur Windows 7 64 bits et je reçois l'exception suivante lorsque cv :: imwrite s'appelle

"Erreur OpenCV: erreur non spécifiée (n'a pas pu trouver un écrivain pour l'extension spécifiée) dans une fonction inconnue, fichier highgui \ src \ loadsave.cpp"

L'application Unix d'origine fonctionne bien sur mes boîtes Mac et Linux.

Est-ce que quelqu'un sait quelle bibliothèque ou quelle configuration de compilateur-ci pourrait-elle être manquante qui rend ce travail sur Windows?

mise à jour:

J'ai fait les choses suivantes pour obtenir OpenCV en cours d'exécution:

  • Téléchargé les fichiers binaires pour V2.2 du site OpenCV pour Windows. J'utilise 2.2 parce que l'application d'origine l'utilise et je ne veux pas compliquer ma construction à ce stade.
  • J'essaie d'imwrite à un fichier .png. J'ai examiné le code OpenCV et a constaté la nécessité pour des libs externes pour les encodeurs tels que PNGS ou JPEG, donc j'ai essayé d'écrire à .PPM, .bmp, qui semble ne pas nécessiter de DEP, mais je reçois l'erreur identique.
  • Un exemple de mon utilisation est CV :: imwrite ("out.png", cv_scaled); où cv_scaled est de type CV :: mat avec format CV_32FC1
  • N'oubliez pas que le code identique fonctionne bien à UNIX

    Le fait .BMP ou .PPM ne fonctionne pas que cela soulève plus de questions:

    • Pourquoi ces formats ne fonctionnent-ils pas?
    • Y a-t-il un moyen de voir une liste d'encodeurs installés par programme?

      Merci encore une fois votre aimable assistance pour m'aider à déboguer ce problème.


2 commentaires

+1 Il se passe également avec imread () de OpenCV 2.3 sur vs 2005 sur ma boîte WinXP.


J'ai eu le même problème et j'utilisais des bibliothèques de libération de OpenCV lors de la création de débogage. J'ai changé les bibliothèques pour déboguer des bibliothèques et le problème résolu. Au cas où quelqu'un a fait le même genre d'erreur que moi.


3 Réponses :


9
votes

Votre installation actuelle d'OpenCV ne prend pas en charge le format de fichier que vous essayez de créer sur disque.

Vérifiez si l'extension du fichier est correcte. Si c'est le cas, vous devrez recompiler OPENCV et ajouter une assistance à ce format et éventuellement installer les bibliothèques qui vous manquent. P>

C'est tout ce qui peut être dit sans plus d'informations. P>

EDIT: strong> P>

Comme je n'ai pas également échoué à construire une application qui utilise l'interface C ++ d'OpenCV (V2.3 sur VS2005), j'ai fini par utiliser la solution de contournement suivante: Convertissez les types C ++ aux types C si nécessaire. p>

à convertir de iplimage * code> à cv :: mat code> est assez simple: p>

IplImage ipl_from_mat((IplImage)mat_img);

cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
// and then pass the memory address of the variable when you need it as IplImage*
cvShowImage("window", &ipl_from_mat); 


6 commentaires

Merci@karlphillip - J'ai mis à jour la question à inclure plus de détails sur mon utilisation


Je ne peux même pas obtenir imread () pour charger un JPG sur WinXP avec OpenCV 2.3. MDR. Je dois résoudre celui-ci avant d'arriver à imwrite () . Faites-nous savoir vos conclusions.


Quelles bibliothèques (libs / dlls) est votre application de référencement?


Juste le 2 qui sont nécessaires pour mon projet idizy imread / imwrite: opencv_highgui230.lib et openencv_core230.lib


Au fait, si j'utilise l'interface C au lieu du C ++, le code fonctionne.


@CVERTEX a mis à jour la réponse avec une solution de contournement temporaire pendant que nous ne pouvons pas obtenir cette chose pour fonctionner correctement. J'espère que ça vous aide.



0
votes

de la API OpenCV 2.2 :

La fonction imwrite enregistre l'image dans le fichier spécifié. Le format d'image est choisi en fonction de l'extension du nom de fichier, voir Imread pour la liste des extensions. Seulement 8 bits (ou 16 bits dans le cas de PNG, JPEG 2000 et TIFF) des images à canal ou à 3 canaux (avec 'BRG' Commande de canal) peut être enregistré à l'aide de cette fonction. Si le format, la profondeur ou l'ordre de canal est différent, utilisez le tapis :: ConvertTo et CVTColor pour le convertir avant d'enregistrer ou utilisez les fonctions d'E / S universelles XML pour enregistrer l'image au format XML ou YAML.

Vous avez peut-être plus de chance de convertir votre fichier en 8 ou 16 bits avant d'économiser.

Cependant, même avec des fichiers à canal à plusieurs canaux, j'ai eu des erreurs d'extension inconnues essayant d'enregistrer des fichiers JPG ou PNG, mais ont trouvé que BMP fonctionne.


0 commentaires

4
votes

essayez xxx

au lieu de xxx

ceci est un bug connu dans la version que vous utilisez.


0 commentaires