Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read circular text using OCR

I want to read text on the object. But OCR program can't recognize it. When I give the small part, it can recognize. I have to transform circle text to linear text. How can I do this? Thanks.

enter image description here

like image 327
saucompeng Avatar asked Oct 09 '17 17:10

saucompeng


1 Answers

you can transform the image from Cartesian coordinate system to Polar coordinate system to prepare circle path text image for OCR program. This function logPolar() can help.

Here are some steps to prepare circle path text image:

  1. Find the circles' centers using HoughCircles().
  2. Get the mean and do some offset, so get the center.
  3. (Optinal) Crop a square of the image from the center.
  4. Do logPolar(), then rotate it if necessary.

After detect circles and get the mean of centers and do offset. enter image description here

The croped image:

enter image description here

After logPolar() and rotate()

enter image description here


My Python3-OpenCV3.3 code is presented here, maybe it helps.

#!/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()
like image 107
Kinght 金 Avatar answered Sep 30 '22 16:09

Kinght 金