Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV 3.0.0 MSER Binary Mask

I am trying to use MSER algorithm in OpenCV 3.0.0 beta to extract text regions from an image. At the end I need a binary mask with the detected MSER regions, but the algorithm only provides contours. I tried to draw these contours but I don't get the expected result.

This is the code I use:

void mserExtractor (const Mat& image, Mat& mserOutMask){
    Ptr<MSER> mserExtractor  = MSER::create();

    vector<vector<cv::Point>> mserContours;
    vector<cv::Rect> mserBbox;
    mserExtractor->detectRegions(image, mserContours, mserBbox);

    for( int i = 0; i<mserContours.size(); i++ )
    {
        drawContours(mserOutMask, mserContours, i, Scalar(255, 255, 255), 4);
    }
}

This is the result: OPENCV MSER

The problem is that non-convex regions are filled by lines crossing the actual MSER region. I would like just the list of pixels in the region like I get from MATLAB detectMSERFeatures: MATLAB MSER

Any ideas how to get the filled region from the contours (or to get the MSER mask in other ways)?

like image 423
Marco Ancona Avatar asked Feb 14 '15 11:02

Marco Ancona


1 Answers

I found the solution! Just loop over all the points and draw them!

void mserExtractor (const Mat& image, Mat& mserOutMask){
    Ptr<MSER> mserExtractor  = MSER::create();

    vector<vector<cv::Point>> mserContours;
    vector<KeyPoint> mserKeypoint;
    vector<cv::Rect> mserBbox;
    mserExtractor->detectRegions(image, mserContours,  mserBbox);

    for (vector<cv::Point> v : mserContours){
        for (cv::Point p : v){
            mserOutMask.at<uchar>(p.y, p.x) = 255;
        }
    }
}
like image 164
Marco Ancona Avatar answered Sep 29 '22 21:09

Marco Ancona