From 171b58e2ca3fb06fede54788841ecf851a238712 Mon Sep 17 00:00:00 2001 From: laurentBerger Date: Wed, 6 May 2015 16:50:22 +0200 Subject: [PATCH] Example BLOB_MSER --- samples/cpp/BLOB_MSER.cpp | 113 +++++++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 20 deletions(-) diff --git a/samples/cpp/BLOB_MSER.cpp b/samples/cpp/BLOB_MSER.cpp index 0b1a19c02..b0206a1d2 100644 --- a/samples/cpp/BLOB_MSER.cpp +++ b/samples/cpp/BLOB_MSER.cpp @@ -9,7 +9,7 @@ static void help() { cout << "\n This program demonstrates how to use BLOB and MSER to detect region \n" "Usage: \n" - " ./BLOB_MSER \n" + " ./BLOB_MSER \n" "Press a key when image window is active to change descriptor"; } @@ -45,6 +45,53 @@ struct MSERParams int edgeBlurSize; }; +String Legende(SimpleBlobDetector::Params &pAct) +{ + String s=""; + if (pAct.filterByArea) + { + String inf = static_cast(&(ostringstream() << pAct.minArea))->str(); + String sup = static_cast(&(ostringstream() << pAct.maxArea))->str(); + s = " Area range [" + inf + " to " + sup + "]"; + } + if (pAct.filterByCircularity) + { + String inf = static_cast(&(ostringstream() << pAct.minCircularity))->str(); + String sup = static_cast(&(ostringstream() << pAct.maxCircularity))->str(); + if (s.length()==0) + s = " Circularity range [" + inf + " to " + sup + "]"; + else + s += " AND Circularity range [" + inf + " to " + sup + "]"; + } + if (pAct.filterByColor) + { + String inf = static_cast(&(ostringstream() << pAct.blobColor))->str(); + if (s.length() == 0) + s = " Blob color " + inf; + else + s += " AND Blob color " + inf; + } + if (pAct.filterByConvexity) + { + String inf = static_cast(&(ostringstream() << pAct.minConvexity))->str(); + String sup = static_cast(&(ostringstream() << pAct.maxConvexity))->str(); + if (s.length() == 0) + s = " Convexity range[" + inf + " to " + sup + "]"; + else + s += " AND Convexity range[" + inf + " to " + sup + "]"; + } + if (pAct.filterByInertia) + { + String inf = static_cast(&(ostringstream() << pAct.minInertiaRatio))->str(); + String sup = static_cast(&(ostringstream() << pAct.maxInertiaRatio))->str(); + if (s.length() == 0) + s = " Inertia ratio range [" + inf + " to " + sup + "]"; + else + s += " AND Inertia ratio range [" + inf + " to " + sup + "]"; + } + return s; +} + int main(int argc, char *argv[]) @@ -52,7 +99,7 @@ int main(int argc, char *argv[]) vector fileName; if (argc == 1) { - fileName.push_back("../data/forme.jpg"); + fileName.push_back("../data/BLOB_MSER.bmp"); } else if (argc == 2) { @@ -69,11 +116,13 @@ int main(int argc, char *argv[]) cout << "Image " << fileName[0] << " is empty or cannot be found\n"; return(0); } - GaussianBlur(imgOrig,img,Size(11,11),5,5); + GaussianBlur(imgOrig,img,Size(11,11),0.1,0.1); + SimpleBlobDetector::Params pDefaultBLOB; + MSERParams pDefaultMSER; // This is default parameters for SimpleBlobDetector pDefaultBLOB.thresholdStep = 10; - pDefaultBLOB.minThreshold = 1; + pDefaultBLOB.minThreshold = 10; pDefaultBLOB.maxThreshold = 220; pDefaultBLOB.minRepeatability = 2; pDefaultBLOB.minDistBetweenBlobs = 10; @@ -83,7 +132,7 @@ int main(int argc, char *argv[]) pDefaultBLOB.minArea = 25; pDefaultBLOB.maxArea = 5000; pDefaultBLOB.filterByCircularity = false; - pDefaultBLOB.minCircularity = 0.8f; + pDefaultBLOB.minCircularity = 0.9f; pDefaultBLOB.maxCircularity = std::numeric_limits::max(); pDefaultBLOB.filterByInertia = false; pDefaultBLOB.minInertiaRatio = 0.1f; @@ -91,7 +140,6 @@ int main(int argc, char *argv[]) pDefaultBLOB.filterByConvexity = false; pDefaultBLOB.minConvexity = 0.95f; pDefaultBLOB.maxConvexity = std::numeric_limits::max(); - MSERParams pDefaultMSER; // Descriptor array (BLOB or MSER) vector typeDesc; // Param array for BLOB @@ -99,35 +147,58 @@ int main(int argc, char *argv[]) vector::iterator itBLOB; // Param array for MSER vector pMSER; + vector::iterator itMSER; // Color palette vector palette; for (int i=0;i<65536;i++) palette.push_back(Vec3b(rand(),rand(),rand())); help(); + typeDesc.push_back("MSER"); + pMSER.push_back(pDefaultMSER); + pMSER.back().minArea = 1; + pMSER.back().maxArea = img.rows*img.cols; + + typeDesc.push_back("BLOB"); + pBLOB.push_back(pDefaultBLOB); + pBLOB.back().filterByColor = true; + pBLOB.back().blobColor = 255; // This descriptor are going to be detect and compute 4 BLOBS with 4 differents params + // Param for first BLOB detector we want all typeDesc.push_back("BLOB"); // see http://docs.opencv.org/trunk/d0/d7a/classcv_1_1SimpleBlobDetector.html pBLOB.push_back(pDefaultBLOB); pBLOB.back().filterByArea = true; pBLOB.back().minArea = 1; pBLOB.back().maxArea = img.rows*img.cols; + // Param for second BLOB detector we want area between 500 and 2900 pixels typeDesc.push_back("BLOB"); pBLOB.push_back(pDefaultBLOB); pBLOB.back().filterByArea = true; - pBLOB.back().maxArea = img.rows*img.cols; - pBLOB.back().filterByCircularity = true; + pBLOB.back().minArea = 500; + pBLOB.back().maxArea = 2900; + // Param for third BLOB detector we want only circular object typeDesc.push_back("BLOB"); pBLOB.push_back(pDefaultBLOB); + pBLOB.back().filterByCircularity = true; + // Param for Fourth BLOB detector we want ratio inertia + typeDesc.push_back("BLOB"); + pBLOB.push_back(pDefaultBLOB); pBLOB.back().filterByInertia = true; - typeDesc.push_back("BLOB"); + pBLOB.back().minInertiaRatio = 0; + pBLOB.back().maxInertiaRatio = 0.2; + // Param for Fourth BLOB detector we want ratio inertia + typeDesc.push_back("BLOB"); pBLOB.push_back(pDefaultBLOB); - pBLOB.back().filterByColor = true; - pBLOB.back().blobColor = 60; - typeDesc.push_back("MSER"); - itBLOB=pBLOB.begin(); + pBLOB.back().filterByConvexity = true; + pBLOB.back().minConvexity = 0.; + pBLOB.back().maxConvexity = 0.9; + + + itBLOB = pBLOB.begin(); + itMSER = pMSER.begin(); vector desMethCmp; Ptr b; - + String label; // Descriptor loop vector::iterator itDesc; for (itDesc = typeDesc.begin(); itDesc != typeDesc.end(); itDesc++) @@ -135,11 +206,14 @@ int main(int argc, char *argv[]) vector keyImg1; if (*itDesc == "BLOB"){ b = SimpleBlobDetector::create(*itBLOB); + label=Legende(*itBLOB); + itBLOB++; } if (*itDesc == "MSER"){ - b = MSER::create(); - } + b = MSER::create(itMSER->delta, itMSER->minArea,itMSER->maxArea,itMSER->maxVariation,itMSER->minDiversity,itMSER->maxEvolution, + itMSER->areaThreshold,itMSER->minMargin,itMSER->edgeBlurSize); + } try { // We can detect keypoint with detect method vector keyImg; @@ -167,7 +241,6 @@ int main(int argc, char *argv[]) int i=0; for (vector::iterator k=keyImg.begin();k!=keyImg.end();k++,i++) circle(result,k->pt,k->size,palette[i%65536]); - } if (b.dynamicCast() != NULL) { @@ -194,12 +267,12 @@ int main(int argc, char *argv[]) for (vector ::iterator itp = region[i].begin(); itp != region[i].end(); itp++) { - result.at(itp->y, itp->x) += palette[i % 65536]; + result.at(itp->y, itp->x) = Vec3b(0,255,255); } } } - namedWindow(*itDesc , WINDOW_AUTOSIZE); - imshow(*itDesc, result); + namedWindow(*itDesc+label , WINDOW_AUTOSIZE); + imshow(*itDesc + label, result); imshow("Original", img); FileStorage fs(*itDesc + "_" + fileName[0] + ".xml", FileStorage::WRITE); fs<<*itDesc<