opencv - 如何提取框架中文本的区域?

标签 opencv computer-vision ocr opencv3.1

我正在开发一个程序,该程序使用 OpenCV 从一帧中提取给定文本的区域。拿到之后,应该是那个区域的模糊处理。
给定框内显示的文本,文本始终处于水平状态,颜色为白色。
但我不知道文本在框架中的显示位置。偶尔会更改文本的位置。

  • 如何使用 OpenCV 提取文本的区域(x、y、宽度、高度)?
  • 有什么工具可以做到这一点吗?

  • 我附上了两个样本框架。可以在游戏标记下看到 8 位十六进制代码。

    sample 1: a case of complex color background

    sample 2: a case of single color background

    请指教,谢谢。

    最佳答案

    网络上有几个资源。一种方法是通过查找靠近的边缘元素(link)来检测文本。总结一下,您首先使用 cv::Canny 检测图像中的边缘或 cv::Sobel或任何其他边缘检测方法(尝试哪种方法最适合您的情况)。然后用阈值对图像进行二值化。

    enter image description here

    要删除工件,您可以应用 rank filter .然后你将你的字母与形态操作 cv::morphologyEx 合并。 .您可以尝试扩张或关闭。关闭将关闭字母之间的空间并将它们合并在一起而不会改变太多大小。您必须使用内核大小和形状。知道您使用 cv::findContours 检测到问题,进行多边形近似并计算轮廓的边界矩形。

    enter image description here

    要检测正确的轮廓,您应该测试正确的大小左右(例如 if (contours[i].size()>100) )。然后您可以根据 this article 对找到的字段进行排序。在那里详细解释。

    这是第一篇文章的代码:

    #include "opencv2/opencv.hpp"
    
    std::vector<cv::Rect> detectLetters(cv::Mat img)
    {
        std::vector<cv::Rect> boundRect;
        cv::Mat img_gray, img_sobel, img_threshold, element;
        cvtColor(img, img_gray, CV_BGR2GRAY);
        cv::Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3, 1, 0,    cv::BORDER_DEFAULT);
        cv::threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
        element = getStructuringElement(cv::MORPH_RECT, cv::Size(17, 3) );
        cv::morphologyEx(img_threshold, img_threshold, CV_MOP_CLOSE, element); //Does the trick
        std::vector< std::vector< cv::Point> > contours;
        cv::findContours(img_threshold, contours, 0, 1); 
        std::vector<std::vector<cv::Point> > contours_poly( contours.size() );
        for( int i = 0; i < contours.size(); i++ )
            if (contours[i].size()>100)
            { 
                cv::approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true );
                cv::Rect appRect( boundingRect( cv::Mat(contours_poly[i]) ));
                if (appRect.width>appRect.height) 
                    boundRect.push_back(appRect);
            }
        return boundRect;
    }
    

    关于opencv - 如何提取框架中文本的区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39178378/

    相关文章:

    opencv - 使用 OpenCV 平移和旋转 3D 图像

    c++ - cvCalcOpticalFlowHS 未被识别 C++

    python - 获取RGB值opencv python

    java - Asprise OCR <错误 : failed to read pdf. 错误代码:ÿ>

    ios - 如何在 Swift 中使用 UITextField 从图像中提取特定文本?

    c++ - 具有 k = 2 的 knnMatch 返回 0 最近邻,即使图像经过训练

    c++ - 如何使用非静态相机跟踪任何移动物体? [Opencv]

    python - 如何知道 ImageDataGenerator() 将哪个标签分配给哪个图像类?

    python - 使用 OpenCV 的错误视差图

    python - 设计一个专门用于渲染文本的开源 OCR 引擎(截图)