2011-07-23 16 views
3

OpenCV 2.3を使用して簡単なWebカメラプログラムを作成しているときに、ランタイムエラーが発生しました。任意のアイデアが評価されます。cvCopyImage/cvResizeで実行中にクラッシュする

コンパイルは実行されますが、実行中に次のエラーが表示されます(以下のコードの 'read'関数のcvCopyImage/cvResizeにあります)。

エラー:

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> 

私の推測では、何か間違ったことは、両方の私はマットを使用する方法、またはポインタに/のいずれかがありますです。私はまだOpenCVとC/C++の両方のポインタに新しいです(別の質問で洞察に満ちたコメントを得ましたCan't save an image captured from webcam (imwrite compile error with OpenCV 2.3)は "ぶら下がりポインタ"を指摘するが、今回は同じですか?)。

答えて

4

問題は、関数の最後に自動的に破棄されるスタック割り当て変数へのポインタを返すことです。

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

を後でポイントやでフレームをdeleteする必要があることを忘れないでください:それは、関数の末尾を越えて生きれるように

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

あなたはヒープ上にフレームを割り当てる必要がありますアプリケーションがメモリをリークします。

関連する問題