【问题标题】:Extract text and bounding-box using OpenCV使用 OpenCV 提取文本和边界框
【发布时间】:2018-10-06 19:53:52
【问题描述】:

我正在尝试在图像中查找文本的边界框(矩形)。所以,我喜欢一次扫描整个图像并获取所有文本区域。问题是很少有文本被忽略,很少有文本被组合在一起。分组应该是单词明智的。它不应该组合在一起,有多个单词。每个单词都应该有自己的矩形。我正在使用下面给出的代码。

int COCR::method_gradient(int nonGradient, int showOutput)
{
Mat large = imread(INPUT_FILE);
Mat rgb;

rgb = large;  //--> change

Mat small;
cvtColor(rgb, small, CV_BGR2GRAY);

// morphological gradient
Mat grad;
Mat morphKernel;

if (!nonGradient)
{
    morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
    morphologyEx(small, grad, MORPH_GRADIENT, morphKernel);
}
else
    grad = small;


// binarize
Mat bw;
threshold(grad, bw, 0.0, 255.0, THRESH_BINARY | THRESH_OTSU);

// connect horizontally oriented regions
Mat connected;
morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1));
morphologyEx(bw, connected, MORPH_CLOSE, morphKernel);

// find contours
Mat mask = Mat::zeros(bw.size(), CV_8UC1);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

if (nonGradient)
    rgb = MatGradient;

// filter contours
for (int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
    Rect rect = boundingRect(contours[idx]);
    Mat maskROI(mask, rect);
    maskROI = Scalar(0, 0, 0);

    
    // fill the contour
    drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED);
    
    // ratio of non-zero pixels in the filled region
    double r = (double)countNonZero(maskROI) / (rect.width*rect.height);

    if (r > .25 /* assume at least 25% of the area is filled if it contains text */
        &&
        (rect.height > 8 && rect.width > 8) 
        )
    {
        rectangle(rgb, rect, Scalar(0, 255, 0), 2);
    }
}

if (!nonGradient)
    MatGradient = rgb;

if (showOutput)
    imwrite(OUTPUT_FOLDER_PATH, rgb);

return 0;
}

// calling
COCR obj_ocr;   
obj_ocr.method_gradient(0, 0);
obj_ocr.method_gradient(1, 1);

source img 请注意红色部分。 output img

source_2 请看红色部分。 output_2

请告诉我如何纠正Red eclipse中缺失的区域显示。

【问题讨论】:

  • 任何自己的尝试?
  • 不,不是。我想让它更好地满足我的需求。
  • findcontours()参数CV_RETR_CCOMP更改为CV_RETR_EXTERNAL

标签: opencv image-processing extract ocr bounding-box


【解决方案1】:

将关闭从 9,1 更改为 5,1 修复了两个图像的问题。

// connect horizontally oriented regions
cv::Mat connected;
morphKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 1));
cv::morphologyEx(bw, connected, cv::MORPH_CLOSE, morphKernel);

【讨论】:

  • 谢谢,效果更好。它现在正在接收遗漏的单词,但它并没有隔离单词。它仍然将 3 个或更多单词组合为一个。请提出建议。
  • 你可以像 cv::Size(3,1) 一样降低它(总是需要是奇数)
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2021-11-26
  • 2021-04-16
  • 2021-10-20
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多