參考:這個帖子的主要代碼有錯誤,根據回帖改了一些
http://www.cnblogs.com/tornadomeet/archive/2012/06/06/2538695.html
// meanshift.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" // meanshift_segmentation.cpp : 定義控制台應用程序的入口點。 // #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #pragma comment(lib,"opencv_highgui2410d.lib") #pragma comment(lib,"opencv_core2410d.lib") #pragma comment(lib,"opencv_imgproc2410d.lib") using namespace cv; using namespace std; Mat src,dst; int spatialRad=10,colorRad=10,maxPryLevel=1; //const Scalar& colorDiff=Scalar::all(1); void meanshift_seg() { ////調用meanshift圖像金字塔進行分割 pyrMeanShiftFiltering(src,dst,spatialRad,colorRad,maxPryLevel); RNG rng=theRNG(); Mat mask(dst.rows+2,dst.cols+2,CV_8UC1,Scalar::all(0)); for(int i=0;i<dst.rows;i++) //opencv圖像等矩陣也是基於0索引 for(int j=0;j<dst.cols;j++) if(mask.at<uchar>(i+1,j+1)==0) { Scalar newcolor(rng(256),rng(256),rng(256)); floodFill(dst,mask,Point(j,i),newcolor,0,Scalar::all(1),Scalar::all(1)); } imshow("dst",dst); } void meanshift_seg_s(int i,void *) { spatialRad = i; meanshift_seg(); } void meanshift_seg_c(int i,void *) { colorRad = i; meanshift_seg(); } void meanshift_seg_m(int i,void *) { maxPryLevel = i; meanshift_seg(); } int main(int argc, uchar* argv[]) { namedWindow("src",WINDOW_AUTOSIZE); namedWindow("dst",WINDOW_AUTOSIZE); src=imread("swan.jpg"); CV_Assert(!src.empty()); spatialRad=10; colorRad=10; maxPryLevel=1; //雖然createTrackbar函數的參數onChange函數要求其2個參數形式為onChange(int,void*) //但是這里是系統響應函數,在使用createTrackbar函數時,其調用的函數可以不用寫參數,甚至 //括號都不用寫,但是其調用函數的實現過程中還是需要滿足(int,void*)2個參數類型 createTrackbar("spatialRad","dst",&spatialRad,80,meanshift_seg_s); createTrackbar("colorRad","dst",&colorRad,60,meanshift_seg_c); createTrackbar("maxPryLevel","dst",&maxPryLevel,5,meanshift_seg_m); // meanshift_seg(0,0); imshow("src",src); /*char c=(char)waitKey(); if(27==c) return 0;*/ imshow("dst",src); imshow("flood",src); waitKey();//無限等待用戶交互響應 // while(1);//這里不能用while(1)的原因是需要等待用戶的交互,而while(1)沒有該功能。雖然2者都有無限等待的作用。 return 0; }
實現效果: