00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "mserdetector.h"
00021
00022 MSERDetector::MSERDetector() : storage(cvCreateMemStorage(0)), mean(cv::Size(2,1))
00023 {
00024 params = cvMSERParams();
00025 params.minArea=3;
00026 params.delta=5;
00027 params.minDiversity=0.7;
00028 params.maxVariation = .15;
00029 params.maxArea=300;
00030 }
00031
00032 unsigned MSERDetector::mser(cv::Mat &mat, cv::Mat mask)
00033 {
00034 CvMat _image = mat, _mask, *maskp=0;
00035 if (mask.data) {
00036 _mask = mask;
00037 maskp = &_mask;
00038 }
00039
00040
00041
00042 cvClearMemStorage(storage);
00043 cvExtractMSER(&_image, maskp, &contours.seq, storage, params );
00044
00045 return size();
00046 }
00047
00048 void MSERDetector::getRegion(Contour &contour, MSERegion &r)
00049 {
00050 int n =contour.size();
00051 cv::Mat_<float> dat(cv::Size(2,n));
00052 float *ptr= &dat(0,0);
00053 mean(0,0)=mean(0,1)=0;
00054 for (cv::Seq<cv::Point>::iterator j(contour.begin()); --n>=0; ++j) {
00055 mean(0,0) += ptr[0] = (*j).x;
00056 mean(0,1) += ptr[1] = (*j).y;
00057 ptr+=2;
00058 }
00059 mean *= 1.0/contour.size();
00060 r.c.x = mean.at<float>(0,0), r.c.y = mean.at<float>(0,1);
00061
00062 pca(dat, mean, CV_PCA_DATA_AS_ROW, 2);
00063
00064 float a = 1.5f*sqrtf(pca.eigenvalues.at<float>(0,0));
00065 float b = 1.5f*sqrtf(pca.eigenvalues.at<float>(0,1));
00066 cv::Point_<float> e1(a*pca.eigenvectors.at<float>(0,0), a*pca.eigenvectors.at<float>(0,1));
00067 cv::Point_<float> e2(b*pca.eigenvectors.at<float>(1,0), b*pca.eigenvectors.at<float>(1,1));
00068
00069 if (e1.x*e2.y-e1.y*e2.x<0) {
00070 e2 = -e2;
00071 }
00072 r.e1 = e1;
00073 r.e2 = e2;
00074 }
00075
00076