Копирование указанного объекта с помощью OpenCV - PullRequest
2 голосов
/ 13 ноября 2011

Я не большой программист на C ++, я больше привык к C # и Java, где не нужно беспокоиться об указателях. Я думал Я понял, что я здесь делал, но результаты не те, что я ожидал, и я не уверен, что я делаю что-то глупое здесь, или если где-то еще в программе вызывает проблемы.

В любом случае, я работаю с OpenCV, и у меня есть два изображения, которые я инициализирую так:

IplImage *current_frame = NULL;
IplImage *previous_frame = NULL;

Тогда у меня есть этот блок кода:

if (current_frame != NULL)
    {
        previous_frame = new IplImage(*current_frame);
        current_frame = cvQueryFrame( capture );
    }
    else
    {
        current_frame = cvQueryFrame( capture );
        previous_frame = cvQueryFrame( capture );
    }

Идея состоит в том, что при первом выполнении кода текущий и предыдущий кадры будут использовать только что захваченное изображение, но предыдущий кадр будет принимать предыдущее значение current_frame, а current_frame захватывать свежее изображение (I ' мы пошли по коду, и он входит в правильные ветки оператора if).

На самом деле происходит то, что я вывожу оба кадра, и они идентичны, а не предыдущий_кадр отстает на единицу, как я хочу.

Я неправильно использую указатели? Если так, как я должен получить поведение, которое я хочу? Или это похоже на то, что он должен делать то, что я хочу?

Спасибо.

1 Ответ

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

Я подозреваю, что вы используете сырой C API: здесь IplImage определяется как структура POD

typedef struct _IplImage
{
  // ...
    char *imageData;
  // ...
}
IplImage;

Как видите, new IplImage(*current_frame) копирует только указатели (особенно imageData), а не фактические данные. Таким образом, вы ложно делитесь данными на обоих изображениях.

Я предлагаю вам прочитать здесь об обёртках C ++, и особенно, как использовать их для управления памятью: http://opencv.willowgarage.com/documentation/cpp/memory_management.html

РЕДАКТИРОВАТЬ Если вы хотите использовать C API:

currFrame = cvQueryFrame( cap );

// Clone the frame to have an identically sized and typed copy
prevFrame  = cvCloneImage( currFrame );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...