【解消】質問投稿時のカテゴリ選択の不具合について

現在、以下の2つを参考にして赤色の領域の面積を求めるプログラムを書いています。
http://carnation.is.konan-u.ac.jp/seminar/colore … (色検出)
https://oshiete.goo.ne.jp/qa/4743115.html (面積計算)

そして、下が上の文献を参考に書いた自分のプログラムです。

int main(int argc, char** argv)
{
/*カメラキャプチャ設定*/
IplImage *source = 0;
CvCapture *capture = 0;
capture = cvCreateCameraCapture(0);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
CvMemStorage *storage;



/*画像構造体による変数の定義*/
IplImage * hsvimage=0;
IplImage * hueimage=0;
IplImage * hueimage1 = 0;
IplImage * hueimage2 = 0;
IplImage * saturationimage = 0;
IplImage * valueimage = 0;

IplImage * hueimage3 = 0;
IplImage * saturationimage3 = 0;
IplImage * valueimage3 = 0;

IplImage * hue_saturation = 0;
IplImage * image_black_white = 0;

/*windowの定義*/
cvNamedWindow("orig",CV_WINDOW_AUTOSIZE);
cvNamedWindow("result", CV_WINDOW_AUTOSIZE);

while (1)
{
/*カメラ画像の受け取り*/
source = cvQueryFrame(capture);
CvSize sizeOfImage = cvGetSize(source);

/*ヘッダの作成とデータ領域の確保*/
hsvimage = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 3);
hueimage = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
hueimage1 = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
hueimage2 = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
hueimage3 = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
saturationimage = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
saturationimage3 = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
valueimage = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
valueimage3 = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
hue_saturation = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);
image_black_white = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U, 1);

// RGB(BGR)画像をHSV画像に変換する(source → hsvimage)
cvCvtColor(source, hsvimage, CV_BGR2HSV);

//H,S,V成分の抽出
cvSplit(hsvimage, hueimage, saturationimage, valueimage, NULL);

storage = cvCreateMemStorage(0);



/*閾値処理*/
cvThreshold(hueimage, hueimage1, 160 , 255, CV_THRESH_BINARY);
cvThreshold(hueimage, hueimage2, 180 , 255, CV_THRESH_BINARY_INV);
cvThreshold(saturationimage, saturationimage3, 60, 255, CV_THRESH_BINARY);
cvThreshold(valueimage, valueimage3, 80, 255, CV_THRESH_BINARY);

//条件を満たした領域をimage_black_whiteとする
cvAnd(hueimage1, hueimage2, hueimage3);
cvAnd(hueimage3, saturationimage3, hue_saturation);
cvAnd(hue_saturation, valueimage3, image_black_white);


/*赤い面積の計算*/
typedef struct
{
int dim;//総面積
int white;//白の面積
int black;//黒の面積
}MONOSPACE;
MONOSPACE space = { 0 };

for (int y = 0; y < image_black_white->height; y++)
{
for (int x = 0; x < image_black_white->width; x++)
{
const int val = image_black_white->imageData[y * image_black_white->widthStep + x];
if (val & 1)++space.white;//白色なのでカウントする
}
}

//総面積
space.dim = image_black_white->width * image_black_white->height;

//黒い面積
space.black = space.dim - space.white;

std::cout << "赤の面積は" << space.white << "です" << std::endl;

cvShowImage("orig", source);
cvShowImage("result", image_black_white);
//cvWaitKey(10);
int key = cv::waitKey(10);

if (key == 'q') {

break;

}


}
cvDestroyWindow("orig");
cvDestroyWindow("result");

cvReleaseImage(&source);
cvReleaseImage(&hsvimage);
cvReleaseImage(&hueimage);
cvReleaseImage(&hueimage1);
cvReleaseImage(&hueimage2);
cvReleaseImage(&hueimage3);
cvReleaseImage(&saturationimage);
cvReleaseImage(&saturationimage3);
cvReleaseImage(&valueimage);
cvReleaseImage(&valueimage3);
cvReleaseImage(&hue_saturation);
cvReleaseImage(&image_black_white);

cvReleaseMemStorage(&storage);

return 0;
}
_____
この内容で書くと途中で写真のようなメモリエラーが発生します。対処法をお願いします。

「OpenCVでのメモリエラーについて」の質問画像

A 回答 (1件)

ループの中でcvCreateImage()しているようですが、cvReleaseImage()の回数はちゃんと組になっているんでし

ょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
cvReleaseImage()の数はあっていました。
そしてcvReleaseImage()を入れる場所をwhileのループの中に入れることによって、メモリエラーを回避することができました!

お礼日時:2016/11/16 14:19

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


おすすめ情報