1

最近,我遇到了一个关于 OpenCV MSER 检测的问题。
下图中的文本未正确提取。

图片链接 - mser 检测无法正常工作

形态关闭后,结果似乎是正确的。

代码:

int main()
{
    // load
    cv::Mat sourceImage = cv::imread("F:\\Documents\\mQvnv.jpg");
    // convert
    cv::Mat grayImage;
    cv::cvtColor(sourceImage, grayImage, CV_BGR2GRAY);
    // morph close
    cv::Mat morphImage;
    cv::Mat morphKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2 * 1 + 1, 1), cv::Point(-1, -1));
    cv::morphologyEx(grayImage, morphImage, cv::MORPH_CLOSE, morphKernel);
    // mser
    std::vector<std::vector<cv::Point> > contours;
    cv::MSER ms;
    ms(morphImage, contours);
    // show
    cv::Mat finalImage = sourceImage.clone();
    for (int idx = 0; idx < contours.size(); idx++)
    {
        // filter
        cv::RotatedRect minRect = cv::minAreaRect(contours[idx]);
        if (minRect.size.height < 4. || minRect.size.width < 4.) continue;// filter 1

        double hwr = minRect.size.height / minRect.size.width;
        if (hwr < 1.) hwr = minRect.size.width / minRect.size.height;
        if (hwr > 10.) continue;// filter 2

        double contourArea = cv::contourArea(contours[idx]);
        double rectArea = minRect.size.area();
        double areaRatio = contourArea / rectArea;
        if (areaRatio < 0.35) continue;// filter 3

        // draw rotated rectangle
        cv::Point2f rect_points[4]; minRect.points(rect_points);
        for (int j = 0; j < 4; j++)
            cv::line(finalImage, rect_points[j], rect_points[(j + 1) % 4], cv::Scalar(0, 0, 255));
    }

    cv::imshow("MSER Demo", finalImage);
    //
    cv::waitKey(0);
    return 0;
}


我很困惑。

  • MSER 有约束/限制吗?
  • 它需要一些预处理吗?什么样的?比如形态学。

我也期待这种类型的文本检测的新方法。

如果可以回答,我将不胜感激。

4

1 回答 1

0

您在黑色背景上有白色文本。一些 MSER 实现在白色背景上寻找黑色。

尝试反转图像并重试。

于 2017-07-27T13:19:38.053 回答