From d0e43aba2d491ba0b28a29c59205e611debfa2e2 Mon Sep 17 00:00:00 2001 From: mutantturkey Date: Thu, 2 Aug 2012 18:45:09 -0400 Subject: inital blob filtering using opencv and cvBlob commit --- fly-tools/filter/main.cpp | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 fly-tools/filter/main.cpp diff --git a/fly-tools/filter/main.cpp b/fly-tools/filter/main.cpp new file mode 100644 index 0000000..6cfc5aa --- /dev/null +++ b/fly-tools/filter/main.cpp @@ -0,0 +1,118 @@ +#include +#include +#include +#include + +using namespace std; +using namespace cvb; + +bool cmpArea(const pair &p1, const pair &p2) +{ + return p1.second->area < p2.second->area; +} + +int main(int argc, char* argv[]) { + + int c; + int drawNumber = 2; + double ratio; + + unsigned int result; + + bool ratioSet; + + string usage = "filter-mask -i -o -r "; + string inputFileName; + string outputFileName; + + CvBlobs blobs; + CvBlobs largeBlobs; + + IplImage *img; + IplImage *imgOut; + IplImage *grey; + IplImage *labelImg; + + vector< pair > blobList; + + while ((c = getopt (argc, argv, "i:o:r:h")) != -1) + switch (c) { + case 'i': + inputFileName = optarg; + break; + case 'o': + outputFileName = optarg; + break; + case 'r': + ratioSet = true; + ratio = atoi(optarg); + break; + case 'h': + cout << usage << endl; + exit(1); + break; + default: + break; + } + + if ( inputFileName.empty() || outputFileName.empty() || !ratioSet ) { + cerr << usage << endl; + exit(1); + } + + img = cvLoadImage(inputFileName.c_str(), 1); + imgOut = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); cvZero(imgOut); + + grey = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); + + cvCvtColor(img, grey, CV_BGR2GRAY); + + labelImg = cvCreateImage(cvGetSize(grey),IPL_DEPTH_LABEL,1); + result = cvLabel(grey, labelImg, blobs); + + // copy and sort blobs + copy(blobs.begin(), blobs.end(), back_inserter(blobList)); + sort(blobList.begin(), blobList.end(), cmpArea); + + // if no blobs. + if(blobList.size() == 0) { + cerr << "No blobs found." << endl; + cvSaveImage(outputFileName.c_str(), imgOut); + exit(1); + } + + // if only one blob is detected. + if(blobList.size() == 1 ) { + cout << "Only one blob found!" << endl; + drawNumber = 1; + } + + // if the ratio of the of the two blobs is smaller than the input ratio. + if( ((double)blobList[blobList.size()-2].second->area / (double)blobList[blobList.size()-1].second->area) < (1/ratio) ) { + cout << "the second largest blob is smaller than the ratio. only drawing largest blob!" << endl; + drawNumber = 1; + } + + cout << "blob area 1: " << (double)blobList[blobList.size()-2].second->area << endl; + cout << "blob area 2: " << (double)blobList[blobList.size()-1].second->area << endl; + cout << "blobs ratio:" << ((double)blobList[blobList.size()-2].second->area / (double)blobList[blobList.size()-1].second->area)<< endl; + cout << "input ratio:" << (1/ratio ) << endl; + + for (int i=blobList.size()-drawNumber; i " << (*blobList[i].second) << endl; + } + + // draw the selected blobsto imgOut and write the image. + cvFilterLabels(labelImg, imgOut, largeBlobs); + cvSaveImage(outputFileName.c_str(), imgOut); + + // Release all the memory + cvReleaseImage(&imgOut); + cvReleaseImage(&grey); + cvReleaseImage(&labelImg); + cvReleaseImage(&img); + cvReleaseBlobs(blobs); + + return 0; +} -- cgit v1.2.3