Size patchSize(PATCH_SIZE, PATCH_SIZE);
for (keypt_it = base_set.begin(); keypt_it != base_set.end(); ++keypt_it, ++class_id) {
for (int i = 0; i < views; ++i) {
- make_patch( Mat(keypt_it->image), Point(keypt_it->y, keypt_it->x ), patch, patchSize, rng );
+ make_patch( Mat(keypt_it->image), Point(keypt_it->x, keypt_it->y ), patch, patchSize, rng );
IplImage iplPatch = patch;
addExample(class_id, getData(&iplPatch));
}
//! segments the image using watershed algorithm
CV_EXPORTS void watershed( const Mat& image, Mat& markers );
+//! filters image using meanshift algorithm
+CV_EXPORTS void pyrMeanShiftFiltering( const Mat& src, Mat& dst,
+ double sp, double sr, int maxLevel=1,
+ TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );
+
//! class of the pixel in GrabCut algorithm
enum { GC_BGD = 0, //!< background
GC_FGD = 1, //!< foreground
}
}
+void cv::pyrMeanShiftFiltering( const Mat& src, Mat& dst,
+ double sp, double sr, int maxLevel,
+ TermCriteria termcrit )
+{
+ if( src.empty() )
+ return;
+
+ dst.create( src.size(), src.type() );
+ CvMat _src = src, _dst = dst;
+ cvPyrMeanShiftFiltering( &_src, &_dst, sp, sr, maxLevel, termcrit );
+}
--- /dev/null
+#include <highgui.h>
+#include "opencv2/core/core.hpp"
+#include "opencv2/imgproc/imgproc.hpp"
+#include <iostream>
+
+using namespace cv;
+using namespace std;
+
+void floodFillPostprocess( Mat& img, const Scalar& colorDiff=Scalar::all(1) )
+{
+ CV_Assert( !img.empty() );
+ RNG rng = theRNG();
+ Mat mask( img.rows+2, img.cols+2, CV_8UC1, Scalar::all(0) );
+ for( int y = 0; y < img.rows; y++ )
+ {
+ for( int x = 0; x < img.cols; x++ )
+ {
+ if( mask.at<uchar>(y+1, x+1) == 0 )
+ {
+ Scalar newVal( rng(256), rng(256), rng(256) );
+ floodFill( img, mask, Point(x,y), newVal, 0, colorDiff, colorDiff );
+ }
+ }
+ }
+}
+
+string winName = "meanshift";
+int spatialRad, colorRad, maxPyrLevel;
+Mat img, res;
+
+void meanShiftSegmentation( int, void* )
+{
+ cout << "spatialRad=" << spatialRad << "; "
+ << "colorRad=" << colorRad << "; "
+ << "maxPyrLevel=" << maxPyrLevel << endl;
+ pyrMeanShiftFiltering( img, res, spatialRad, colorRad, maxPyrLevel );
+ floodFillPostprocess( res, Scalar::all(2) );
+ imshow( winName, res );
+}
+
+int main(int argc, char** argv)
+{
+ if( argc !=2 )
+ {
+ cout << "Format:" << endl << argv[0] << " image" << endl;
+ return -1;
+ }
+
+ img = imread( argv[1] );
+ if( img.empty() )
+ return -1;
+
+ spatialRad = 10;
+ colorRad = 10;
+ maxPyrLevel = 1;
+
+ namedWindow( winName, CV_WINDOW_AUTOSIZE );
+
+ createTrackbar( "spatialRad", winName, &spatialRad, 80, meanShiftSegmentation );
+ createTrackbar( "colorRad", winName, &colorRad, 60, meanShiftSegmentation );
+ createTrackbar( "maxPyrLevel", winName, &maxPyrLevel, 5, meanShiftSegmentation );
+
+ meanShiftSegmentation(0, 0);
+ waitKey();
+ return 0;
+}