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