- 映像ファイルを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] )
{
}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;
}