- 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;
}