我试图在OpenCV 3.0.0 beta中使用MSER算法从图像中提取文本区域。最后,我需要一个带有检测到的MSER区域的二进制掩码,但该算法仅提供轮廓。我试图绘制这些轮廓但我没有得到预期的结果。
这是我使用的代码:
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);
}
}
这是结果:
问题在于非凸区域被穿过实际MSER区域的线填充。我想像我从MATLAB detectMSERFeatures
获得的区域中的像素列表:
如何从轮廓中获取填充区域(或以其他方式获取MSER蒙版)?
答案 0 :(得分:10)
我找到了解决方案!只需遍历所有点并绘制它们!
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;
}
}
}