Вопрос

Я работаю с Qt и OpenCV, и я хотел бы создать итератор с std::vector <cv::Rect_<int>> чтобы иметь доступ ко всем cv::Rect_.
Этот вектор является частью QMap < int, std::vector <cv::Rect_<int>> > _facesframe;

Итак, вот как я пытаюсь получить доступ к этим векторам:

                foreach (unsigned int frame , _imageGItem->_faceSampler._facesframe.keys() )
                {
                    std::vector <cv::Rect_<int>>::const_iterator it = _imageGItem->_faceSampler._facesframe.value(frame).begin();
                    if( it != _imageGItem->_faceSampler._facesframe.value(frame).end())
                    {
                        qDebug()<<"here";
                    }

                }

Но программа выходит из строя на этой строке if... из-за несовместимого итератора.

Кто-нибудь знает, как достучаться до всех cv::Rect_<int> из QMap < int, std::vector <cv::Rect_<int>> > пожалуйста?

Это было полезно?

Решение

Это происходит потому, что вы сравниваете итераторы с разными векторами.

const T QMap::value(const Key & key, const T & defaultValue = T()) const

Вектор возвращается по значению, поэтому он копируется.

Вы должны использовать

T & QMap::operator[](const Key & key)

чтобы исправить это:

foreach (unsigned int frame , _imageGItem->_faceSampler._facesframe.keys() )
  {
    std::vector <cv::Rect_<int>>::const_iterator it =
                       _imageGItem->_faceSampler._facesframe[frame].begin();
    if( it != _imageGItem->_faceSampler._facesframe[frame].end())
      {
        qDebug()<<"here";
      }

  }

или (менее эффективно из-за создания 1 копии):

std::vector <cv::Rect_<int>> v =   // this will copy
                            _imageGItem->_faceSampler._facesframe.value(frame);
std::vector <cv::Rect_<int>>::const_iterator it = v.begin();
if( it != v.end())
  {
    qDebug()<<"here";
  }

Другие советы

QMap::value возвращается по ценность. Что означает, что он возвращает копировать из вектора, и, конечно, ваш итератор указывает на другой вектор (другую копию).Измените его, чтобы использовать неконстантную версию operator[] вместо этого (в качестве const версия этого тоже возвращает по значению).Или просто использовать std::map, который предлагает гораздо лучший интерфейс в этом отношении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top