added c++ interface for cvPyrMeanShiftFiltering; added sample on meanshift segmentation
This commit is contained in:
parent
69ef5efb4d
commit
cba926a428
@ -333,7 +333,7 @@ void RandomizedTree::train(std::vector<BaseKeypoint> const& base_set,
|
|||||||
Size patchSize(PATCH_SIZE, PATCH_SIZE);
|
Size patchSize(PATCH_SIZE, PATCH_SIZE);
|
||||||
for (keypt_it = base_set.begin(); keypt_it != base_set.end(); ++keypt_it, ++class_id) {
|
for (keypt_it = base_set.begin(); keypt_it != base_set.end(); ++keypt_it, ++class_id) {
|
||||||
for (int i = 0; i < views; ++i) {
|
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;
|
IplImage iplPatch = patch;
|
||||||
addExample(class_id, getData(&iplPatch));
|
addExample(class_id, getData(&iplPatch));
|
||||||
}
|
}
|
||||||
|
@ -653,6 +653,11 @@ CV_EXPORTS void equalizeHist( const Mat& src, Mat& dst );
|
|||||||
//! segments the image using watershed algorithm
|
//! segments the image using watershed algorithm
|
||||||
CV_EXPORTS void watershed( const Mat& image, Mat& markers );
|
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
|
//! class of the pixel in GrabCut algorithm
|
||||||
enum { GC_BGD = 0, //!< background
|
enum { GC_BGD = 0, //!< background
|
||||||
GC_FGD = 1, //!< foreground
|
GC_FGD = 1, //!< foreground
|
||||||
|
@ -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 );
|
||||||
|
}
|
||||||
|
66
samples/cpp/meanshift_segmentation.cpp
Normal file
66
samples/cpp/meanshift_segmentation.cpp
Normal file
@ -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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user