2015-02-14 11 views
9

Ich versuche, MSER-Algorithmus in OpenCV 3.0.0 Beta zu verwenden, um Textbereiche aus einem Bild zu extrahieren. Am Ende brauche ich eine binäre Maske mit den erkannten MSER-Regionen, aber der Algorithmus bietet nur Konturen. Ich habe versucht, diese Konturen zu zeichnen, aber ich bekomme nicht das erwartete Ergebnis.OpenCV 3.0.0 MSER binäre Maske

Dies ist der Code I verwendet werden:

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

Dies ist das Ergebnis: OPENCV MSER

Das Problem ist, dass nicht-konvexen Bereiche durch Linien gefüllt sind, die Region tatsächlichen MSER kreuzen. Ich möchte nur die Liste der Pixel in der Region, wie ich aus MATLAB erhalten detectMSERFeatures: MATLAB MSER

Irgendwelche Ideen, wie man den gefüllten Bereich von den Konturen zu bekommen (oder den MSER Maske auf andere Weise zu bekommen)?

Antwort

10

Ich fand die Lösung! Schlinge einfach über alle Punkte und zeichne sie!

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