Использование очереди для хранения матриц перевода и вращения в OpenCV - PullRequest
0 голосов
/ 23 ноября 2011

Мне нужно использовать Очередь для сохранения сгенерированных матриц вращения и перевода (используя cvFindExtrinsicCameraParams2()) для каждого контура.

Но когда я вытаскиваю элементы из очереди, все, что я могу получить, это копии той же пары вращения и перевода.

Я сомневаюсь, что это как-то связано с указателями, но когда я попытался избежать указателей в struct, cvFindExtrinsicCameraParams2() вызвал исключение.Как это исправить?

//------------A.h------------------
struct RotMat{
    CvMat *rotation_;
    CvMat *translation_;
};


//-----------B.h-------------------
class B {

private:
        CvMat *rotation;
        CvMat *translation;
} 


//-----------B.cpp-----------------
#include "A.h"
#include "B.h"

void functionx(){

        queue<RotMat> rtq;

        // start loop

                // cvFindExtrinsicCameraParams2(&object_points,&image_points,
                //                               intrinsic,distortion,
                //                                rotation,translation);

                RotMat rt = {rotation, translation};
                rtq.push(rt);

        // end loop

        while(!rtq.empty()) { //assume rtq has n elements

                RotMat rt_ = rtq.front();
                rtq.pop();
                cout<< rt_.translation_->data.fl[1]; // the same value pair is 
                cout<< rt_.rotation->data.fl[1];     // printed in all n iterations

        } 
}

Результаты испытаний

Total markers detected = 2

Marker 1: Translation: -249.227
          Rotation: -0.0124926

Marker 2: Translation: -249.227
          Rotation: -0.0124926

1 Ответ

1 голос
/ 23 ноября 2011

Вы помещаете указатели в очередь, но вы повторно используете те же ячейки памяти.Итак, все ваши элементы очереди указывают на одно и то же место в памяти.

Создайте новые матрицы вращения и перевода до , вызывая cvFindExtrinsicCameraParams2.Затем поместите вновь созданные матричные указатели в очередь.

Возможно, вы захотите использовать умные указатели, чтобы у вас не возникало проблем с утечкой памяти.Или просто используйте класс Mat и позвольте ему управлять данными за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...