Ошибка компиляции cvblob в Visual C ++ 6.0 - PullRequest
0 голосов
/ 13 октября 2010

Я использую Microsoft Visual C ++ 6.0 и Microsoft Visual Studio 2008 для разработки академического проекта по компьютерному зрению.

В этом проекте мне нужно использовать OpenCV 1.1 (http://opencv.willowgarage.com/) и CvBlob (http://code.google.com/p/cvblob/).

). Я попытался скомпилировать этот проект с помощью Microsoft Visual Studio 2008, и он компилируется без ошибок.

В Visual C ++ 6.0 я получил много ошибок.

OpenCV не несет ответственности за это поведение, потому что тривиальный проект только с OpenCV (без CvBlob) работает хорошо.

Комулучше понять ошибки Я сделал пустой проект только с включением CvBlob.

Я вставляю здесь краткую сводку ошибок:

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

У вас есть идеи о том, как я могу решить эти проблемы?

Заранее спасибо за помощь!

-------- ОБНОВЛЕНИЕ --------

Iпопытался отредактировать и исправить код, чтобы устранить три ошибки в моем вопросе.

Ошибка C2664 кажется более трудной для обхода ...

Я заменил указанную линию

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

, где CvContourPolygon представляет собой typedef std::vector<CvPoint> CvContourPolygon;

с

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++);
}

Во-первых, что я написал правильно?Чем, как я могу устранить ошибки, которые произошли из-за этого?

Заранее спасибо!

Ошибки (предположим, что первая строка 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

ОшибкаВыполнение cl.exe.

-------- ОБНОВЛЕНИЕ2 --------

Этот код работает правильно!

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;

1 Ответ

3 голосов
/ 13 октября 2010

C2371 - VC6 был небрежным с областью локальных переменных. Должно быть в состоянии исправить это, заставив код использовать имена переменных однозначно.

C2664 - похоже на сбой при инициализации вектора с использованием итераторов deque - неправильная перегрузка при вызове vector :: vector ()? Вероятно, придется обойти это путем ручного копирования элементов deque в новый вектор.

C2440 - проверьте совместимость объектов (кажется, что VS2008 так считает) и добавьте соответствующее приведение.

EDIT: Разве ваш код не должен выглядеть так?

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...