added c++ interface for cvPyrMeanShiftFiltering; added sample on meanshift segmentation
authorMaria Dimashova <no@email>
Wed, 28 Jul 2010 16:41:12 +0000 (16:41 +0000)
committerMaria Dimashova <no@email>
Wed, 28 Jul 2010 16:41:12 +0000 (16:41 +0000)
modules/features2d/src/calonder.cpp
modules/imgproc/include/opencv2/imgproc/imgproc.hpp
modules/imgproc/src/segmentation.cpp
samples/cpp/meanshift_segmentation.cpp [new file with mode: 0644]

index abea8ad..fd9925c 100644 (file)
@@ -333,7 +333,7 @@ void RandomizedTree::train(std::vector<BaseKeypoint> const& base_set,
   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));
     }
index 83bad0e..99dcd98 100644 (file)
@@ -653,6 +653,11 @@ CV_EXPORTS void equalizeHist( const Mat& src, Mat& dst );
 //! 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
index 17def20..978a89b 100644 (file)
@@ -526,3 +526,14 @@ cvPyrMeanShiftFiltering( const CvArr* srcarr, CvArr* dstarr,
     }
 }
 
+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 );
+}
diff --git a/samples/cpp/meanshift_segmentation.cpp b/samples/cpp/meanshift_segmentation.cpp
new file mode 100644 (file)
index 0000000..7998459
--- /dev/null
@@ -0,0 +1,66 @@
+#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;
+}