Сбой во время работы в cvCopyImage / cvResize - PullRequest
3 голосов
/ 23 июля 2011

Я делаю простую программу для веб-камеры с использованием OpenCV 2.3 и застрял из-за ошибки во время выполнения.Любая идея будет оценена.

Компиляция проходит, но при запуске я получаю следующую ошибку (в cvCopyImage / cvResize в функции 'read' в коде ниже).

ошибка:

OpenCV Error: Bad argument (Unknown array type) in cvarrToMat, file /usr/local/src/OpenCV/OpenCV-2.3.0/modules/core/src/matrix.cpp, line 641
terminate called after throwing an instance of 'cv::Exception'
  what():  /usr/local/src/OpenCV/OpenCV-2.3.0/modules/core/src/matrix.cpp:641: error: (-5) Unknown array type in function cvarrToMat

выдержка из кода:

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

Mat* SampleClassA::dispImg = NULL;

int read()
{
    Mat* sharedImg;
    sharedImg = getFrame();
    if (sharedImg)
    {
        if (dispImg == NULL)
        {
            SampleClassA::dispImg = sharedImg;
        }
    cvCopyImage(sharedImg, SampleClassA::dispImg); // Crashes here.
    cvResize(sharedImg, SampleClassA::classifyImg); // Can crash here too when cvCopyImage is commented out.
    }
    sleep(100);
    return 1;
}

Mat* getFrame()
//IplImage* ReadRealTime::getFrame()
{
    if (!capture.isOpened()) // Actual capturing part is omitted here.
    {
        return NULL;
    }
    Mat frame;
    capture >> frame;
    return &frame;
}
</code>

Я предполагаю, что в том, что я использую Mat или указатель, что-то не так, или что-то не так.Я все еще плохо знаком с OpenCV и указателем C / C ++ (у меня есть проницательный комментарий в другом вопросе Не удается сохранить изображение, снятое с веб-камеры (ошибка компиляции с OpenCV 2.3) , чтобы указатьвозможен "висячий указатель", но на этот раз тоже самое?).

1 Ответ

4 голосов
/ 23 июля 2011

Проблема в том, что вы возвращаете указатель на переменную, выделенную в стеке, которая автоматически уничтожается в конце функции.

  // ...
  Mat frame;
  capture >> frame;
  return &frame;
} // frame destroyed is at the end of the function yet you return a pointer to it!

Вам нужно выделить кадр в куче, чтобы он жил после конца функции:

  // ...
  Mat* frame = new Mat(); // Maybe this needs parameters
  capture >> *frame;
  return frame;
}

Помните, что вам понадобится delete кадр позже, или ваше приложение будет иметь утечку памяти.

...