2012-01-27 10 views
1

私は、カメラから単一の画像を取得し、それらにいくつかの処理を行うと、使用したメモリを解放しようとしています。セグメンテーションフォールト()()

char* img_data = new char[ len ]; // I retrieve len from the camera. 

// Grab the actual image from the camera: 
// It fills the previous buffer with the image data. 
// It gives width and height. 

CvSize size; 
size.width = width; 
size.height = height; 
IplImage* img = cvCreateImageHeader(size, 8, 1); 
img->imageData = img_data; 

// Do the processing 

cvReleaseImage(&img); 

をこのコードは正常に動作:私は、次のものに類似したコードでかなりの時間のためにそれをやってきました。私最近、私はIMG-に直接データを割り当てるべきではないことを(画像データの説明で)hereを読んだ>画像データが、(SetDataメソッドを使用)の代わりに、そのような:

cvSetData(img, img_data, width); 

しかし、私はこのようにそれを行います私は、cvReleaseImage()コールでセグメンテーション違反を取得します。

私は間違っていますか?

ありがとうございます。

EDIT:は私が提案し@karlphillipプログラムをコンパイルして実行しようとしていると私はcvSetDataを使用してセグメンテーションフォールトを得るのですが、直接データを割り当てるときに、それが正常に動作。 私はDebian 6とOpenCV 2.3.1を使用しています。

答えて

2

私もこの問題があったが、それは私が this commentに集まったものから、固定されたと考えています。つまり、cvReleaseImageHeader()ではなくcvReleaseImage()を使用します。例えば

unsigned int width = 100; 
unsigned int height = 100; 
unsigned int channels = 1; 
unsigned char* imageData = (unsigned char*)malloc(width*height*channels); 
// set up the image data 

IplImage *img = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, channels); 
cvSetData(img, imageData, width*channels); 

// use img 

cvReleaseImageHeader(&img); 

// free(imageData) when finished 
+0

ニース!これで問題は解決しましたが、Mac OS XではなくGNU/LinuxではcvReleaseImageがうまくいかず、OpenCVメーリングリストで電子メールを送信しましたが、受け入れられません(外部のウェブサイトへのリンクを投稿できないか何か)。とにかく、ありがとう! – pparescasellas

+0

ありがとう、私はopencvに慣れていない。 – spmno

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、 –

1

問題がcvReleaseImage()内部free()とそのメモリブロックを解放しようとするのOpenCVのCインタフェースを使用しているときに、メモリ(newを使用)C++のように割り当てていることです。 CとC++のメモリ割り当てを混在させることはできません。

ソリューション:メモリの割り当てにmalloc()を使用します。

char* img_data = (char*) malloc(len * sizeof(char)); 
// casting the return of malloc might not be necessary 
// if you are using a C++ compiler 

EDIT:(原因はまだクラッシュしているOPのコメントに)あなたが私たちに表示されていない他の

何かがクラッシュしますあなたの申請!私は真剣にあなたが持っている問題を再現する完全な/最小限のアプリケーションを書くことをお勧めします。

次のアプリケーションは、OpenCVの2.3.1で私のMac OS Xで正常に動作します。

#include <cv.h> 
#include <highgui.h> 


int main() 
{ 
    char* img_data = (char*) malloc(625); 

    CvSize size; 
    size.width = 25; 
    size.height = 25; 
    IplImage* img = cvCreateImageHeader(size, 8, 1); 

    //img->imageData = img_data; 
    cvSetData(img, img_data, size.width); 

    cvReleaseImage(&img); 

    return 0; 
} 
+0

あなたは正しいです。私はOpenCVのC++インターフェイスを使用していなければなりません。しかしながら、これはセグメンテーション・フォルトを解決していない。 – pparescasellas

+0

あなたのアプリケーションにそれを引き起こしている他のコードがあり、私たちと共有していない他のコードがあるので、クラッシュを解決していません。 **あなたが観察している振る舞いを再現する最小限のコンパイル可能なアプリケーションを作成しない限り、**私たちはあなたをさらに助けることはできません**。 – karlphillip

+0

私はそれがうまくいくかどうかをあなたが示唆したような小さなプログラムを書こうとしていました。同じマシンにアクセスできるようになると、質問を結果に更新します。ありがとうございました! – pparescasellas

0

が、私はこの議論にディテールを追加したいです。 cvReleaseHeader()関数に何らかのバグがあるようです。 ヘッダーを最初に解放してから、イメージデータを解放する必要があります。 あなたはそれを他の方法、すなわち、自由な画像データを行い、その後、それ一見作品、cvReleaseHeader()関数を呼び出した場合。しかし、内部的にはメモリがリークし、アプリケーションがクラッシュすることがあります。

1

あなたは、ヘッダーを割り当て、データを手動で設定する場合は一般的に、あなたはデータを自分でのみヘッダーの割り当てを解除し、自由にする必要があります

// allocate img_data 

IplImage* img = cvCreateImageHeader(size, 8, 1); 
img->imageData = img_data; 
cvReleaseImageHeader(&img); // frees only the header 

// free img_data 

あなたがcvReleaseImageを呼び出した場合、それはまた、データを解放しようとしますOpenCVの実装に依存しています。これは、freeを使用し、お互いに互換性がないnewで割り当てられているため、あなたのケースでは失敗しました。 もう1つの方法は、mallocを割り当ててcvReleaseImageと呼ぶことです。

関連する問題