Question

Je travaille avec Qt et OpenCV et j'aimerais créer un itérateur avec std::vector <cv::Rect_<int>> pour avoir accès à tous les cv::Rect_.
Ce vecteur fait partie d'un QMap < int, std::vector <cv::Rect_<int>> > _facesframe;

Voici donc comment j'essaie d'avoir accès à ces vecteurs :

                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";
                    }

                }

Mais le programme plante à la ligne if... à cause d'un itérateur incompatible.

Est-ce que quelqu'un sait comment atteindre tous cv::Rect_<int> d'un QMap < int, std::vector <cv::Rect_<int>> > s'il te plaît?

Était-ce utile?

La solution

C'est parce que vous comparez les itérateurs à différents vecteurs.

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

Le vecteur est renvoyé par valeur, celui-ci est donc copié.

Tu devrais utiliser

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

pour corriger ça :

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";
      }

  }

ou (moins efficace car 1 copie est réalisée) :

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";
  }

Autres conseils

QMap::value revient par valeur. Ce qui signifie qu'il renvoie un copie du vecteur, et bien sûr votre itérateur pointe vers un vecteur différent (une copie différente).Modifiez-le pour utiliser la version non const operator[] à la place (comme le const version de cela aussi renvoie par valeur).Ou utilisez simplement std::map, qui offre une bien meilleure interface à cet égard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top