電子書籍の厳選無料作品が豊富!

はじめまして。今回皆様のお力をお借りしたく質問させて頂きました。

どうぞ宜しくお願いします。

私は今OpenCV1.1を使って、2枚のエッジ処理して2値化された画像の差分を取り、変化しているビット数をカウントして表示させるというプログラムを作っています。

しかし、デバッグするとエラーが出てしまい、失敗してしまいます。
どこに問題があるのでしょうか?

プログラム初心者のため、初歩的なミスをしているのかもしれません。

開発環境はMicrosoft Visual C++ 2010です。
以下にプログラムを載せておきます。


#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

/* 背景画像のファイル名 */
#define INPUT_FILE1 "5×5medcanny.bmp"
/* 対象画像のファイル名 */
#define INPUT_FILE2 "Fire5×5medcanny.bmp"

/* 差分画像のファイル名 */
#define OUTPUT_DIFF_FILE "diff.bmp"

#define WIDTH 352
#define HEIGHT 288


int _tmain(int argc, _TCHAR* argv[])
{


// 画像変数宣言
IplImage *img_in1, *img_in2, *img_diff;

cvNamedWindow("期待値画像");// 表示ウィンドウの作成
cvNamedWindow("比較画像");
cvNamedWindow ("差分画像", CV_WINDOW_AUTOSIZE);

img_in1 = cvLoadImage(INPUT_FILE1); // 画像ファイルの読み込み

img_in2 = cvLoadImage(INPUT_FILE2);

if(img_in1 == NULL || img_in2 == NULL)// ファイルが読み込めない場合
{
printf("ファイルが読み込めません。\n");
cvWaitKey(0);// キー入力待機
return -1;
}

// 画像領域の確保
img_diff = cvCreateImage(cvSize(img_in1->width, img_in1->height), IPL_DEPTH_8U, 1);

// 期待値画像と比較画像の差分
cvAbsDiff(INPUT_FILE1, INPUT_FILE2, OUTPUT_DIFF_FILE);

// 差分画像ファイルの読み込み
img_diff = cvLoadImage(OUTPUT_DIFF_FILE);

// 差分画像の画素数の取得
IplImage img_hdr;
IplImage *dst_img = cvGetImage (img_diff, &img_hdr);

// 差分画像の画素数のカウント
int count = 0;
count += cvCountNonZero(dst_img);
printf("%d\n",count);

    cvShowImage("期待値画像", img_in1);// 表示ウィンドウに画像を表示
cvShowImage("比較画像", img_in2);
cvShowImage("差分画像", img_diff);

cvSaveImage("Image_diff.bmp", img_diff);// 出力画像の保存

cvWaitKey(0);// キー入力待機

cvDestroyAllWindows();// すべての表示ウィンドウの破棄
cvReleaseImage(&img_in1);// 画像領域の解放
cvReleaseImage(&img_in2);
cvReleaseImage(&img_diff);
cvReleaseImage(&dst_img);
return 0;
}

A 回答 (1件)

> // 期待値画像と比較画像の差分


> cvAbsDiff(INPUT_FILE1, INPUT_FILE2, OUTPUT_DIFF_FILE);

http://opencv.jp/opencv-1.1.0/document/opencvref …

cvAbsDiffの引数は「ファイル名」ではありません。

> // 差分画像ファイルの読み込み
> img_diff = cvLoadImage(OUTPUT_DIFF_FILE);

ファイルに書き出されないのですから、読むのは無意味です。
また、この前で cvCreateImage した領域へのポインタが、ここの処理で上書きされてしまうめ、cvReleaseImageすることができなくなります。

> // 差分画像の画素数の取得
> IplImage img_hdr;
> IplImage *dst_img = cvGetImage (img_diff, &img_hdr);

何を意図したものか不明。「差分画像の画素数の取得」とは書いてあるけど。
    • good
    • 0

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