首页 文章

平面图文本识别和OCR

提问于
浏览
1

目标是使用文本识别方法(例如:OpenCV)为美国平面图图像创建边界框,然后可以将其输入文本阅读器(例如:LSTM或tesseract) .

已经尝试了几种已经尝试过cv2.findContours和cv2.boundingRect方法的方法,但很大程度上未能推广到不同类型的楼层平面图(楼层平面图的外观存在很大差异) .

例如,在应用cv2.findContours函数之前,使用灰度,自适应阈值,侵蚀和扩张(使用各种迭代)的cv2.findContours会产生下面的声音 . 请注意,卧室2和厨房没有正确拾取 .

无法找到任何区域的其他示例:

有关文本识别模型或清洁程序的任何想法,将提高文本识别模型的准确性,最好是代码示例?

1 回答

  • 3

    这个答案是基于图像彼此相似的假设(如它们的大小,墙壁厚度,字母......) . 如果它们不是,那么这不是一个好方法,因为你必须为每个图像更改阈值 . 话虽这么说,我会尝试将图像转换为二进制并搜索轮廓 . 之后,您可以添加高度,重量等标准来过滤掉墙壁 . 之后,您可以在蒙版上绘制轮廓,然后扩大图像 . 这将把彼此接近的字母组合成一个轮廓 . 然后,您可以为所有轮廓创建边界框,这是您的投资回报率 . 然后,您可以在该区域使用任何OCR . 希望它有点帮助 . 干杯!

    例:

    import cv2
    import numpy as np
    
    img = cv2.imread('floor.png')
    mask = np.zeros(img.shape, dtype=np.uint8)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, threshold = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV)
    _, contours, hierarchy = cv2.findContours(threshold,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
    
    ROI = []
    
    for cnt in contours:
        x,y,w,h = cv2.boundingRect(cnt)
        if h < 20:
            cv2.drawContours(mask, [cnt], 0, (255,255,255), 1)
    
    kernel = np.ones((7,7),np.uint8)
    dilation = cv2.dilate(mask,kernel,iterations = 1)
    gray_d = cv2.cvtColor(dilation, cv2.COLOR_BGR2GRAY)
    _, threshold_d = cv2.threshold(gray_d,150,255,cv2.THRESH_BINARY)
    _, contours_d, hierarchy = cv2.findContours(threshold_d,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
    
    for cnt in contours_d:
        x,y,w,h = cv2.boundingRect(cnt)
        if w > 35:
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
            roi_c = img[y:y+h, x:x+w]
            ROI.append(roi_c)
    
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    结果:

相关问题