Commit 41b0a71a authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

Merge pull request #796 from sovrasov:saliency_python_bindings

parents 82e612bb 94e919eb
set(the_description "Saliency API") set(the_description "Saliency API")
set(OPENCV_MODULE_IS_PART_OF_WORLD OFF) set(OPENCV_MODULE_IS_PART_OF_WORLD OFF)
add_definitions(-DOBJECTNESS_MODELS_PATH="${CMAKE_INSTALL_PREFIX}/${OPENCV_OTHER_INSTALL_PATH}/Objectness")
file(GLOB OBJECTNESS_TRAINED_MODELS samples/ObjectnessTrainedModel/*.yml.gz)
install(FILES ${OBJECTNESS_TRAINED_MODELS} DESTINATION ${OPENCV_OTHER_INSTALL_PATH}/Objectness COMPONENT libs)
install(DIRECTORY DESTINATION ${OPENCV_OTHER_INSTALL_PATH}/Objectness/Results)
ocv_define_module(saliency opencv_imgproc opencv_highgui opencv_features2d WRAP python) ocv_define_module(saliency opencv_imgproc opencv_highgui opencv_features2d WRAP python)
...@@ -59,7 +59,7 @@ namespace saliency ...@@ -59,7 +59,7 @@ namespace saliency
/************************************ Saliency Base Class ************************************/ /************************************ Saliency Base Class ************************************/
class CV_EXPORTS Saliency : public virtual Algorithm class CV_EXPORTS_W Saliency : public virtual Algorithm
{ {
public: public:
/** /**
...@@ -78,13 +78,13 @@ class CV_EXPORTS Saliency : public virtual Algorithm ...@@ -78,13 +78,13 @@ class CV_EXPORTS Saliency : public virtual Algorithm
* \param saliencyMap The computed saliency map. * \param saliencyMap The computed saliency map.
* \return true if the saliency map is computed, false otherwise * \return true if the saliency map is computed, false otherwise
*/ */
bool computeSaliency( InputArray image, OutputArray saliencyMap ); CV_WRAP bool computeSaliency( InputArray image, OutputArray saliencyMap );
/** /**
* \brief Get the name of the specific saliency type * \brief Get the name of the specific saliency type
* \return The name of the tracker initializer * \return The name of the tracker initializer
*/ */
String getClassName() const; CV_WRAP String getClassName() const;
protected: protected:
...@@ -93,7 +93,7 @@ class CV_EXPORTS Saliency : public virtual Algorithm ...@@ -93,7 +93,7 @@ class CV_EXPORTS Saliency : public virtual Algorithm
}; };
/************************************ Static Saliency Base Class ************************************/ /************************************ Static Saliency Base Class ************************************/
class CV_EXPORTS StaticSaliency : public virtual Saliency class CV_EXPORTS_W StaticSaliency : public virtual Saliency
{ {
public: public:
...@@ -109,17 +109,17 @@ class CV_EXPORTS StaticSaliency : public virtual Saliency ...@@ -109,17 +109,17 @@ class CV_EXPORTS StaticSaliency : public virtual Saliency
algorithm calculates the optimal threshold separating those two classes, so that their algorithm calculates the optimal threshold separating those two classes, so that their
intra-class variance is minimal. intra-class variance is minimal.
@param saliencyMap the saliency map obtained through one of the specialized algorithms @param _saliencyMap the saliency map obtained through one of the specialized algorithms
@param binaryMap the binary map @param _binaryMap the binary map
*/ */
bool computeBinaryMap( const Mat& saliencyMap, Mat& binaryMap ); CV_WRAP bool computeBinaryMap( InputArray _saliencyMap, OutputArray _binaryMap );
protected: protected:
virtual bool computeSaliencyImpl( InputArray image, OutputArray saliencyMap )=0; virtual bool computeSaliencyImpl( InputArray image, OutputArray saliencyMap )=0;
}; };
/************************************ Motion Saliency Base Class ************************************/ /************************************ Motion Saliency Base Class ************************************/
class CV_EXPORTS MotionSaliency : public virtual Saliency class CV_EXPORTS_W MotionSaliency : public virtual Saliency
{ {
protected: protected:
...@@ -128,7 +128,7 @@ class CV_EXPORTS MotionSaliency : public virtual Saliency ...@@ -128,7 +128,7 @@ class CV_EXPORTS MotionSaliency : public virtual Saliency
}; };
/************************************ Objectness Base Class ************************************/ /************************************ Objectness Base Class ************************************/
class CV_EXPORTS Objectness : public virtual Saliency class CV_EXPORTS_W Objectness : public virtual Saliency
{ {
protected: protected:
......
...@@ -42,11 +42,11 @@ ...@@ -42,11 +42,11 @@
#ifndef __OPENCV_SALIENCY_SPECIALIZED_CLASSES_HPP__ #ifndef __OPENCV_SALIENCY_SPECIALIZED_CLASSES_HPP__
#define __OPENCV_SALIENCY_SPECIALIZED_CLASSES_HPP__ #define __OPENCV_SALIENCY_SPECIALIZED_CLASSES_HPP__
//#include "opencv2/saliency/kyheader.hpp"
#include <cstdio> #include <cstdio>
#include <string> #include <string>
#include <iostream> #include <iostream>
#include <stdint.h> #include <stdint.h>
#include "saliencyBaseClasses.hpp"
#include "opencv2/core.hpp" #include "opencv2/core.hpp"
namespace cv namespace cv
...@@ -66,37 +66,50 @@ pre-attentive visual search. The algorithm analyze the log spectrum of each imag ...@@ -66,37 +66,50 @@ pre-attentive visual search. The algorithm analyze the log spectrum of each imag
spectral residual. Then transform the spectral residual to spatial domain to obtain the saliency spectral residual. Then transform the spectral residual to spatial domain to obtain the saliency
map, which suggests the positions of proto-objects. map, which suggests the positions of proto-objects.
*/ */
class CV_EXPORTS StaticSaliencySpectralResidual : public StaticSaliency class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency
{ {
public: public:
StaticSaliencySpectralResidual(); StaticSaliencySpectralResidual();
virtual ~StaticSaliencySpectralResidual(); virtual ~StaticSaliencySpectralResidual();
void read( const FileNode& fn ); CV_WRAP static Ptr<StaticSaliencySpectralResidual> create()
{
return makePtr<StaticSaliencySpectralResidual>();
}
CV_WRAP bool computeSaliency( InputArray image, OutputArray saliencyMap )
{
if( image.empty() )
return false;
return computeSaliencyImpl( image, saliencyMap );
}
CV_WRAP void read( const FileNode& fn );
void write( FileStorage& fs ) const; void write( FileStorage& fs ) const;
int getImageWidth() const CV_WRAP int getImageWidth() const
{ {
return resImWidth; return resImWidth;
} }
inline void setImageWidth(int val) CV_WRAP inline void setImageWidth(int val)
{ {
resImWidth = val; resImWidth = val;
} }
int getImageHeight() const CV_WRAP int getImageHeight() const
{ {
return resImHeight; return resImHeight;
} }
void setImageHeight(int val) CV_WRAP void setImageHeight(int val)
{ {
resImHeight = val; resImHeight = val;
} }
protected: protected:
bool computeSaliencyImpl( InputArray image, OutputArray saliencyMap ); bool computeSaliencyImpl( InputArray image, OutputArray saliencyMap );
int resImWidth; CV_PROP_RW int resImWidth;
int resImHeight; CV_PROP_RW int resImHeight;
}; };
...@@ -111,36 +124,49 @@ protected: ...@@ -111,36 +124,49 @@ protected:
*/ */
/** @brief the Fast Self-tuning Background Subtraction Algorithm from @cite BinWangApr2014 /** @brief the Fast Self-tuning Background Subtraction Algorithm from @cite BinWangApr2014
*/ */
class CV_EXPORTS MotionSaliencyBinWangApr2014 : public MotionSaliency class CV_EXPORTS_W MotionSaliencyBinWangApr2014 : public MotionSaliency
{ {
public: public:
MotionSaliencyBinWangApr2014(); MotionSaliencyBinWangApr2014();
virtual ~MotionSaliencyBinWangApr2014(); virtual ~MotionSaliencyBinWangApr2014();
CV_WRAP static Ptr<MotionSaliencyBinWangApr2014> create()
{
return makePtr<MotionSaliencyBinWangApr2014>();
}
CV_WRAP bool computeSaliency( InputArray image, OutputArray saliencyMap )
{
if( image.empty() )
return false;
return computeSaliencyImpl( image, saliencyMap );
}
/** @brief This is a utility function that allows to set the correct size (taken from the input image) in the /** @brief This is a utility function that allows to set the correct size (taken from the input image) in the
corresponding variables that will be used to size the data structures of the algorithm. corresponding variables that will be used to size the data structures of the algorithm.
@param W width of input image @param W width of input image
@param H height of input image @param H height of input image
*/ */
void setImagesize( int W, int H ); CV_WRAP void setImagesize( int W, int H );
/** @brief This function allows the correct initialization of all data structures that will be used by the /** @brief This function allows the correct initialization of all data structures that will be used by the
algorithm. algorithm.
*/ */
bool init(); CV_WRAP bool init();
int getImageWidth() const CV_WRAP int getImageWidth() const
{ {
return imageWidth; return imageWidth;
} }
inline void setImageWidth(int val) CV_WRAP inline void setImageWidth(int val)
{ {
imageWidth = val; imageWidth = val;
} }
int getImageHeight() const CV_WRAP int getImageHeight() const
{ {
return imageHeight; return imageHeight;
} }
void setImageHeight(int val) CV_WRAP void setImageHeight(int val)
{ {
imageHeight = val; imageHeight = val;
} }
...@@ -177,8 +203,8 @@ private: ...@@ -177,8 +203,8 @@ private:
//fixed parameter //fixed parameter
bool neighborhoodCheck; bool neighborhoodCheck;
int N_DS;// Number of template to be downsampled and used in lowResolutionDetection function int N_DS;// Number of template to be downsampled and used in lowResolutionDetection function
int imageWidth;// Width of input image CV_PROP_RW int imageWidth;// Width of input image
int imageHeight;//Height of input image CV_PROP_RW int imageHeight;//Height of input image
int K;// Number of background model template int K;// Number of background model template
int N;// NxN is the size of the block for downsampling in the lowlowResolutionDetection int N;// NxN is the size of the block for downsampling in the lowlowResolutionDetection
float alpha;// Learning rate float alpha;// Learning rate
...@@ -200,15 +226,28 @@ private: ...@@ -200,15 +226,28 @@ private:
/** @brief the Binarized normed gradients algorithm from @cite BING /** @brief the Binarized normed gradients algorithm from @cite BING
*/ */
class CV_EXPORTS ObjectnessBING : public Objectness class CV_EXPORTS_W ObjectnessBING : public Objectness
{ {
public: public:
ObjectnessBING(); ObjectnessBING();
virtual ~ObjectnessBING(); virtual ~ObjectnessBING();
void read(); CV_WRAP static Ptr<ObjectnessBING> create()
void write() const; {
return makePtr<ObjectnessBING>();
}
CV_WRAP bool computeSaliency( InputArray image, OutputArray saliencyMap )
{
if( image.empty() )
return false;
return computeSaliencyImpl( image, saliencyMap );
}
CV_WRAP void read();
CV_WRAP void write() const;
/** @brief Return the list of the rectangles' objectness value, /** @brief Return the list of the rectangles' objectness value,
...@@ -222,7 +261,7 @@ public: ...@@ -222,7 +261,7 @@ public:
the trained model. the trained model.
@param trainingPath trained model path @param trainingPath trained model path
*/ */
void setTrainingPath( std::string trainingPath ); CV_WRAP void setTrainingPath( const String& trainingPath );
/** @brief This is a utility function that allows to set an arbitrary path in which the algorithm will save the /** @brief This is a utility function that allows to set an arbitrary path in which the algorithm will save the
optional results optional results
...@@ -231,29 +270,29 @@ public: ...@@ -231,29 +270,29 @@ public:
each row). each row).
@param resultsDir results' folder path @param resultsDir results' folder path
*/ */
void setBBResDir( std::string resultsDir ); CV_WRAP void setBBResDir( const String& resultsDir );
double getBase() const CV_WRAP double getBase() const
{ {
return _base; return _base;
} }
inline void setBase(double val) CV_WRAP inline void setBase(double val)
{ {
_base = val; _base = val;
} }
int getNSS() const CV_WRAP int getNSS() const
{ {
return _NSS; return _NSS;
} }
void setNSS(int val) CV_WRAP void setNSS(int val)
{ {
_NSS = val; _NSS = val;
} }
int getW() const CV_WRAP int getW() const
{ {
return _W; return _W;
} }
void setW(int val) CV_WRAP void setW(int val)
{ {
_W = val; _W = val;
} }
......
...@@ -71,6 +71,9 @@ ObjectnessBING::ObjectnessBING() ...@@ -71,6 +71,9 @@ ObjectnessBING::ObjectnessBING()
setColorSpace( _Clr ); setColorSpace( _Clr );
className = "BING"; className = "BING";
setTrainingPath(OBJECTNESS_MODELS_PATH);
setBBResDir(OBJECTNESS_MODELS_PATH "/Results");
} }
ObjectnessBING::~ObjectnessBING() ObjectnessBING::~ObjectnessBING()
...@@ -85,12 +88,12 @@ void ObjectnessBING::setColorSpace( int clr ) ...@@ -85,12 +88,12 @@ void ObjectnessBING::setColorSpace( int clr )
_bbResDir = _resultsDir + "/" + std::string( format( "BBoxesB%gW%d%s/", _base, _W, _clrName[_Clr] ).c_str() ); _bbResDir = _resultsDir + "/" + std::string( format( "BBoxesB%gW%d%s/", _base, _W, _clrName[_Clr] ).c_str() );
} }
void ObjectnessBING::setTrainingPath( std::string trainingPath ) void ObjectnessBING::setTrainingPath( const String& trainingPath )
{ {
_trainingPath = trainingPath; _trainingPath = trainingPath;
} }
void ObjectnessBING::setBBResDir( std::string resultsDir ) void ObjectnessBING::setBBResDir(const String &resultsDir )
{ {
_resultsDir = resultsDir; _resultsDir = resultsDir;
} }
......
...@@ -50,9 +50,9 @@ namespace saliency ...@@ -50,9 +50,9 @@ namespace saliency
* StaticSaliency * StaticSaliency
*/ */
bool StaticSaliency::computeBinaryMap( const Mat& saliencyMap, Mat& BinaryMap ) bool StaticSaliency::computeBinaryMap( InputArray _saliencyMap, OutputArray _binaryMap )
{ {
Mat saliencyMap = _saliencyMap.getMat();
Mat labels = Mat::zeros( saliencyMap.rows * saliencyMap.cols, 1, 1 ); Mat labels = Mat::zeros( saliencyMap.rows * saliencyMap.cols, 1, 1 );
Mat samples = Mat_<float>( saliencyMap.rows * saliencyMap.cols, 1 ); Mat samples = Mat_<float>( saliencyMap.rows * saliencyMap.cols, 1 );
Mat centers; Mat centers;
...@@ -90,6 +90,8 @@ bool StaticSaliency::computeBinaryMap( const Mat& saliencyMap, Mat& BinaryMap ) ...@@ -90,6 +90,8 @@ bool StaticSaliency::computeBinaryMap( const Mat& saliencyMap, Mat& BinaryMap )
outputMat.convertTo( outputMat, CV_8U ); outputMat.convertTo( outputMat, CV_8U );
// adaptative thresholding using Otsu's method, to make saliency map binary // adaptative thresholding using Otsu's method, to make saliency map binary
_binaryMap.createSameSize(outputMat, outputMat.type());
Mat BinaryMap = _binaryMap.getMat();
threshold( outputMat, BinaryMap, 0, 255, THRESH_BINARY | THRESH_OTSU ); threshold( outputMat, BinaryMap, 0, 255, THRESH_BINARY | THRESH_OTSU );
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment