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

时间:2016-08-27 06:57:03

标签: 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

请建议,谢谢。

1 个答案:

答案 0 :(得分:2)

网络上有几种资源。一种方法是通过查找近边元素(link)来检测文本。总结一下,您首先使用cv::Cannycv::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;
}