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:
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
:
Any ideas how to get the filled region from the contours (or to get the MSER mask in other ways)?
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;
}
}
}