Commit 68e9d197 authored by laurentBerger's avatar laurentBerger

An example how to use features2d for MSER. Data results are visualized in 3D…

An example how to use features2d for MSER. Data results are visualized in 3D using openglwith mouse or keyboard
parent 06b0fa6f
......@@ -21,22 +21,23 @@
#include <GL/glu.h>
#endif
using namespace std;
using namespace cv;
void Example_MSER(vector<String> &fileName);
static void help()
{
cout << "\n This program demonstrates how to use BLOB and MSER to detect region \n"
cout << "\n This program demonstrates how to use MSER to detect extremal regions \n"
"Usage: \n"
" ./BLOB_MSER <image1(../data/forme2.jpg as default)>\n"
"Press a key when image window is active to change descriptor";
}
" ./detect_mser <image1(without parameter a syntehtic image is used as default)>\n"
"Press esc key when image window is active to change descriptor parameter\n";
"Press 2, 8, 4, 6, +,- or 5 keys in openGL windows to change view or use mouse\n";
}
struct MSERParams
{
{
MSERParams(int _delta = 5, int _min_area = 60, int _max_area = 14400,
double _max_variation = 0.25, double _min_diversity = .2,
int _max_evolution = 200, double _area_threshold = 1.01,
......@@ -65,60 +66,49 @@ struct MSERParams
double areaThreshold;
double minMargin;
int edgeBlurSize;
};
};
String Legende(SimpleBlobDetector::Params &pAct)
String Legende(MSERParams &pAct)
{
String s="";
if (pAct.filterByArea)
{
String inf = static_cast<ostringstream*>(&(ostringstream() << pAct.minArea))->str();
String sup = static_cast<ostringstream*>(&(ostringstream() << pAct.maxArea))->str();
s = " Area range [" + inf + " to " + sup + "]";
}
if (pAct.filterByCircularity)
{
String inf = static_cast<ostringstream*>(&(ostringstream() << pAct.minCircularity))->str();
String sup = static_cast<ostringstream*>(&(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*>(&(ostringstream() << (int)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*>(&(ostringstream() << pAct.minConvexity))->str();
String sup = static_cast<ostringstream*>(&(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*>(&(ostringstream() << pAct.minInertiaRatio))->str();
String sup = static_cast<ostringstream*>(&(ostringstream() << pAct.maxInertiaRatio))->str();
if (s.length() == 0)
s = " Inertia ratio range [" + inf + " to " + sup + "]";
else
s += " AND Inertia ratio range [" + inf + " to " + sup + "]";
}
s = " Area[" + inf + "," + sup + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << pAct.delta))->str();
s += " del. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << pAct.maxVariation))->str();
s += " var. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << (int)pAct.minDiversity))->str();
s += " div. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << (int)pAct.pass2Only))->str();
s += " pas. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << (int)pAct.maxEvolution))->str();
s += "RGb-> evo. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << (int)pAct.areaThreshold))->str();
s += " are. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << (int)pAct.minMargin))->str();
s += " mar. [" + inf + "]";
inf = static_cast<ostringstream*>(&(ostringstream() << (int)pAct.edgeBlurSize))->str();
s += " siz. [" + inf + "]";
return s;
}
const int win_width = 800;
const int win_height = 640;
bool rotateEnable=true;
bool keyPressed=false;
Vec4f rotAxis(1,0,1,0);
Vec3f zoom(1,0,0);
float obsX = (float)0, obsY = (float)0, obsZ = (float)-10, tx = (float)0, ty = (float)0;
float thetaObs = (float)-1.570, phiObs = (float)1.570, rObs = (float)10;
int prevX=-1,prevY=-1,prevTheta=-1000,prevPhi=-1000;
struct DrawData
{
ogl::Arrays arr;
ogl::Texture2D tex;
......@@ -128,274 +118,214 @@ struct DrawData
void draw(void* userdata);
void draw(void* userdata)
{
{
DrawData* data = static_cast<DrawData*>(userdata);
glRotated(0.6, 0, 1, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(obsX, obsY, obsZ, 0, 0, .0, .0, 10.0, 0.0);
glTranslatef(tx,ty,0);
keyPressed = false;
ogl::render(data->arr, data->indices, ogl::TRIANGLES);
}
}
int main(int argc, char *argv[])
static void onMouse(int event, int x, int y, int flags, void*)
{
Mat imgcol = imread("../data/lena.jpg");
namedWindow("OpenGL", WINDOW_OPENGL);
//resizeWindow("OpenGL", win_width, win_height);
Mat_<Vec3f> vertex(1, 4);
vertex << Vec3f(-1, 1,0), Vec3f(-1, -1,0), Vec3f(1, -1,1), Vec3f(1, 1,-1);
Mat_<Vec2f> texCoords(1, 4);
texCoords << Vec2f(0, 0), Vec2f(0, 1), Vec2f(1, 1), Vec2f(1, 0);
Mat_<int> indices(1, 6);
indices << 0, 1, 2,2, 3, 0;
DrawData *data = new DrawData;
data->arr.setVertexArray(vertex);
data->arr.setTexCoordArray(texCoords);
data->indices.copyFrom(indices);
data->tex.copyFrom(imgcol);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (double)win_width / win_height, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
glEnable(GL_TEXTURE_2D);
data->tex.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_CULL_FACE);
setOpenGlDrawCallback("OpenGL", draw, data);
for (;;)
if (event == EVENT_RBUTTONDOWN)
{
updateWindow("OpenGL");
int key = waitKey(40);
if ((key & 0xff) == 27)
break;
prevX = x;
prevY = y;
}
setOpenGlDrawCallback("OpenGL", 0, 0);
destroyAllWindows();
vector<String> fileName;
Example_MSER(fileName);
Mat img(600,800,CV_8UC1);
if (argc == 1)
if (event == EVENT_RBUTTONUP)
{
fileName.push_back("../data/BLOB_MSER.bmp");
prevX = -1;
prevY = -1;
}
else if (argc == 2)
if (prevX != -1)
{
fileName.push_back(argv[1]);
tx += float((x - prevX) / 100.0);
ty -= float((y - prevY) / 100.0);
prevX = x;
prevY = y;
}
else
if (event == EVENT_LBUTTONDOWN)
{
help();
return(0);
prevTheta = x;
prevPhi = y;
}
img = imread(fileName[0], IMREAD_UNCHANGED);
if (img.rows*img.cols <= 0)
if (event == EVENT_LBUTTONUP)
{
cout << "Image " << fileName[0] << " is empty or cannot be found\n";
return(0);
prevTheta = -1000;
prevPhi = -1000;
}
SimpleBlobDetector::Params pDefaultBLOB;
MSERParams pDefaultMSER;
// This is default parameters for SimpleBlobDetector
pDefaultBLOB.thresholdStep = 10;
pDefaultBLOB.minThreshold = 10;
pDefaultBLOB.maxThreshold = 220;
pDefaultBLOB.minRepeatability = 2;
pDefaultBLOB.minDistBetweenBlobs = 10;
pDefaultBLOB.filterByColor = false;
pDefaultBLOB.blobColor = 0;
pDefaultBLOB.filterByArea = false;
pDefaultBLOB.minArea = 25;
pDefaultBLOB.maxArea = 5000;
pDefaultBLOB.filterByCircularity = false;
pDefaultBLOB.minCircularity = 0.9f;
pDefaultBLOB.maxCircularity = std::numeric_limits<float>::max();
pDefaultBLOB.filterByInertia = false;
pDefaultBLOB.minInertiaRatio = 0.1f;
pDefaultBLOB.maxInertiaRatio = std::numeric_limits<float>::max();
pDefaultBLOB.filterByConvexity = false;
pDefaultBLOB.minConvexity = 0.95f;
pDefaultBLOB.maxConvexity = std::numeric_limits<float>::max();
// Descriptor array (BLOB or MSER)
vector<String> typeDesc;
// Param array for BLOB
vector<SimpleBlobDetector::Params> pBLOB;
vector<SimpleBlobDetector::Params>::iterator itBLOB;
// Param array for MSER
vector<MSERParams> pMSER;
vector<MSERParams>::iterator itMSER;
// Color palette
vector<Vec3b> palette;
for (int i=0;i<65536;i++)
palette.push_back(Vec3b((uchar)rand(), (uchar)rand(), (uchar)rand()));
help();
/* typeDesc.push_back("MSER");
pMSER.push_back(pDefaultMSER);
pMSER.back().delta = 1;
pMSER.back().minArea = 1;
pMSER.back().maxArea = 180000;
pMSER.back().maxVariation= 500;
pMSER.back().minDiversity = 0;
pMSER.back().pass2Only = false;*/
typeDesc.push_back("BLOB");
pBLOB.push_back(pDefaultBLOB);
pBLOB.back().filterByColor = true;
pBLOB.back().blobColor = 0;
// 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 = int(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().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;
pBLOB.back().minInertiaRatio = 0;
pBLOB.back().maxInertiaRatio = (float)0.2;
// Param for Fourth BLOB detector we want ratio inertia
typeDesc.push_back("BLOB");
pBLOB.push_back(pDefaultBLOB);
pBLOB.back().filterByConvexity = true;
pBLOB.back().minConvexity = 0.;
pBLOB.back().maxConvexity = (float)0.9;
itBLOB = pBLOB.begin();
itMSER = pMSER.begin();
vector<double> desMethCmp;
Ptr<Feature2D> b;
String label;
// Descriptor loop
vector<String>::iterator itDesc;
for (itDesc = typeDesc.begin(); itDesc != typeDesc.end(); itDesc++)
if (prevTheta != -1000)
{
vector<KeyPoint> keyImg1;
if (*itDesc == "BLOB"){
b = SimpleBlobDetector::create(*itBLOB);
label=Legende(*itBLOB);
itBLOB++;
if (x - prevTheta<0)
{
thetaObs +=(float)0.02;
}
if (*itDesc == "MSER"){
if(img.type()==CV_8UC3)
else if (x - prevTheta>0)
{
b = MSER::create(itMSER->delta, itMSER->minArea, itMSER->maxArea, itMSER->maxVariation, itMSER->minDiversity, itMSER->maxEvolution,
itMSER->areaThreshold, itMSER->minMargin, itMSER->edgeBlurSize);
b.dynamicCast<MSER>()->setPass2Only(itMSER->pass2Only);
thetaObs -= (float)0.02;
}
else
if (y - prevPhi<0)
{
b = MSER::create(itMSER->delta, itMSER->minArea, itMSER->maxArea, itMSER->maxVariation, itMSER->minDiversity);
phiObs -= (float)0.02;
}
//b = MSER::create();
//b = MSER::create();
else if (y - prevPhi>0)
{
phiObs += (float)0.02;
}
try {
// We can detect keypoint with detect method
vector<KeyPoint> keyImg;
vector<Rect> zone;
vector<vector <Point>> region;
Mat desc, result(img.rows,img.cols,CV_8UC3);
if (b.dynamicCast<SimpleBlobDetector>() != NULL)
prevTheta = x;
prevPhi = y;
}
if (event==EVENT_MOUSEWHEEL)
if (getMouseWheelDelta(flags)>0)
rObs += (float)0.1;
else
rObs -= (float)0.1;
float pi = (float)acos(-1.0);
if (thetaObs>pi)
{
Ptr<SimpleBlobDetector> sbd = b.dynamicCast<SimpleBlobDetector>();
sbd->detect(img, keyImg, Mat());
drawKeypoints(img,keyImg,result);
int i=0;
for (vector<KeyPoint>::iterator k=keyImg.begin();k!=keyImg.end();k++,i++)
circle(result,k->pt,k->size,palette[i%65536]);
thetaObs = -2 * pi + thetaObs;
}
if (b.dynamicCast<MSER>() != NULL)
if (thetaObs<-pi)
thetaObs = 2 * pi + thetaObs;
if (phiObs>pi / 2)
phiObs = pi / 2 - (float)0.0001;
if (phiObs<-pi / 2)
phiObs = -pi / 2 + (float)0.00001;
if (rObs<0)
rObs = 0;
}
void DrawOpenGLMSER(Mat img, Mat result)
{
Mat imgGray;
if (img.type() != CV_8UC1)
cvtColor(img, imgGray, COLOR_BGR2GRAY);
else
imgGray = img;
namedWindow("OpenGL", WINDOW_OPENGL);
setMouseCallback("OpenGL", onMouse, NULL);
Mat_<Vec3f> vertex(1, img.cols*img.rows);
Mat_<Vec2f> texCoords(1, img.cols*img.rows);
for (int i = 0, nbPix = 0; i<img.rows; i++)
{
Ptr<MSER> sbd = b.dynamicCast<MSER>();
sbd->detectRegions(img, region, zone);
int i = 0;
result=Scalar(0,0,0);
for (vector<Rect>::iterator r = zone.begin(); r != zone.end();r++,i++)
for (int j = 0; j<img.cols; j++, nbPix++)
{
// we draw a white rectangle which include all region pixels
rectangle(result, *r, Vec3b(255, 0, 0), 2);
float x = (j) / (float)img.cols;
float y = (i) / (float)img.rows;
vertex.at< Vec3f >(0, nbPix) = Vec3f(float(2 * (x - 0.5)), float(2 * (0.5 - y)), float(imgGray.at<uchar>(i, j) / 512.0));
texCoords.at< Vec2f>(0, nbPix) = Vec2f(x, y);
}
i=0;
for (vector<vector <Point>>::iterator itr = region.begin(); itr != region.end(); itr++, i++)
}
Mat_<int> indices(1, (img.rows - 1)*(6 * img.cols));
for (int i = 1, nbPix = 0; i<img.rows; i++)
{
for (vector <Point>::iterator itp = region[i].begin(); itp != region[i].end(); itp++)
for (int j = 1; j<img.cols; j++)
{
// all pixels belonging to region are red
result.at<Vec3b>(itp->y, itp->x) = Vec3b(0,0,128);
}
int c = i*img.cols + j;
indices.at<int>(0, nbPix++) = c ;
indices.at<int>(0, nbPix++) = c - 1;
indices.at<int>(0, nbPix++) = c- img.cols - 1;
indices.at<int>(0, nbPix++) = c- img.cols - 1;
indices.at<int>(0, nbPix++) = c - img.cols;
indices.at<int>(0, nbPix++) = c ;
}
}
namedWindow(*itDesc+label , WINDOW_AUTOSIZE);
imshow(*itDesc + label, result);
imshow("Original", img);
FileStorage fs(*itDesc + "_" + fileName[0] + ".xml", FileStorage::WRITE);
fs<<*itDesc<<keyImg;
waitKey();
DrawData *data = new DrawData;
data->arr.setVertexArray(vertex);
data->arr.setTexCoordArray(texCoords);
data->indices.copyFrom(indices);
data->tex.copyFrom(result);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (double)win_width / win_height, 0.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
data->tex.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_CULL_FACE);
setOpenGlDrawCallback("OpenGL", draw, data);
for (;;)
{
updateWindow("OpenGL");
int key = waitKey(40);
if ((key & 0xff) == 27)
break;
if (key == 0x20)
rotateEnable = !rotateEnable;
float pi = (float)acos(-1);
switch (key) {
case '5':
obsX = 0, obsY = 0, obsZ = -10;
thetaObs = -pi/2, phiObs = pi/2, rObs = 10;
tx=0;ty=0;
break;
case '4':
thetaObs += (float)0.1;
break;
case '6':
thetaObs -= (float)0.1;
break;
case '2':
phiObs -= (float).1;
break;
case '8':
phiObs += (float).1;
break;
case '+':
rObs -= (float).1;
break;
case '-':
rObs += (float).1;
break;
}
catch (Exception& e)
if (thetaObs>pi)
{
cout << "Feature : " << *itDesc << "\n";
cout<<e.msg<<endl;
thetaObs = -2 * pi + thetaObs;
}
if (thetaObs<-pi)
thetaObs = 2 * pi + thetaObs;
if (phiObs>pi / 2)
phiObs = pi / 2 - (float)0.0001;
if (phiObs<-pi / 2)
phiObs = -pi / 2 + (float)0.00001;
if (rObs<0)
rObs = 0;
obsX = rObs*cos(thetaObs)*cos(phiObs);
obsY = rObs*sin(thetaObs)*cos(phiObs);
obsZ = rObs*sin(phiObs);
}
return 0;
setOpenGlDrawCallback("OpenGL", 0, 0);
destroyAllWindows();
}
void Example_MSER(vector<String> &fileName)
Mat MakeSyntheticImage()
{
Mat img(800, 800, CV_8UC1);
fileName.push_back("SyntheticImage.bmp");
map<int, char> val;
int fond = 0;
img = Scalar(fond);
val[fond] = 1;
int width1[]={390,380,300,290,280,270,260,250,210,190,150,100, 80,70};
int color1[]={ 80,180,160,140,120,100, 90,110,170,150,140,100,220};
int width1[] = { 390, 380, 300, 290, 280, 270, 260, 250, 210, 190, 150, 100, 80, 70 };
int color1[] = { 80, 180, 160, 140, 120, 100, 90, 110, 170, 150, 140, 100, 220 };
Point p0(10, 10);
int *width,*color;
int *width, *color;
width = width1;
color = color1;
......@@ -406,6 +336,8 @@ void Example_MSER(vector<String> &fileName)
floodFill(img, p0, Scalar(color[i]));
}
int color2[] = { 81, 181, 161, 141, 121, 101, 91, 111, 171, 151, 141, 101, 221 };
color = color2;
p0 = Point(200, 600);
for (int i = 0; i<13; i++)
{
......@@ -413,8 +345,8 @@ void Example_MSER(vector<String> &fileName)
floodFill(img, p0, Scalar(color[i]));
}
for (int i = 0; i<13; i++)
color1[i] = 255 - color1[i];
int color3[] = { 175,75,95,115,135,155,165,145,85,105,115,156 };
color = color3;
p0 = Point(410, 10);
for (int i = 0; i<13; i++)
{
......@@ -423,69 +355,56 @@ void Example_MSER(vector<String> &fileName)
floodFill(img, p0, Scalar(color[i]));
}
int color4[] = { 173,73,93,113,133,153,163,143,83,103,114,154 };
color = color4;
p0 = Point(600, 600);
for (int i = 0; i<13; i++)
{
circle(img, p0, width[i]/2,Scalar(color[i]), 1);
floodFill(img, p0 , Scalar(color[i]));
circle(img, p0, width[i] / 2, Scalar(color[i]), 1);
floodFill(img, p0, Scalar(color[i]));
}
int channel = 1;
int histSize = 256 ;
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange[] = { range };
Mat hist;
// we compute the histogram from the 0-th and 1-st channels
// we compute the histogram
calcHist(&img, 1, 0, Mat(), hist, 1, &histSize, histRange, true, false);
Mat cumHist(hist.size(), hist.type());
cumHist.at<float>(0, 0) = hist.at<float>(0, 0);
for (int i = 1; i < hist.rows; i++)
cumHist.at<float>(i, 0) = cumHist.at<float>(i - 1, 0) + hist.at<float>(i, 0);
imwrite(fileName[0], img);
cout << "****************Maximal region************************\n";
cout << "i\th\t\tsh\t\tq\n";
cout << 0 << "\t" << hist.at<float>(0, 0) << "\t\t" << cumHist.at<float>(0, 0) << "\t\t\n";
for (int i = 1; i < hist.rows-1 ; i++)
for (int i = 0; i < hist.rows ; i++)
{
if (cumHist.at<float>(i, 0)>0)
if (hist.at<float>(i, 0)!=0)
{
cout << i << "\t" << hist.at<float>(i, 0) << "\t\t" << cumHist.at<float>(i, 0) << "\t\t" << (cumHist.at<float>(i + 1, 0) - cumHist.at<float>(i, 0)) / cumHist.at<float>(i, 0);
cout << "h" << i << "=\t" << hist.at<float>(i, 0) << "\n";
}
else
cout << i << "\t" << hist.at<float>(i, 0) << "\t\t" << cumHist.at<float>(i, 0) << "\t\t";
cout << endl;
}
cout << 255 << "\t" << hist.at<float>(255, 0) << "\t\t" << cumHist.at<float>(255, 0) << "\t\t\n";
cout << "****************Minimal region************************\n";
cumHist.at<float>(255, 0) = hist.at<float>(255, 0);
for (int i = 254; i >= 0; i--)
cumHist.at<float>(i, 0) = cumHist.at<float>(i + 1, 0) + hist.at<float>(i, 0);
cout << "Minimal region\ni\th\t\tsh\t\tq\n";
cout << 255-255 << "\t" << hist.at<float>(255, 0) << "\t\t" << cumHist.at<float>(255, 0) << "\t\t\n";
for (int i = 254; i>=0; i--)
{
if (cumHist.at<float>(i, 0)>0)
return img;
}
int main(int argc, char *argv[])
{
vector<String> fileName;
Mat imgOrig,img;
Size blurSize(5,5);
if (argc==2)
{
cout << 255 - i << "\t" << i << "\t" << hist.at<float>(i, 0) << "\t\t" << cumHist.at<float>(i, 0) << "\t\t" << (cumHist.at<float>(i + 1, 0) - cumHist.at<float>(i, 0)) / cumHist.at<float>(i, 0);
fileName.push_back(argv[1]);
imgOrig = imread(fileName[0], IMREAD_GRAYSCALE); blur(imgOrig, img, blurSize);
}
else
cout << 255 - i << "\t" << i << "\t" << hist.at<float>(i, 0) << "\t\t" << cumHist.at<float>(i, 0) << "\t\t";
cout << endl;
{
fileName.push_back("SyntheticImage.bmp");
imgOrig = MakeSyntheticImage();
img=imgOrig;
}
// img = imread("C:/Users/laurent_2/Pictures/basketball1.png", IMREAD_GRAYSCALE);
MSERParams pDefaultMSER;
// Descriptor array (BLOB or MSER)
// Descriptor array MSER
vector<String> typeDesc;
// Param array for BLOB
// Param array for MSER
vector<MSERParams> pMSER;
vector<MSERParams>::iterator itMSER;
......@@ -498,18 +417,35 @@ void Example_MSER(vector<String> &fileName)
typeDesc.push_back("MSER");
pMSER.push_back(pDefaultMSER);
pMSER.back().delta = 1000;
pMSER.back().minArea = 1;
pMSER.back().maxArea = 180000;
pMSER.back().maxVariation = 1.701;
pMSER.back().delta = 10;
pMSER.back().minArea = 100;
pMSER.back().maxArea = 5000;
pMSER.back().maxVariation = 2;
pMSER.back().minDiversity = 0;
pMSER.back().pass2Only = true;
typeDesc.push_back("MSER");
pMSER.push_back(pDefaultMSER);
pMSER.back().delta = 10;
pMSER.back().minArea = 100;
pMSER.back().maxArea = 5000;
pMSER.back().maxVariation = 2;
pMSER.back().minDiversity = 0;
pMSER.back().pass2Only = false;
typeDesc.push_back("MSER");
pMSER.push_back(pDefaultMSER);
pMSER.back().delta = 100;
pMSER.back().minArea = 100;
pMSER.back().maxArea = 5000;
pMSER.back().maxVariation = 2;
pMSER.back().minDiversity = 0;
pMSER.back().pass2Only = false;
itMSER = pMSER.begin();
vector<double> desMethCmp;
Ptr<Feature2D> b;
String label;
// Descriptor loop
vector<String>::iterator itDesc;
Mat result(img.rows, img.cols, CV_8UC3);
for (itDesc = typeDesc.begin(); itDesc != typeDesc.end(); itDesc++)
{
vector<KeyPoint> keyImg1;
......@@ -518,54 +454,71 @@ void Example_MSER(vector<String> &fileName)
{
b = MSER::create(itMSER->delta, itMSER->minArea, itMSER->maxArea, itMSER->maxVariation, itMSER->minDiversity, itMSER->maxEvolution,
itMSER->areaThreshold, itMSER->minMargin, itMSER->edgeBlurSize);
label = Legende(*itMSER);
itMSER++;
}
else
{
b = MSER::create(itMSER->delta, itMSER->minArea, itMSER->maxArea, itMSER->maxVariation, itMSER->minDiversity);
b.dynamicCast<MSER>()->setPass2Only(itMSER->pass2Only);
label = Legende(*itMSER);
itMSER++;
}
}
try {
// We can detect keypoint with detect method
if (img.type()==CV_8UC3)
{
img.copyTo(result);
}
else
{
vector<Mat> plan;
plan.push_back(img);
plan.push_back(img);
plan.push_back(img);
merge(plan,result);
}
try
{
// We can detect regions using detectRegions method
vector<KeyPoint> keyImg;
vector<Rect> zone;
vector<vector <Point>> region;
Mat desc, result(img.rows, img.cols, CV_8UC3);
int nb = img.channels();
Mat desc;
if (b.dynamicCast<MSER>() != NULL)
{
Ptr<MSER> sbd = b.dynamicCast<MSER>();
sbd->detectRegions(img, region, zone);
int i = 0;
result = Scalar(0, 0, 0);
//result = Scalar(0, 0, 0);
int nbPixelInMSER=0;
for (vector<vector <Point>>::iterator itr = region.begin(); itr != region.end(); itr++, i++)
{
for (vector <Point>::iterator itp = region[i].begin(); itp != region[i].end(); itp+=2)
for (vector <Point>::iterator itp = region[i].begin(); itp != region[i].end(); itp ++)
{
// all pixels belonging to region are red
result.at<Vec3b>(itp->y, itp->x) = Vec3b(0, 0, 128);
// all pixels belonging to region become blue
result.at<Vec3b>(itp->y, itp->x) = Vec3b(128, 0, 0);
nbPixelInMSER++;
}
}
i = 0;
for (vector<Rect>::iterator r = zone.begin(); r != zone.end(); r++, i++)
{
// we draw a white rectangle which include all region pixels
rectangle(result, *r, Vec3b(255, 0, 0), 2);
}
cout << "Number of MSER region " << region.size()<<" Number of pixels in all MSER region : "<<nbPixelInMSER<<"\n";
}
namedWindow(*itDesc + label, WINDOW_AUTOSIZE);
imshow(*itDesc + label, result);
imshow("Original", img);
FileStorage fs(*itDesc + "_" + fileName[0] + ".xml", FileStorage::WRITE);
fs << *itDesc << keyImg;
waitKey();
}
catch (Exception& e)
{
cout << "Feature : " << *itDesc << "\n";
cout << e.msg << endl;
}
DrawOpenGLMSER(img,result);
waitKey();
}
return;
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment