Бинарная маска MSER OpenCV 3.0.0

Я пытаюсь использовать алгоритм MSER в бета-версии OpenCV 3.0.0 для извлечения текстовых областей из изображения. В конце мне нужна двоичная маска с обнаруженными областями 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);
    }
}

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

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

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

1 ответ

Я нашел решение! Просто обведите все точки и нарисуйте их!

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;
        }
    }
}
Другие вопросы по тегам