#include <opencv2\highgui\highgui.hpp>
#include <opencv2\legacy\legacy.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void Pyr_fenge(Mat img0, vector<Mat>& block0, int& n_comp, const int level = 3, const double threshold1=155.0, const double threshold2=52.0)
{
int block_size = 1500;
img0.cols &= -(1 << level);
img0.rows &= -(1 << level);
IplImage* image0 = &img0.operator _IplImage();
IplImage* image1 = cvCloneImage(image0);
Mat img1(image1, 0);
CvMemStorage *storage;
storage = cvCreateMemStorage(block_size);
CvSeq *comp;
cvPyrSegmentation(image0, image1, storage, &comp,
level, threshold1, threshold2);
n_comp = comp->total;
block0.reserve(n_comp);
for (int i = 0, k = 0; i < (comp ? comp->total : 0); i++)
{
CvConnectedComp* cc = (CvConnectedComp*)cvGetSeqElem(comp, i);
if (cc->rect.height * cc->rect.width >500)
{
//img0(cc->rect).copyTo(block);
block0.push_back(img0(cc->rect));
k++;
}
}
//cvClearSeq(comp); cout << "w" << endl;
//cvReleaseMemStorage(&storage);
//cvReleaseImage(&image0);
//cvReleaseImage(&image1);
}
int main(int argc, char** argv)
{
char* filename = argc == 2 ? argv[1] : (char*)"picture0.jpg";
Mat img0; img0 = imread(filename, 1);
if (img0.cols == 0)
return -1;
vector<Mat> block; int n_comp=0;
Pyr_fenge(img0, block, n_comp);
cout << "n_comp =" << n_comp << endl;
cout << "block.size() =" << block.size() << endl;
char path[30];
for (int k = 0; k < block.size(); k++)
{
sprintf_s(path, "fruit%d", k);
imshow(path, block[k]);
}
waitKey();
return 0;
}