diff --git a/Testing/Utilities/CMakeLists.txt b/Testing/Utilities/CMakeLists.txt index 0e887ab93dc25362269ca6b0d344d77972127581..c8400c3763cb42df97b7b83c8ad5b99ebfef4673 100644 --- a/Testing/Utilities/CMakeLists.txt +++ b/Testing/Utilities/CMakeLists.txt @@ -333,25 +333,31 @@ ADD_TEST(utOssimRadarSatSupport ${UTILITIES_TESTS} # ------- SIFT ------------------------------------- ADD_TEST(ut2DSiftImageSquareSyntheticRotate10 ${UTILITIES_TESTS} - itk2DScaleInvariantFeatureImageFilter - --synthetic - --rotate-mid --rotate 10 - ${INPUTDATA}/carre.png - ${TEMP} ) + itk2DScaleInvariantFeatureImageFilterTest + ${INPUTDATA}/carre.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_carre1.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_carre2.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_carre_keys1.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_carre_keys2.png + 1 10 0.5 0 ) ADD_TEST(ut2DSiftImageGridSyntheticRotate10 ${UTILITIES_TESTS} - itk2DScaleInvariantFeatureImageFilter - --synthetic - --rotate-mid --rotate 10 + itk2DScaleInvariantFeatureImageFilterTest ${INPUTDATA}/damier.png - ${TEMP} ) + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_damier1.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_damier2.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_damier_keys1.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_damier_keys2.png + 1 10 0.5 0 ) ADD_TEST(ut2DSiftImageSceneSyntheticRotate10 ${UTILITIES_TESTS} - itk2DScaleInvariantFeatureImageFilter - --synthetic - --rotate-mid --rotate 10 - ${INPUTDATA}/scene.png - ${TEMP} ) + itk2DScaleInvariantFeatureImageFilterTest + ${INPUTDATA}/scene.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_scene1.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_scene2.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_scene_keys1.png + ${TEMP}/itk2DScaleInvariantFeatureImageFilter_scene_keys2.png + 1 10 0.5 0 ) # ------- lib Kml ------------------------------ #FOREACH(id_test createkml helloattrs helloenum hellofolder hellogeometry helloregion helloserializer helloworld parsekml ) diff --git a/Testing/Utilities/itkScaleInvariantFeatureImageFilterTest.cxx b/Testing/Utilities/itkScaleInvariantFeatureImageFilterTest.cxx index f27af71500148092253a4d81c5bf477998dc8721..ecb619f0eb57c2dda0f39bb4574b991f8ce00b40 100644 --- a/Testing/Utilities/itkScaleInvariantFeatureImageFilterTest.cxx +++ b/Testing/Utilities/itkScaleInvariantFeatureImageFilterTest.cxx @@ -1,10 +1,11 @@ /*========================================================================= -Program: ITK nSIFT Implemention - Command Line Wrapper -Module: $RCSfile: testnD.cxx,v $ -Language: C++ -Date: $Date: 2007/11/25 15:51:48 $ -Version: $Revision: 1.0 $ + +Program: ITK nSIFT Implemention - Command Line Wrapper +Language: C++ +Date: $Date$ +Version: $Revision$ Copyright (c) 2005,2006,2007 Warren Cheung + All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -30,224 +31,66 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =========================================================================*/ +#define GENERATE_KEYS #define VERBOSE -#define DEBUG -//#define DEBUG_VERBOSE - -#define SIFT_FEATURE -//#define REORIENT - -#define GENERATE_KEYS -//#define SUBSAMPLE #define CROP -//#define DO_DOUBLE #include "itkScaleInvariantFeatureImageFilter.h" #include "itkImageSeriesReader.h" #include "itkNumericSeriesFileNames.h" #include "itkPointSetToImageFilter.h" #include "itkImageFileWriter.h" -#include <getopt.h> -int itk2DScaleInvariantFeatureImageFilter( int argc, char *argv[] ) +int itk2DScaleInvariantFeatureImageFilterTest( int argc, char **argv) { - - // Command Line Arguments - unsigned int ARG_IMG1=2; - unsigned int ARG_IMG2=3; - unsigned int ARG_TMP=4; - - const unsigned int Dimension = 2; - - // Default scale is 1.0 - double test_scale = 1.0; - float test_rotate = 0.0; // 0 degrees - double test_crop = 0.5; - // float test_rotate = 0.0874; // 5 degrees - //float test_rotate = 0.1748; // 10 degrees - int series_start = 1; - int series_end = 9; - int series_inc = 1; - - int mode = 'i'; /* defaults to comparing 2 images */; - int rotate_middle=0; /* defaults to rotating around the origin */ - -#define OPT_SCALE 'x' -#define OPT_ROTATE 'r' -#define OPT_DIM 'd' -#define OPT_CROP 'c' -#define OPT_SERIES_START 's' -#define OPT_SERIES_END 'e' -#define OPT_SERIES_INC 'i' - - /* new Getopt code */ - while(1) { - static struct option long_options[] = - { - /* These options set a flag. */ - {"synthetic", 0, &mode, 's'}, - {"image", 0, &mode, 'i'}, - {"rotate-mid", 0, &rotate_middle, 1}, - /* These options don't set a flag. - We distinguish them by their indices. */ - {"scale", required_argument, 0, OPT_SCALE}, - {"rotate", required_argument, 0, OPT_ROTATE}, - {"crop", required_argument, 0, OPT_CROP}, - {"series-start", required_argument, 0, OPT_SERIES_START}, - {"series-end", required_argument, 0, OPT_SERIES_END}, - {"series-inc", required_argument, 0, OPT_SERIES_INC}, - // {"dimension", required_argument, 0, OPT_DIM}, - {0, 0, 0, 0} - }; - - int optindex; - int val = getopt_long(argc, argv, "", long_options, &optindex); - - if (val == -1) - break; - - switch(val) { - case OPT_SCALE: - test_scale = atof(optarg); - break; - case OPT_ROTATE: - if (atof(optarg) >= 0.0 && atof(optarg) <= 360.0) - test_rotate = atof(optarg) * PI * 2.0 / 360.0; - break; - case OPT_CROP: - if (atof(optarg) <= 1.0) { - test_crop = atof(optarg); - } - break; - case OPT_SERIES_START: - series_start = atoi(optarg); - break; - case OPT_SERIES_END: - series_end = atoi(optarg); - break; - case OPT_SERIES_INC: - series_inc = atoi(optarg); - break; - /* - case OPT_DIM: - Dimension = atoi(optarg); - break; - */ - } - } - - ARG_IMG1 = optind; - ARG_IMG2 = optind+1; - - if (mode == 'i') - { - ARG_TMP = optind+2; - } - else - { - ARG_TMP = optind+1; - } - - typedef float PixelType; - typedef itk::Image< PixelType, Dimension > FixedImageType; + const unsigned int Dimension = 2; + + const char* inputImage1 = argv[1]; + const char* outputImage1 = argv[2]; + const char* outputImage2 = argv[3]; + const char* outputImageKeys1 = argv[4]; + const char* outputImageKeys2 = argv[5]; + + // Default parametres + // scale is 1.0 + // rotate is 0 degrees + // crop is 0.5 + // rotate_middle is 0 (rotating around the origin + // mode is s (synthetic) + + double test_scale = atof(argv[6]); + float test_rotate = atof(argv[7])* M_PI * 2.0 / 360.0; + double test_crop = atof(argv[8]); + int rotate_middle= atoi(argv[9]); + int mode = 's'; + + typedef float PixelType; + typedef itk::Image<PixelType, Dimension> FixedImageType; typedef itk::ScaleInvariantFeatureImageFilter<FixedImageType, Dimension> SiftFilterType; typedef itk::Image<unsigned char, Dimension> OutputImageType; - typedef itk::ImageSource< FixedImageType > ImageSourceType; - + typedef itk::ImageSource<FixedImageType> ImageSourceType; + ImageSourceType::Pointer fixedImageReader, fixedImageReader2; - - typedef itk::PointSetToImageFilter - <SiftFilterType::PointSetType, OutputImageType> PointSetFilterType; - if( static_cast<unsigned int>(argc) <= ARG_IMG1 || (mode == 'i' && static_cast<unsigned int>(argc) <= ARG_IMG2 ) ) - { - std::cerr << "Incorrect number of parameters " << std::endl; - std::cerr << std::endl; - std::cerr << "siftkeys program ( "; - std::cerr << Dimension << "D "; -#ifdef SIFT_FEATURE - std::cerr << "sift-feature "; -#else - std::cerr << "histogram-feature "; -#endif -#ifdef REORIENT - std::cerr << "reoriented "; -#endif - std::cerr << ")" << std::endl; - - std::cerr << "Usage: \n"; - std::cerr << argv[0] << " [options] ImageFile [ImageFile2] [Temporary]\n"; - std::cerr << "This program takes an input image file(s) and generates scale invariant features." << std::endl; - std::cerr << std::endl; - std::cerr << "Image Processing Options (Choose ONE):" << std::endl; - std::cerr << "--image" << std::endl; - std::cerr << " compare ImageFile and ImageFile2" << std::endl; - std::cerr << "\nOR\n" << std::endl; - std::cerr << "--synthetic" << std::endl; - std::cerr << " compare ImageFile to synthetically generated version" << std::endl; - std::cerr << "Synthetic Image Options:" << std::endl; - std::cerr << "--rotate value" << std::endl; - std::cerr << " rotate synthetic image on first axis by value degrees" << std::endl; - std::cerr << "--rotate-middle" << std::endl; - std::cerr << " centre of rotation at the centre of image (defaults to origin)" << std::endl; - std::cerr << "--scale value" << std::endl; - std::cerr << " scale all axes of synthetic image by value" << std::endl; - std::cerr << "--tmp directory" << std::endl; - std::cerr << " temporary directory" << std::endl; - std::cerr << std::endl; - return 1; - } - + typedef itk::PointSetToImageFilter<SiftFilterType::PointSetType, OutputImageType> PointSetFilterType; + std::cerr << "Dimension = " << Dimension << "\n"; std::cerr << "Test Scale = " << test_scale << "\n"; std::cerr << "Test Rotate = " << test_rotate << "\n"; std::cerr << "Image Crop Ratio (first 3D) = " << test_crop << "\n"; std::cerr << "Mode = " << (char) mode << "\n"; - std::cerr << "ImageFile1 = " << argv[optind] << "\n"; - std::cerr << "Temp directory = " << argv[ARG_TMP] << "\n"; - if (Dimension == 4) { - std::cerr << "Image Series Start = " << series_start << "\n"; - std::cerr << "Image Series End = " << series_end << "\n"; - std::cerr << "Image Series Inc = " << series_inc << "\n"; - } - -#ifdef SIFT_FEATURE + std::cerr << "ImageFile1 = " << inputImage1 << "\n"; std::cerr << "SIFT Feature\n" << std::endl; -#else - std::cerr << "Histogram Feature\n" << std::endl; -#endif - -#ifdef REORIENT - std::cerr << "Reorientation enabled\n" << std::endl; -#endif - - if (Dimension == 4) { - /* Assume fileseries reader */ - typedef itk::ImageSeriesReader< FixedImageType > FixedImageReaderType; - FixedImageReaderType::Pointer tmpImageReader = FixedImageReaderType::New(); - - typedef itk::NumericSeriesFileNames NameGeneratorType; - NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New(); - - nameGenerator->SetSeriesFormat( argv[ARG_IMG1] ); - nameGenerator->SetStartIndex( series_start ); - nameGenerator->SetEndIndex( series_end ); - nameGenerator->SetIncrementIndex( series_inc ); - - tmpImageReader->SetFileNames( nameGenerator->GetFileNames() ); - - fixedImageReader = tmpImageReader; - } else { - typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType; - FixedImageReaderType::Pointer tmpImageReader = FixedImageReaderType::New(); - tmpImageReader = FixedImageReaderType::New(); - - tmpImageReader->SetFileName( argv[ARG_IMG1] ); - fixedImageReader=tmpImageReader; - } + + typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType; + FixedImageReaderType::Pointer tmpImageReader = FixedImageReaderType::New(); + tmpImageReader = FixedImageReaderType::New(); + + tmpImageReader->SetFileName( inputImage1 ); + fixedImageReader=tmpImageReader; fixedImageReader->Update(); - + typedef itk::ScalableAffineTransform< double, Dimension > ScaleType; #ifdef CROP ScaleType::Pointer no_transform = ScaleType::New(); @@ -269,23 +112,15 @@ int itk2DScaleInvariantFeatureImageFilter( int argc, char *argv[] ) #else FixedImageType::Pointer fixedImage = fixedImageReader->GetOutput(); #endif - + SiftFilterType::PointSetTypePointer keypoints1, keypoints2; PointSetFilterType::Pointer pointSet1 = PointSetFilterType::New(); PointSetFilterType::Pointer pointSet2 = PointSetFilterType::New(); - + SiftFilterType siftFilter1, siftFilter2; - if ( static_cast<unsigned int>(argc)-1 == ARG_TMP) - { - siftFilter1.SetTemporaryDir(argv[ARG_TMP]); - } - -#ifdef DEBUG - siftFilter1.writeImage(fixedImage, "utScaleInvariantFeatureImageFilter_0.png"); + siftFilter1.writeImage(fixedImage, outputImage1); std::cout << std::endl << "Starting SIFT Feature Extraction...\n"; -#endif - keypoints1 = siftFilter1.getSiftFeatures(fixedImage); pointSet1->SetInput(keypoints1); @@ -296,18 +131,9 @@ int itk2DScaleInvariantFeatureImageFilter( int argc, char *argv[] ) typedef itk::ImageFileWriter<OutputImageType> WriterType; WriterType::Pointer writer = WriterType::New(); - - std::string keys0_name = ""; - if (static_cast<unsigned int>(argc)-1 == ARG_TMP) - { - keys0_name = argv[ARG_TMP]; - keys0_name+="/"; - } - keys0_name+="utScaleInvariantFeatureImageFilter_keys0.png"; - writer->SetFileName(keys0_name.c_str()); + writer->SetFileName(outputImageKeys1); writer->SetInput(pointSet1->GetOutput()); writer->Update(); - //siftFilter1.writeImage(pointSet1->GetOutput(), "utScaleInvariantFeatureImageFilter_keys0.png"); typedef itk::ScalableAffineTransform< double, Dimension > TestTransformType; TestTransformType::Pointer inv_test_transform; @@ -347,9 +173,8 @@ int itk2DScaleInvariantFeatureImageFilter( int argc, char *argv[] ) std::cerr << "Rotation centred at origin." << std::endl; } #endif - + test_transform->Rotate(0,1,test_rotate); - #if 0 if (rotate_middle) { /* Cycle through each dimension and shift back*/ @@ -375,72 +200,29 @@ int itk2DScaleInvariantFeatureImageFilter( int argc, char *argv[] ) scaler->SetTransform(test_transform); scaler->Update(); scaledImage = scaler->GetOutput(); - -#ifdef DEBUG - siftFilter2.writeImage(scaledImage, "utScaleInvariantFeatureImageFilter_1.png"); + + siftFilter2.writeImage(scaledImage, outputImage2); std::cout << std::endl; -#endif + keypoints2 = siftFilter2.getSiftFeatures(scaledImage); - } - - std::cerr << "Test Image Scale: " << test_scale << std::endl; - // std::cerr << "Test Translate: " << test_translate << std::endl; - std::cerr << "Test Image Rotate: " << test_rotate << std::endl; - } else if (mode == 'i') { - std::cerr << std::endl << "Image Comparison mode\n"; - inv_test_transform = NULL; - - if (Dimension == 4) { - typedef itk::ImageSeriesReader< FixedImageType > FixedImageReaderType; - FixedImageReaderType::Pointer tmpImageReader = FixedImageReaderType::New(); - tmpImageReader = FixedImageReaderType::New(); - typedef itk::NumericSeriesFileNames NameGeneratorType; - NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New(); + pointSet2->SetInput(keypoints2); + pointSet1->SetOutsideValue(0); + pointSet1->SetInsideValue(255); + pointSet1->SetSize(scaledImage->GetLargestPossibleRegion().GetSize()); - nameGenerator->SetSeriesFormat( argv[ARG_IMG2] ); - nameGenerator->SetStartIndex( series_start ); - nameGenerator->SetEndIndex( series_end ); - nameGenerator->SetIncrementIndex( series_inc ); - - tmpImageReader->SetFileNames( nameGenerator->GetFileNames() ); - fixedImageReader2 = tmpImageReader; - } else { - typedef itk::ImageFileReader< FixedImageType > FixedImageReaderType; - FixedImageReaderType::Pointer tmpImageReader = FixedImageReaderType::New(); - tmpImageReader = FixedImageReaderType::New(); - - tmpImageReader->SetFileName( argv[ARG_IMG2] ); - fixedImageReader2 = tmpImageReader; + WriterType::Pointer writer2 = WriterType::New(); + writer2->SetFileName(outputImageKeys2); + writer2->SetInput(pointSet2->GetOutput()); + writer2->Update(); } - fixedImageReader2->Update(); - -#ifdef CROP - SiftFilterType::ResampleFilterType::Pointer cropper2 = SiftFilterType::ResampleFilterType::New(); - cropper2->SetInput(fixedImageReader2->GetOutput()); - FixedImageType::SizeType cropsize2 = - fixedImageReader2->GetOutput()->GetLargestPossibleRegion().GetSize(); - for (unsigned int k = 0; k < Dimension; ++k) { - if (k < 4) - cropsize2[k] /= 2; - } - cropper2->SetSize( cropsize2 ); - cropper2->SetOutputSpacing(fixedImageReader2->GetOutput()->GetSpacing()); - cropper2->SetTransform(no_transform); - cropper2->Update(); - FixedImageType::Pointer fixedImage2 = cropper2->GetOutput(); -#else - FixedImageType::Pointer fixedImage2 = fixedImageReader2->GetOutput(); -#endif + + std::cerr << "Test Image Scale: " << test_scale << std::endl; + std::cerr << "Test Image Rotate: " << test_rotate << std::endl; + std::cerr << std::endl << "Matching Keypoints\n"; - keypoints2 = siftFilter2.getSiftFeatures(fixedImage2); + siftFilter2.MatchKeypointsPos(keypoints1, keypoints2, inv_test_transform); + siftFilter2.MatchKeypointsFeatures(keypoints1, keypoints2, inv_test_transform); } - - std::cerr << std::endl << "Matching Keypoints\n"; - siftFilter2.MatchKeypointsPos(keypoints1, keypoints2, inv_test_transform); -#ifdef GENERATE_KEYS - siftFilter2.MatchKeypointsFeatures(keypoints1, keypoints2, inv_test_transform); -#endif return 0; - } diff --git a/Testing/Utilities/otbUtilitiesTests.cxx b/Testing/Utilities/otbUtilitiesTests.cxx index 4a6e03ea9c789c797670845d944a73fe2e8d4c58..a79b283709647894a1cfffa89eeab2802befb67f 100644 --- a/Testing/Utilities/otbUtilitiesTests.cxx +++ b/Testing/Utilities/otbUtilitiesTests.cxx @@ -38,7 +38,7 @@ REGISTER_TEST(tinyXMLlibTest); REGISTER_TEST(svmGenericKernelBasicOperationsTest); REGISTER_TEST(otbSVMComposedKernelFunctorTest); REGISTER_TEST(ossimRadarSatSupport); -REGISTER_TEST(itk2DScaleInvariantFeatureImageFilter); +REGISTER_TEST(itk2DScaleInvariantFeatureImageFilterTest); //REGISTER_TEST(openJpegEncoder); //REGISTER_TEST(openJpegDecoder); }