アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++にてOpenCVを使って画像処理を行っています。
cvHoughCircles関数を使ってハフ変換による円検出をしているのですが、


「Null pointer(NULL array pointer is passed)
 in function cvGetMat,C\User\VP\opencv\cxcore\src\cxarry.cpp(2780)

 Press"Abort"to terminate application.
Press"Retry"to debug(if the app is running under debugger).
Press"Ignore"to continue(this is not safe).」


というエラーが出てしまいます。
これはいったいどういったエラーなのでしょうか?

プログラムは以下の通りです。

//--------------------------------------------------

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

int
main (int argc, char **argv)
{
int i;
float *p;
IplImage *src_img = 0, *src_img_gray = 0;
CvMemStorage *storage;
CvSeq *circles = 0;
char *filename = "lena.jpg";
IplImage *image;
//画像の読み込み・平滑化・二値化
image = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む
// (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい)
cvSmooth (src_img_gray, src_img_gray, CV_GAUSSIAN, 11, 11, 0, 0);
storage = cvCreateMemStorage (0);

// (3)ハフ変換による円の検出と検出した円の描画
circles = cvHoughCircles (src_img_gray, storage, CV_HOUGH_GRADIENT,
1, 100, 20, 50, 10, MAX (src_img_gray->width, src_img_gray->height));
for (i = 0; i < circles->total; i++) {
p = (float *) cvGetSeqElem (circles, i);
cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), 3, CV_RGB (0, 255, 0), -1, 8, 0);
cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), cvRound (p[2]), CV_RGB (255, 0, 0), 3, 8, 0);
}

// (4)検出結果表示用のウィンドウを確保し表示する
cvNamedWindow ("circles", 1);
cvShowImage ("circles", src_img);
cvWaitKey (0);

cvDestroyWindow ("circles");
cvReleaseImage (&src_img);
cvReleaseImage (&src_img_gray);
cvReleaseMemStorage (&storage);

return 0;
}

//-----------------------------------------------------

解決方法など分かりましたら、よろしくお願いいたします。

A 回答 (1件)

 こんばんは。



>>これはいったいどういったエラーなのでしょうか?
 cvSmooth (src_img_gray, src_img_gray, CV_GAUSSIAN, 11, 11, 0, 0);
 の中で起こしています。src_img_grayにイメージが割り当てられていないので、「NULLのポインタを渡した」と、文句を言われているのではないでしょうか。
 ファイルから読み込んだイメージをsrc_imgに入れ、dst_imgにも同じサイズを持ったイメージを割り当て、dst_imgに向かって関数を通して画像処理結果を出力する様に、扱うのではないでしょうか。

 以下で動作しました。

int
main (int argc, char **argv)
{
int i;
float *p;
CvMemStorage *storage;
CvSeq *circles = 0;
char *filename = "lena.jpg";
IplImage *src_img = 0, *dst_img = 0;

//画像の読み込み・平滑化・二値化
src_img = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む
//ココでdst_imgにも同じ容量を割り当てる(面倒なのでクローンする)
dst_img = cvCloneImage(src_img);

// (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい)
cvSmooth (src_img, dst_img, CV_GAUSSIAN, 11, 11, 0, 0);
storage = cvCreateMemStorage (0);

// (3)ハフ変換による円の検出と検出した円の描画
circles = cvHoughCircles (dst_img, storage, CV_HOUGH_GRADIENT, 1, 100, 20, 50, 10, MAX (dst_img->width, dst_img->height));
for (i = 0; i < circles->total; i++)
{
p = (float *) cvGetSeqElem (circles, i);
cvCircle (dst_img, cvPoint (cvRound (p[0]), cvRound (p[1])), 3, CV_RGB (0, 255, 0), -1, 8, 0);
cvCircle (dst_img, cvPoint (cvRound (p[0]), cvRound (p[1])), cvRound (p[2]), CV_RGB (255, 0, 0), 3, 8, 0);
}

// (4)検出結果表示用のウィンドウを確保し表示する
cvNamedWindow ("circles", 1);
cvShowImage ("circles", dst_img);
cvWaitKey (0);

cvDestroyWindow ("circles");
cvReleaseImage (&dst_img);
cvReleaseImage (&src_img);
cvReleaseMemStorage (&storage);

return 0;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
無事にエラーがとれ実行することができました。

お礼日時:2008/11/04 13:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!