cv::compare() を使ってみた

  • doc/opencv.pdf pp.637-638
  • cv::compare() で入出力する cv::Mat は 8UC1 に限られる
  • 元がグレイスケール 8bpp でも,imread( filename, CV_LOAD_IMAGE_GRAYSCALE) で読まないと,8UC3 になってしまう

stillcmp.cpp

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

#ifdef _DEBUG
#pragma comment( lib, "cv200d.lib" )
#pragma comment( lib, "cxcore200d.lib" )
#pragma comment( lib, "highgui200d.lib" )
#else
#pragma comment( lib, "cv200.lib" )
#pragma comment( lib, "cxcore200.lib" )
#pragma comment( lib, "highgui200.lib" )
#endif

cv::Mat stills[3];

void printusage( void )
{
	printf("\n");
	printf("2つの画像ファイルを比較します.\n");
	printf("\n");
	printf("stillcmp.exe ファイル1 ファイル2\n");
	printf("\n");
}

void printargs(int argc, char *argv[] )
{
	printf("ファイル1: %s\n", argv[1]);
	printf("ファイル2: %s\n", argv[2]);
}

bool checkargs(int argc, char *argv[] )
{
	// パラメータ数
	if ( argc < 2 )
	{
		printf(__FUNCTION__": パラメータが不足しています.\n");
		printusage();
		return false;
	}

	// 情報表示
	printargs( argc, argv );

	// 入力画像チェック
	stills[0] = cv::imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
	stills[1] = cv::imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );
	if ( stills[0].empty() ) {
		printf(__FUNCTION__": %s を利用できません.\n", argv[1]);
		return false;
	}
	if ( stills[1].empty() ) {
		printf(__FUNCTION__": %s を利用できません.\n", argv[2]);
		return false;
	}

	return true;
}

int main(int argc, char *argv[])
{
	// パラメータチェック
	if ( checkargs(argc, argv) == false )
	{
		return 0;
	}

	cv::compare( stills[0], stills[1], stills[2], cv::CMP_EQ );
	cv::imwrite( "result.png", stills[2] );
	printf("%d\n", stills[2].empty() );

	char *window_name[] = {
		"still1", "still2", "result", NULL
	};
	for ( int i = 0; window_name[i] != NULL; i++ )
	{
		cv::namedWindow( window_name[i], CV_WINDOW_AUTOSIZE);
		cv::imshow( window_name[i], stills[i] );
	}
	cv::waitKey();

	return 0;
}

スクリーンショット

入力画像1

入力画像2

出力画像

実行中の画面