最終更新: mikk_ni3_92 2008年07月18日(金) 12:59:20履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::相違度(SAD)
#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; }