簡體   English   中英

平面圖文本識別和 OCR

[英]Floor Plan Text Recognition & OCR

目標是使用文本識別方法(例如:OpenCV)為美國平面圖圖像創建邊界框,然后可以將其輸入文本閱讀器(例如:LSTM 或 tesseract)。

已經嘗試了幾種方法 cv2.findContours 和 cv2.boundingRect 方法,但在很大程度上未能推廣到不同類型的平面圖(平面圖的外觀存在很大差異)。

例如,在應用 cv2.findContours 函數之前,cv2.findContours 使用灰度、自適應閾值、腐蝕和膨脹(具有各種迭代)會導致以下結果。 請注意,卧室 2 和廚房未正確拾取。

輸出 輸入

無法找到任何區域的其他示例:

在此處輸入圖片說明

關於文本識別模型或清理程序的任何想法將提高文本識別模型的准確性,最好是代碼示例?

這個答案是基於圖像彼此相似的假設(比如它們的大小、牆壁的厚度、字母......)。 如果不是,這將不是一個好方法,因為您必須更改每個圖像的閾值器。 話雖如此,我會嘗試將圖像轉換為二進制並搜索輪廓。 之后,您可以添加諸如身高、體重等標准來過濾掉牆壁。 之后,您可以在蒙版上繪制輪廓,然后擴大圖像。 這會將彼此靠近的字母組合成一個輪廓。 然后您可以為所有輪廓創建邊界框,這是您的 ROI。 然后您可以在該區域使用任何 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()

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM