Pergunta

Eu estou trabalhando com Qt e OpenCV e eu gostaria de criar um iterador com std::vector <cv::Rect_<int>> para ter acesso a todos os cv::Rect_.
Este vetor é parte de um QMap < int, std::vector <cv::Rect_<int>> > _facesframe;

É assim que eu estou tentando ter acesso a estes vetores:

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

                }

Mas o programa falha na linha de if... devido a uma incompatibilidade do iterador.

Alguém sabe como chegar a todos os cv::Rect_<int> de um QMap < int, std::vector <cv::Rect_<int>> > por favor?

Foi útil?

Solução

Isso é porque você está comparando os iteradores para diferentes vetores.

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

Vetor é retornado por valor, portanto, este é copiado.

Você deve usar

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

para corrigir este problema:

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 (menos eficiente porque, de 1 de cópia está sendo feita):

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

Outras dicas

QMap::value retorno o valor. O que significa que está retornando de um cópia do vetor, e, claro, o iterador aponta para um vetor diferente (uma cópia).Alterá-lo para uso não-const versão operator[] em vez disso (como o const versão de que também retorna por valor).Ou apenas usar std::map, que oferece uma melhor interface em relação a isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top