OpenCV 2.0 で映像ファイル比較

  • 映像ファイルを2個入力する
  • フレーム単位で画素値を比較

videocmp.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

const int VIDEOFILES = 2;

cv::VideoCapture video[VIDEOFILES];

void printusage( void )
{
	printf("\n");
	printf("2つの映像ファイルを比較します.\n");
	printf("\n");
	printf("videocmp.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 );

	// 入力映像チェック
	for ( int i = 0; i < VIDEOFILES; i++ )
	{
		if ( video[i].open(argv[1+i]) == false )
		{
			printf(__FUNCTION__": %s を利用できません.\n", argv[1+i]);
			return false;
		}
	}

	return true;
}

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

	// ファイルプロパティをチェック
	double v[VIDEOFILES];
	v[0] = video[0].get(CV_CAP_PROP_FRAME_HEIGHT);
	v[1] = video[1].get(CV_CAP_PROP_FRAME_HEIGHT);
	if ( v[0] == v[1] )
	{
		v[0] = video[0].get(CV_CAP_PROP_FRAME_WIDTH);
		v[1] = video[1].get(CV_CAP_PROP_FRAME_WIDTH);
		if ( v[0] == v[1] )
		{
			// ok
		}else{
			printf("%s(%d): 映像ファイルの幅が不一致\n", __FILE__, __LINE__);
			return 0;
		}
	}else{
		printf("%s(%d): 映像ファイルの高さが不一致\n", __FILE__, __LINE__);
		return 0;
	}

	// メインループ
	cv::Mat still[VIDEOFILES];

	for ( int i = 0; 1; i++ )
	{
		video[0] >> still[0];
		video[1] >> still[1];
		// ループ満了
		if ( still[0].empty() == true && still[1].empty() == true )
		{
			break;
		}
		// 一方が少ないとき
		if ( still[0].empty() != still[1].empty() )
		{
			printf("%s(%d): %d 枚目で不一致\n", __FILE__, __LINE__, i);
			return 0;
		}
		// 比較
		if ( memcmp( still[0].data, still[1].data, still[0].step * still[0].rows ) != 0 )
		{
			printf("%s(%d): %d 枚目で不一致\n", __FILE__, __LINE__, i);
			return 0;
		}
	}

	printf("%s(%d): 一致\n", __FILE__, __LINE__);

	return 0;
}