2015-02-14 5 views
9

Я пытаюсь использовать алгоритм MSER в OpenCV 3.0.0 beta для извлечения текстовых областей из изображения. В конце мне нужна бинарная маска с обнаруженными областями MSER, но алгоритм предоставляет только контуры. Я попытался нарисовать эти контуры, но я не получил ожидаемого результата.OpenCV 3.0.0 MSER Binary Mask

Это код, я использую:

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); 
    } 
} 

Это результат: OPENCV MSER

Проблема состоит в том, что не-выпуклые области заполнены линий, пересекающих фактическую MSER область. Я хотел бы просто список пикселей в области, как я получаю от MATLAB detectMSERFeatures: MATLAB MSER

Любые идеи, как получить заполненную область от контуров (или получить маску MSER другими способами)?

ответ

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; 
     } 
    } 
}