\ifCpp \section{Object Categorization} Some approaches based on local 2D features and used to object categorization are described in this section. \cvclass{BOWTrainer} Abstract base class for training ''bag of visual words'' vocabulary from a set of descriptors. See e.g. ''Visual Categorization with Bags of Keypoints'' of Gabriella Csurka, Christopher R. Dance, Lixin Fan, Jutta Willamowski, Cedric Bray, 2004. \begin{lstlisting} class BOWTrainer { public: BOWTrainer(){} virtual ~BOWTrainer(){} void add( const Mat& descriptors ); const vector& getDescriptors() const; int descripotorsCount() const; virtual void clear(); virtual Mat cluster() const = 0; virtual Mat cluster( const Mat& descriptors ) const = 0; protected: ... }; \end{lstlisting} \cvCppFunc{BOWTrainer::add} Add descriptors to training set. The training set will be clustered using \texttt{cluster} method to construct vocabulary. \cvdefCpp{ void BOWTrainer::add( const Mat\& descriptors ); } \begin{description} \cvarg{descriptors}{Descriptors to add to training set. Each row of \texttt{descriptors} matrix is a one descriptor.} \end{description} \cvCppFunc{BOWTrainer::getDescriptors} Returns training set of descriptors. \cvdefCpp{ const vector\& BOWTrainer::getDescriptors() const; } \cvCppFunc{BOWTrainer::descripotorsCount} Returns count of all descriptors stored in the training set. \cvdefCpp{ const vector\& BOWTrainer::descripotorsCount() const; } \cvCppFunc{BOWTrainer::cluster} Cluster train descriptors. Vocabulary consists from cluster centers. So this method returns vocabulary. In first method variant the stored in object train descriptors will be clustered, in second variant -- input descriptors will be clustered. \cvdefCpp{ Mat BOWTrainer::cluster() const; } \cvdefCpp{ Mat BOWTrainer::cluster( const Mat\& descriptors ) const; } \begin{description} \cvarg{descriptors}{Descriptors to cluster. Each row of \texttt{descriptors} matrix is a one descriptor. Descriptors will not be added to the inner train descriptor set.} \end{description} \cvclass{BOWKMeansTrainer} \cvCppCross{kmeans} based class to train visual vocabulary using the ''bag of visual words'' approach. \begin{lstlisting} class BOWKMeansTrainer : public BOWTrainer { public: BOWKMeansTrainer( int clusterCount, const TermCriteria& termcrit=TermCriteria(), int attempts=3, int flags=KMEANS_PP_CENTERS ); virtual ~BOWKMeansTrainer(){} // Returns trained vocabulary (i.e. cluster centers). virtual Mat cluster() const; virtual Mat cluster( const Mat& descriptors ) const; protected: ... }; \end{lstlisting} To gain an understanding of constructor parameters see \cvCppCross{kmeans} function arguments. \cvclass{BOWImgDescriptorExtractor} Class to compute image descriptor using ''bad of visual words''. In few, such computing consists from the following steps: 1. Compute descriptors for given image and it's keypoints set, \\ 2. Find nearest visual words from vocabulary for each keypoint descriptor, \\ 3. Image descriptor is a normalized histogram of vocabulary words encountered in the image. I.e. \texttt{i}-bin of the histogram is a frequency of \texttt{i}-word of vocabulary in the given image. \begin{lstlisting} class BOWImgDescriptorExtractor { public: BOWImgDescriptorExtractor( const Ptr& dextractor, const Ptr& dmatcher ); virtual ~BOWImgDescriptorExtractor(){} void setVocabulary( const Mat& vocabulary ); const Mat& getVocabulary() const; void compute( const Mat& image, vector& keypoints, Mat& imgDescriptor, vector >* pointIdxsOfClusters=0, Mat* descriptors=0 ); int descriptorSize() const; int descriptorType() const; protected: ... }; \end{lstlisting} \cvCppFunc{BOWImgDescriptorExtractor::BOWImgDescriptorExtractor} Constructor. \cvdefCpp{ BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( \par const Ptr\& dextractor, \par const Ptr\& dmatcher ); } \begin{description} \cvarg{dextractor}{Descriptor extractor that will be used to compute descriptors for input image and it's keypoints.} \cvarg{dmatcher}{Descriptor matcher that will be used to find nearest word of trained vocabulary to each keupoints descriptor of the image.} \end{description} \cvCppFunc{BOWImgDescriptorExtractor::setVocabulary} Method to set visual vocabulary. \cvdefCpp{ void BOWImgDescriptorExtractor::setVocabulary( const Mat\& vocabulary ); } \begin{description} \cvarg{vocabulary}{Vocabulary (can be trained using inheritor of \cvCppCross{BOWTrainer}). Each row of vocabulary is a one visual word (cluster center).} \end{description} \cvCppFunc{BOWImgDescriptorExtractor::getVocabulary} Returns set vocabulary. \cvdefCpp{ const Mat\& BOWImgDescriptorExtractor::getVocabulary() const; } \cvCppFunc{BOWImgDescriptorExtractor::compute} Compute image descriptor using set visual vocabulary. \cvdefCpp{ void BOWImgDescriptorExtractor::compute( const Mat\& image, \par vector\& keypoints, Mat\& imgDescriptor, \par vector >* pointIdxsOfClusters=0, \par Mat* descriptors=0 ); } \begin{description} \cvarg{image}{The image. Image descriptor will be computed for this.} \cvarg{keypoints}{Keypoints detected in the input image.} \cvarg{imgDescriptor}{This is output, i.e. computed image descriptor.} \cvarg{pointIdxsOfClusters}{Indices of keypoints which belong to the cluster, i.e. \texttt{pointIdxsOfClusters[i]} is keypoint indices which belong to the \texttt{i-}cluster (word of vocabulary) (returned if it is not 0.)} \cvarg{descriptors}{Descriptors of the image keypoints (returned if it is not 0.)} \end{description} \cvCppFunc{BOWImgDescriptorExtractor::descriptorSize} Returns image discriptor size, if vocabulary was set, and 0 otherwise. \cvdefCpp{ int BOWImgDescriptorExtractor::descriptorSize() const; } \cvCppFunc{BOWImgDescriptorExtractor::descriptorType} Returns image descriptor type. \cvdefCpp{ int BOWImgDescriptorExtractor::descriptorType() const; } \fi