1

我正在使用 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>> >吗?

4

2 回答 2

1

QMap::value值返回。这意味着它正在返回向量的副本,当然您的迭代器指向不同的向量(不同的副本)。将其更改为使用非常量版本operator[](因为该const版本按值返回)。或者只是使用std::map,它在这方面提供了更好的界面。

于 2014-02-27T15:11:07.900 回答
1

这是因为您将迭代器与不同的向量进行比较。

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";
  }
于 2014-02-27T15:07:02.963 回答