/** \file main.cpp
Compare image to reference image
Copyright (C) 2010 Bastian Goldluecke,
<first name>AT<last name>.net
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <assert.h>
#include <qapplication.h>
#include <string>
#include <qimage.h>
using namespace std;
enum console_color {
CONSOLE_DEFAULT = 0,
CONSOLE_RED = 31,
CONSOLE_GREEN = 32,
CONSOLE_YELLOW = 33,
CONSOLE_BLUE = 34,
CONSOLE_MAGENTA = 35,
CONSOLE_CYAN = 36,
CONSOLE_WHITE = 37,
};
void set_console_color( console_color col )
{
cout << "\033[1;" << (int)col << "m";
}
int main( int argc, char **argv )
{
// Application init
QApplication app( argc, argv );
if ( argc != 2 ) {
cout << "reference comparison requires path to reference image as parameter." << endl;
}
string refpath = "./reference_results/";
string outpath = "./out/";
string impath = string(argv[1]).substr( 2 );
cout << " comparing " << impath << " : ";
string refimage = refpath + impath;
string outimage = outpath + impath;
QImage ref( refimage.c_str() );
QImage out( outimage.c_str() );
size_t W = ref.width();
size_t H = ref.height();
if ( W*H==0 ) {
set_console_color( CONSOLE_RED );
cout << "reference image not found or empty." << endl;
set_console_color( CONSOLE_DEFAULT );
return 99;
}
size_t Wo = out.width();
size_t Ho = out.height();
if ( Wo*Ho==0 ) {
set_console_color( CONSOLE_YELLOW );
cout << "output image not found or empty." << endl;
set_console_color( CONSOLE_DEFAULT );
return 98;
}
if ( Wo != W || Ho != H ) {
set_console_color( CONSOLE_RED );
cout << "size mismatch." << endl;
set_console_color( CONSOLE_DEFAULT );
return 97;
}
// compare pixels
for ( size_t y=0; y<H; y++ ) {
for ( size_t x=0; x<W; x++ ) {
QRgb rc = ref.pixel( x,y );
QRgb ro = out.pixel( x,y );
// Allow a few units of difference for rounding errors
if ( abs(qRed(rc)-qRed(ro)) > 9 ||
abs(qGreen(rc)-qGreen(ro)) > 9 ||
abs(qBlue(rc)-qBlue(ro)) > 9 ) {
set_console_color( CONSOLE_RED );
cout << "mismatch, ref= ";
cout << qRed(rc) << " " << qBlue(rc) << " " << qGreen( rc ) << " out=";
cout << qRed(ro) << " " << qBlue(ro) << " " << qGreen( ro ) << " (rest ignored).";
cout << endl;
set_console_color( CONSOLE_DEFAULT );
return 1;
}
}
}
set_console_color( CONSOLE_GREEN );
cout << "ok." << endl;
set_console_color( CONSOLE_DEFAULT );
return 0;
}