2009-01-27 8 views
2

Lorsque je compile mon application Windows (appelée CrosslinesDetection) dans Visual C++ 2005, y compris OpenCV 1.1, une bibliothèque de vision par ordinateur, je ne reçois aucune erreur de compilation ou de liaison, mais lorsque je l'exécute, un point et se fige et Windows dit le texte suivant:Comportement étrange avec OpenCV

"Unhandled exception at 0x7c915223 in CrosslinesDetection.exe: 
0xC0000005: Access violation writing location 0x00030ffc." 

le programme est une commune C++ de Windows Applikation avec deux lignes de code OpenCV:

IplImage *img = cvCreateImage(cvSize(1024, 768), IPL_DEPTH_8U, 1); 
cvReleaseImage(&img); 

le comportement étrange est maintenant, si je - inclure les lignes OpenCV, le programme lance l'exception - exclure les lignes OpenCV, le programme fonctionne correctement.

J'ai utilisé les bibliothèques OpenCV dans un autre projet sans aucun problème. En particulier, j'ai fait un projet C# pour l'interface graphique et un projet C++ compilé en tant que DLL en arrière-plan. Si je crée une telle solution pour les lignes ci-dessus, je n'ai pas de problèmes lors de l'exécution.

Quelqu'un a une idée, ce qui pourrait causer cette erreur?

Merci pour toute aide, Stefan


Merci pour les commentaires.

En attendant, j'utilise un projet minimal pour tester. Je ne comprends toujours pas complètement le problème, mais entre-temps, j'ai compris, que l'excpetion se produit, quand j'inclue une bibliothèque tierce (d'uEye).

Si j'utilise une seule fonction d'OpenCV et de la bibliothèque uEye du projet, une exception se produit. Si j'utilise une seule fonction d'OpenCV ou d'uEye, aucune exception n'est levée. Donc, ces bibliothèques semblent être quelque peu incompatibles, ou encore il y a un autre problème. Cependant, je ne sais pas comment le détecter.


Non, pas pour le moment. Dans l'exemple minimal, les fonctions ne sont pas liées. Une fonction initialise la caméra et l'autre fonction initialise une structure d'image.


Mais peut-être l'erreur est ailleurs ...

J'ai créé dans Visual Studio un Windows Form Application C++. J'ai ajouté à la forme d'un bouton ainsi que la fonction correspondante dans le fichier Form1.h:

private: System::Void Form1_Click(System::Object^ sender, System::EventArgs^ e) { 
    OpenCamera(); 
    IplImage * img = cvCreateImageHeader(cvSize(1024, 768), IPL_DEPTH_8U, 1); 
    cvReleaseImage(&img); 
    CloseCamera(); 
} 

Et j'ai ajouté les headeras au début de Form1.h:

#include "CameraControl.h" 
#include "cv.h" 

Ensuite, je devais désactiver l'option d'en-tête précompilé et j'ai dû passer de l'option/clr: pure à/clr pour compiler et lier le projet avec succès.

Mais, alors je lance le programme l'exception mentionnée ci-dessus est jeté ...

Je me demande, si je mauvais usage du code C++ Windows Form application et je ne devrais pas inlcude mon pur C++ ou s'il est vraiment un problème avec OpenCV ou la bibliothèque uEye.

+0

Si vous exécutez le programme dans le débogueur, que se passe-t-il? Visual Studio devrait vous montrer quelle ligne a la violation d'accès. Et si vous ne faites pas de commentaires sur la première ligne? Est-ce qu'il plante toujours? –

Répondre

0

est-il pas

cvReleaseImage(img); 

? (esperluette enlevée) Aussi, vous devriez vérifier la convention d'appel appropriée.

+0

La signature pour cvReleaseImage est "void cvReleaseImage (image IplImage **)" donc lorsque vous passez img par référence, vous passez l'emplacement de mémoire du pointeur (pointeur vers le pointeur) – QueueHammer

0

Je viens de lancer et de compiler ces lignes exactes avec OpenCV 1.0 et Visual Studio 2008, sans erreur. Peut-être essayez de créer un projet vide qui ne fait rien d'autre que l'en-tête cxcore.h, puis exécute ces deux lignes.

Aussi juste à l'autre affiche: non l'esperluette fait partie de la spécification, il est correct là. Désolé je signalerais ceci comme commentaire mais ne peux pas encore.

1

Je suggère de tester ce même code dans un projet natif, sans code managé. Soit MFC ou une application console Win32.