From a1aa3696274f7759baab5d637c88dbb6d4a70eba Mon Sep 17 00:00:00 2001 From: jaco Date: Wed, 28 May 2014 18:48:33 +0200 Subject: [PATCH] Spectral Residual Saliency added --- .../opencv2/saliency/saliencyBaseClasses.hpp | 8 +- .../saliency/saliencySpecializedClasses.hpp | 3 +- modules/saliency/src/staticSaliency.cpp | 102 ++++++++++++++++++ .../src/staticSaliencySpectralResidual.cpp | 69 +++--------- 4 files changed, 123 insertions(+), 59 deletions(-) create mode 100644 modules/saliency/src/staticSaliency.cpp diff --git a/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp b/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp index c7f6ffb49..fe0359f48 100644 --- a/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp +++ b/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp @@ -95,7 +95,9 @@ class CV_EXPORTS_W StaticSaliency : public virtual Saliency Params(); }; - //protected: + bool computeBinaryMap( const Mat& saliencyMap, Mat& outputMat ); + + //protected: //virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; private: @@ -111,7 +113,7 @@ class CV_EXPORTS_W MotionSaliency : public virtual Saliency Params(); }; - //protected: + //protected: //virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; private: @@ -128,7 +130,7 @@ class CV_EXPORTS_W Objectness : public virtual Saliency }; // protected: - // virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; + // virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; private: Params params; diff --git a/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp b/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp index 14aac9032..899424e6a 100644 --- a/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp +++ b/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp @@ -65,6 +65,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency struct CV_EXPORTS Params { Params(); + Size resizedImageSize; void read( const FileNode& fn ); void write( FileStorage& fs ) const; }; @@ -75,7 +76,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency void write( FileStorage& fs ) const; protected: - bool computeKmeans( Mat& saliencyMap, Mat& outputMat ); + bool computeSaliencyImpl( const Mat& src, Mat& dst ); AlgorithmInfo* info() const; diff --git a/modules/saliency/src/staticSaliency.cpp b/modules/saliency/src/staticSaliency.cpp new file mode 100644 index 000000000..4aa2342c3 --- /dev/null +++ b/modules/saliency/src/staticSaliency.cpp @@ -0,0 +1,102 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// + // + // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. + // + // By downloading, copying, installing or using the software you agree to this license. + // If you do not agree to this license, do not download, install, + // copy or use the software. + // + // + // License Agreement + // For Open Source Computer Vision Library + // + // Copyright (C) 2013, OpenCV Foundation, all rights reserved. + // Third party copyrights are property of their respective owners. + // + // Redistribution and use in source and binary forms, with or without modification, + // are permitted provided that the following conditions are met: + // + // * Redistribution's of source code must retain the above copyright notice, + // this list of conditions and the following disclaimer. + // + // * Redistribution's in binary form must reproduce the above copyright notice, + // this list of conditions and the following disclaimer in the documentation + // and/or other materials provided with the distribution. + // + // * The name of the copyright holders may not be used to endorse or promote products + // derived from this software without specific prior written permission. + // + // This software is provided by the copyright holders and contributors "as is" and + // any express or implied warranties, including, but not limited to, the implied + // warranties of merchantability and fitness for a particular purpose are disclaimed. + // In no event shall the Intel Corporation or contributors be liable for any direct, + // indirect, incidental, special, exemplary, or consequential damages + // (including, but not limited to, procurement of substitute goods or services; + // loss of use, data, or profits; or business interruption) however caused + // and on any theory of liability, whether in contract, strict liability, + // 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. + // + //M*/ + +#include "precomp.hpp" + +namespace cv +{ + +/** + * StaticSaliency + */ + +/** + * Parameters + */ + +StaticSaliency::Params::Params() +{ + +} + +bool StaticSaliency::computeBinaryMap( const Mat& saliencyMap, Mat& BinaryMap ) +{ + + Mat labels = Mat::zeros( saliencyMap.rows * saliencyMap.cols, 1, 1 ); + Mat samples = Mat_( saliencyMap.rows * saliencyMap.cols, 1 ); + Mat centers; + TermCriteria terminationCriteria; + terminationCriteria.epsilon = 0.2; + terminationCriteria.maxCount = 1000; + terminationCriteria.type = TermCriteria::COUNT + TermCriteria::EPS; + + int elemCounter = 0; + for ( int i = 0; i < saliencyMap.rows; i++ ) + { + for ( int j = 0; j < saliencyMap.cols; j++ ) + { + samples.at( elemCounter, 0 ) = saliencyMap.at( i, j ); + elemCounter++; + } + } + + kmeans( samples, 5, labels, terminationCriteria, 5, KMEANS_RANDOM_CENTERS, centers ); + + Mat outputMat = Mat_( saliencyMap.size() ); + int intCounter = 0; + for ( int x = 0; x < saliencyMap.rows; x++ ) + { + for ( int y = 0; y < saliencyMap.cols; y++ ) + { + outputMat.at( x, y ) = centers.at( labels.at( intCounter, 0 ), 0 ); + intCounter++; + } + + } + + // adaptative thresholding using Otsu's method, to make saliency map binary + threshold( outputMat, BinaryMap, 0, 255, THRESH_BINARY | THRESH_OTSU ); + + return true; + +} + +}/* namespace cv */ diff --git a/modules/saliency/src/staticSaliencySpectralResidual.cpp b/modules/saliency/src/staticSaliencySpectralResidual.cpp index 9fe636456..d9b19568f 100644 --- a/modules/saliency/src/staticSaliencySpectralResidual.cpp +++ b/modules/saliency/src/staticSaliencySpectralResidual.cpp @@ -54,7 +54,7 @@ namespace cv StaticSaliencySpectralResidual::Params::Params() { - + resizedImageSize=Size(64,64); } StaticSaliencySpectralResidual::StaticSaliencySpectralResidual( const StaticSaliencySpectralResidual::Params ¶meters ) : @@ -78,69 +78,30 @@ void StaticSaliencySpectralResidual::write( cv::FileStorage& fs ) const params.write( fs ); } -bool StaticSaliencySpectralResidual::computeKmeans( Mat& saliencyMap, Mat& outputMat ) -{ - - Mat labels = Mat::zeros( saliencyMap.rows * saliencyMap.cols, 1, 1 ); - Mat samples = Mat_( saliencyMap.rows * saliencyMap.cols, 1 ); - Mat centers; - TermCriteria terminationCriteria; - terminationCriteria.epsilon = 0.2; - terminationCriteria.maxCount = 1000; - terminationCriteria.type = TermCriteria::COUNT + TermCriteria::EPS; - - int elemCounter = 0; - for ( int i = 0; i < saliencyMap.rows; i++ ) - { - for ( int j = 0; j < saliencyMap.cols; j++ ) - { - samples.at( elemCounter, 0 ) = saliencyMap.at( i, j ); - elemCounter++; - } - } - - kmeans( samples, 5, labels, terminationCriteria, 5, KMEANS_RANDOM_CENTERS, centers ); - - outputMat = Mat_( saliencyMap.size() ); - int intCounter = 0; - for ( int x = 0; x < saliencyMap.rows; x++ ) - { - for ( int y = 0; y < saliencyMap.cols; y++ ) - { - outputMat.at( x, y ) = centers.at( labels.at( intCounter, 0 ), 0 ); - intCounter++; - } - - } - - return true; - -} bool StaticSaliencySpectralResidual::computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) { Mat grayTemp, grayDown; std::vector mv; - Size imageSize( 64, 64 ); - Mat realImage( imageSize, CV_64F ); - Mat imaginaryImage( imageSize, CV_64F ); + Mat realImage( params.resizedImageSize, CV_64F ); + Mat imaginaryImage( params.resizedImageSize, CV_64F ); imaginaryImage.setTo( 0 ); - Mat combinedImage( imageSize, CV_64FC2 ); + Mat combinedImage( params.resizedImageSize, CV_64FC2 ); Mat imageDFT; Mat logAmplitude; - Mat angle( imageSize, CV_64F ); - Mat magnitude( imageSize, CV_64F ); + Mat angle( params.resizedImageSize, CV_64F ); + Mat magnitude( params.resizedImageSize, CV_64F ); Mat logAmplitude_blur, imageGR; if( image.channels() == 3 ) { cvtColor( image, imageGR, COLOR_BGR2GRAY ); - resize( imageGR, grayDown, imageSize, 0, 0, INTER_LINEAR ); + resize( imageGR, grayDown, params.resizedImageSize, 0, 0, INTER_LINEAR ); } else { - resize( image, grayDown, imageSize, 0, 0, INTER_LINEAR ); + resize( image, grayDown, params.resizedImageSize, 0, 0, INTER_LINEAR ); } grayDown.convertTo( realImage, CV_64F ); @@ -176,17 +137,15 @@ bool StaticSaliencySpectralResidual::computeSaliencyImpl( const Mat& image, Mat& resize( magnitude, saliencyMap, image.size(), 0, 0, INTER_LINEAR ); - // CLUSTERING BY K-MEANS - Mat outputMat; - computeKmeans( saliencyMap, outputMat ); - +#ifdef SALIENCY_DEBUG + // visualize saliency map before and after K-means imshow( "Saliency Map", saliencyMap ); - imshow( "K-mean", outputMat ); +#endif -// FINE CLUSTERING - outputMat = outputMat * 255; +//TODO try the results and then delete + /*outputMat = outputMat * 255; outputMat.convertTo( outputMat, CV_8U ); - saliencyMap = outputMat; + saliencyMap = outputMat; */ return true;