合并重叠边界框的技术不起作用

时间:2015-12-23 10:59:39

标签: python opencv

我正在尝试使用OpenCV(3.0)和Python检测图像中的文本区域。到目前为止,我能够检测单个文本字符并在它们周围绘制边界框或矩形。我的最终目标是将单个文本字符合并为单词/文本行,最终合并为文本块或段落。

我的方法是找到相邻的文本区域,然后在这些区域周围形成一个边界框。所以,在我的代码中,我扩展了每个文本字符周围的边界框或矩形,使它们相互重叠,形成一系列重叠的边界框。 (请参阅图片)。现在,我想根据所有边界框对之间的重叠率合并这些重叠矩形以形成单个边界框。

我很难弄清楚如何将重叠的矩形合并为一个矩形。在过去的24小时里,我尝试了不同的技术而没有任何运气。其中有cv2.groupRectangles。我想我们需要一个由cv2.cascade.detectMultiScale()返回的矩形数组(即rectList);我们还需要haar级联来检测图像中的对象(即在我们的例子中是矩形),并且在"数据文件夹中有许多haar级联"我很困惑在我的情况下使用哪一个(检测矩形)。

如果cv2.groupRectangles不适用于我的情况,那么我想知道的其他选项可能是什么。如果您遇到类似问题,请分享。

enter image description here

这是我正在使用的Python代码

ListCell

我尝试了以下cv2.groupRectangles代码,但它根本没有产生任何效果。我注意到cascade.detectMultiScale没有找到任何矩形。

import numpy as np
import cv2
im = cv2.imread('headintext.png')
grayImage = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
# grayImage = cv2.imread('gates.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imwrite('gates.png', grayImage)
# cv2.imshow('image', grayImage)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
_,thresh = cv2.threshold(grayImage, 150, 255, cv2.THRESH_BINARY_INV)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
dilated = cv2.dilate(thresh, kernel, iterations = 1) # dilate
_,contours0,_ = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) # get contours
contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in contours0]
# contours, hierarchy = cv2.findContours(thresh, 1, 2)
# for each contour found, draw a rectangle around it on original image
for contour in contours:
    # get rectangle bounding contour
    [x,y,w,h] = cv2.boundingRect(contour)

    # discard areas that are too large
    if h>50 and w>50:
        continue

    # discard areas that are too small
    if h<5 or w<5:
        continue

    # draw rectangle around contour on original image
    # slightly expand the rectangles to form a chain of overlapping bounding boxes
    pad_w, pad_h = int(0.05*w), int(0.15*h)
    cv2.rectangle(im,(x-pad_w,y-pad_h),(x+w+pad_w,y+h+pad_h),(255,0,255),1,shift=0)


# write original image with added contours to disk
cv2.imwrite("rectangle.png", im)
cv2.imshow('image', im)
cv2.waitKey(0)
cv2.destroyAllWindows()

0 个答案:

没有答案