0

J'utilise Microsoft Visual C++ 6.0 et Microsoft Visual Studio 2008 pour développer un projet de vision par ordinateur académique.Erreur de compilation cvblob dans Visual C++ 6.0

Dans ce projet, j'ai besoin d'utiliser OpenCV 1.1 (http://opencv.willowgarage.com/) et CvBlob (http://code.google.com/p/cvblob/).

J'ai essayé de compiler ce projet avec Microsoft Visual Studio 2008 et il compile sans erreurs. Avec Visual C++ 6.0, j'ai eu beaucoup d'erreurs avec

OpenCV n'est pas responsable de ce comportement, car un projet trivial avec seulement OpenCV (sans CvBlob) fonctionne bien.

Pour mieux comprendre les erreurs j'ai fait un projet vide avec seulement l'inclusion de CvBlob.

Je colle ici un bref résumé des erreurs:

cvcontour.cpp(253) : error C2371: 'i' : redefinition; different basic types (and others similar to this. i solved with variable redefinition, every time) 

cvcontour.cpp(318) : error C2664: 'thiscall std::vector<struct CvPoint,class std::allocator<struct CvPoint> >::std::vector<struct CvPoint,class std::allocator<struct CvPoint> >(unsigned int,const struct CvPoint &,const class std::allocator<struct CvPoint> &)' : cannot convert parameter 1 from 'class std::deque<struct CvPoint,class std::allocator<struct CvPoint> >::iterator' to 'unsigned int' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

cvtrack.cpp(278) : error C2440: 'initializing' : cannot convert from 'struct cvb::CvTrack *const ' to 'struct cvb::CvBlob *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

vous avez des idées sur comment puis-je résoudre ces problèmes?

Merci d'avance pour l'aide!

-------- -------- MISE A JOUR

J'ai essayé de modifier et corriger le code pour elminate les trois erreurs dans ma question.

L'erreur C2664 semble être plus difficile à cirmumvent ...

J'ai remplacé la ligne mis en accusation

return new CvContourPolygon(dq.begin(), dq.end()); 

où CvContourPolygon est un typedef std::vector<CvPoint> CvContourPolygon;

avec

deque<int>::iterator dq_it;dq_it = dq.begin(); 
CvContourPolygon v_tmp; 
v_tmp.push_back(*dq_it); 
while (dq_it != dq.end()){ 
    v_tmp.push_back(*dq_it++); 
} 

D'abord, ce que j'ai écrit est correct? Que, comment puis-je résoudre les erreurs qui se sont produites à partir de cela?

Merci d'avance!

erreurs (supposons que la première ligne est 318:.

cvcontour.cpp(319) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class std::deque<struct CvPoint,class std::allocator<struct CvPoint> >::iterator' (or 
there is no acceptable conversion) 
cvcontour.cpp(321) : error C2664: 'push_back' : cannot convert parameter 1 from 'int' to 'const struct CvPoint &' 
    Reason: cannot convert from 'int' to 'const struct CvPoint' 
    No constructor could take the source type, or constructor overload resolution was ambiguous 
cvcontour.cpp(322) : error C2679: binary '!=' : no operator defined which takes a right-hand operand of type 'class std::deque<struct CvPoint,class std::allocator<struct CvPoint> >::iterator' (or there is no acceptable conversion) 
cvcontour.cpp(322) : fatal error C1903: unable to recover from previous error(s); stopping compilation 

erreur d'exécution cl.exe

-------- -------- MAJ2

Ce code semble fonctionner correctement

deque<CvPoint>::iterator dq_it; 
dq_it = dq.begin(); 
CvContourPolygon v_tmp; 
for (dq_it = dq.begin(); dq_it != dq.end(); ++dq_it){ 
    v_tmp.push_back(*dq_it); 
} 
//return new CvContourPolygon(dq.begin(), dq.end()); 
return &v_tmp; 
+2

Existe-t-il une bonne raison d'utiliser VC 6.0? Évitez-le si vous le pouvez (et vous pouvez, vous avez MSVC 9.0). – rubenvb

+0

oui, il y a une bonne raison! dans l'ordinateur de la mine, j'ai MSVS2008 et tout le code fonctionne bien! mais dans le PC académique je ne peux pas choisir l'IDE et le compilateur, et il y a MSVC++ 6.0! Donc, malheureusement , je dois compiler mon code dans cet environnement ... – Sbaush

Répondre

3

C2371 - VC 6 était bâclé avec la portée des variables locales. Devrait être en mesure de résoudre ce problème en faisant en sorte que le code utilise les noms de variables sans ambiguïté.

C2664 - ressemble à l'échec d'initialisation d'un vecteur en utilisant des itérateurs de deque - une surcharge incorrecte sur un vecteur :: vector() étant appelée? Vous devrez probablement contourner ce problème en copiant manuellement les éléments de deque dans le nouveau vecteur.C2440 - vérifiez que les objets sont compatibles (VS2008 semble le penser) et ajoutez la distribution appropriée.

EDIT: Votre code ne devrait-il pas ressembler à ceci?

deque<CVPoint>::iterator dq_it;dq_it = dq.begin(); 
CvContourPolygon v_tmp; 
for (dq_it = dq.begin(); dq_it != dq.end(); ++dq_it) 
{ 
    v_tmp.push_back(*dq_it); 
} 
+0

Ok, je vais essayer de faire ces changements ... J'espère que je ne dois pas trop changer le code de la bibliothèque, parce que je ne suis pas l'auteur original de CvBlob !! – Sbaush

+0

@Sbaush - le meilleur moyen de contourner cela serait de sortir de VC6 si possible. C'est très démodé. Vous pouvez obtenir VC10 gratuitement comme Visual C++ 2010 Express Edition. –

+0

J'ai mis à jour le post original avec l'évolution de mes corrections, et de nouvelles erreurs. Pouvez-vous m'aider s'il vous plaît? Merci d'avance! – Sbaush