Frage

Ich arbeite mit Qt und OpenCV und möchte damit einen Iterator erstellen std::vector <cv::Rect_<int>> um Zugriff auf alle cv::Rect_ zu haben.
Dieser Vektor ist Teil von a QMap < int, std::vector <cv::Rect_<int>> > _facesframe;

So versuche ich, auf diese Vektoren zuzugreifen:

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

                }

Aber das Programm stürzt an der Leitung ab if... wegen eines inkompatiblen Iterators.

Weiß jemand, wie man alle erreicht? cv::Rect_<int> von einem QMap < int, std::vector <cv::Rect_<int>> > Bitte?

War es hilfreich?

Lösung

Dies liegt daran, dass Sie Iteratoren mit verschiedenen Vektoren vergleichen.

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

Der Vektor wird als Wert zurückgegeben, daher wird dieser kopiert.

Du solltest benutzen

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

um das zu korrigieren:

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

  }

oder (weniger effizient, da nur 1 Kopie erstellt wird):

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

Andere Tipps

QMap::value kehrt vorbei Wert. Das heißt, es wird ein zurückgegeben Kopieren des Vektors, und natürlich zeigt Ihr Iterator auf einen anderen Vektor (eine andere Kopie).Ändern Sie es, um die nicht konstante Version zu verwenden operator[] stattdessen (als die const Version davon Auch Rückgabe nach Wert).Oder einfach verwenden std::map, das in dieser Hinsicht eine viel bessere Schnittstelle bietet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top