現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::相違度(SAD)

問題


同じサイズ、同じチャネル数の画像を用意し、
SAD(Sum of Absolute Difference)で相違度を計算せよ。

画像
画像

答え

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

const int ELEMENT = 2;
const std::string filename[ELEMENT]={"file1.jpg","file2.jpg"};

/********** プロトタイプ宣言 *************/
unsigned int Get_Sad(IplImage *imgA,IplImage *imgB);


/*************** ここからメイン関数 ****************/
int main()
{

	//画像の読み込み
	IplImage *imgA[ELEMENT];
	for(int loop = 0; loop < ELEMENT; ++loop)
	{
		imgA[loop] = cvLoadImage( filename[loop].c_str(), CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
		if(imgA[loop] == NULL)
		{
			std::cerr << filename[loop] <<" : Can't Load file \n";
			for(int i = 0; i < loop ;++i) 
			{
				cvReleaseImage(&imgA[i]); //読み込んだ分のメモリを解放
			}
			exit(EXIT_FAILURE);
		}
	}


	//表示する
	for(int loop = 0; loop < ELEMENT; ++loop)
	{
		cvNamedWindow(filename[loop].c_str(),CV_WINDOW_AUTOSIZE);
		cvShowImage(filename[loop].c_str(),imgA[loop]);
	}

	std::cout << "SAD : " << Get_Sad(imgA[0],imgA[1]);

	cvWaitKey(0); // 0秒待つ => ずっと入力待ち


	for(int loop = 0; loop < ELEMENT; ++loop)
	{
		cvReleaseImage( &imgA[loop] );
	}

	cvDestroyAllWindows();


	return EXIT_SUCCESS;
}


/*********** ここから各種関数***********/
unsigned int Get_Sad(IplImage *imgA,IplImage *imgB)
{

	IplImage *tmpA = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_64F,imgA->nChannels);
	cvScale(imgA,tmpA);

	IplImage *tmpB = cvCreateImage(cvGetSize(imgB),IPL_DEPTH_64F,imgB->nChannels);
	cvScale(imgB,tmpB);


	int all = cvRound(cvNorm(tmpA,tmpB,CV_L1));

	cvReleaseImage(&tmpA);
	cvReleaseImage(&tmpB);
	
	return all;
	
}

メモ


0に近いほど類似している。
0で完全一致を意味する。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます