使用OCR阅读循环文本

时间:2017-10-09 17:36:40

标签: opencv text alignment ocr geometry

我想读取对象上的文字。但是OCR程序无法识别它。当我给出小部分时,它可以识别。我必须将圆形文本转换为线性文本。我怎样才能做到这一点?感谢。

enter image description here

1 个答案:

答案 0 :(得分:8)

您可以将图像从笛卡尔坐标系转换为极坐标系,为OCR程序准备圆路径文本图像。此功能logPolar()可以提供帮助。

以下是准备圆形路径文本图像的一些步骤:

  1. 使用HoughCircles()找到圈子的中心。
  2. 得到平均值并做一些偏移,所以得到中心。
  3. (Optinal)从中心裁剪图像的正方形。
  4. 执行logPolar(),然后根据需要进行旋转。
  5. 检测圆圈后得到中心的平均值并做偏移。 enter image description here

    歪曲的形象:

    enter image description here

    logPolar()rotate()

    之后

    enter image description here

    此处显示了我的Python3-OpenCV3.3代码,也许有帮助。

    #!/usr/bin/python3
    # 2017.10.10 12:44:37 CST
    # 2017.10.10 14:08:57 CST
    import cv2
    import numpy as np
    
    ##(1) Read and resize the original image(too big)
    img = cv2.imread("circle.png")
    img = cv2.resize(img, (W//4, H//4))
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ## (2) Detect circles
    circles = cv2.HoughCircles(gray, method=cv2.HOUGH_GRADIENT, dp=1, minDist=3, circles=None, param1=200, param2=100, minRadius = 200, maxRadius=0 )
    
    ## make canvas
    canvas = img.copy()
    
    ## (3) Get the mean of centers and do offset
    circles = np.int0(np.array(circles))
    x,y,r = 0,0,0
    for ptx,pty, radius in circles[0]:
        cv2.circle(canvas, (ptx,pty), radius, (0,255,0), 1, 16)
        x += ptx
        y += pty
        r += radius
    
    cnt = len(circles[0])
    x = x//cnt
    y = y//cnt
    r = r//cnt
    x+=5
    y-=7
    
    ## (4) Draw the labels in red
    for r in range(100, r, 20):
        cv2.circle(canvas, (x,y), r, (0, 0, 255), 3, cv2.LINE_AA)
    cv2.circle(canvas, (x,y), 3, (0,0,255), -1)
    
    ## (5) Crop the image
    dr = r + 20
    croped = img[y-dr:y+dr+1, x-dr:x+dr+1].copy()
    
    ## (6) logPolar and rotate
    polar = cv2.logPolar(croped, (dr,dr),80, cv2.WARP_FILL_OUTLIERS )
    rotated = cv2.rotate(polar, cv2.ROTATE_90_COUNTERCLOCKWISE)
    
    ## (7) Display the result
    cv2.imshow("Canvas", canvas)
    cv2.imshow("croped", croped)
    cv2.imshow("polar", polar)
    cv2.imshow("rotated", rotated)
    
    cv2.waitKey();cv2.destroyAllWindows()