Search code examples
pythonopencvcomputer-visionpython-tesseract

pytesseract not recognizing text as expected?


I am trying to run a simple license plate image through opencv and pytesseract to get the text but I am having trouble getting anything out of it. Following the tutorial here:

https://circuitdigest.com/microcontroller-projects/license-plate-recognition-using-raspberry-pi-and-opencv

I'm running on a macbook with everything installed in anaconda and no errors as far as I see, but when I run my code I get the cropped image but no detected number:

(computer_vision) mac@x86_64-apple-darwin13 lpr % python explore.py
Detected Number is: 

The code is below:

import cv2
import numpy as np
import imutils
import pytesseract

img = cv2.imread('plate1.jpg')
img = cv2.resize(img, (620,480))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale
gray = cv2.bilateralFilter(gray, 11, 17, 17)
edged = cv2.Canny(gray, 30, 200) #Perform Edge detection

cnts = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]
screenCnt = None

# loop over our contours
for c in cnts:
                # approximate the contour
                peri = cv2.arcLength(c, True)
                approx = cv2.approxPolyDP(c, 0.018 * peri, True)
                # if our approximated contour has four points, then
                # we can assume that we have found our screen
                if len(approx) == 4:
                      screenCnt = approx
                      break

# Masking the part other than the number plate
mask = np.zeros(gray.shape,np.uint8)
new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,)
new_image = cv2.bitwise_and(img,img,mask=mask)

# Now crop
(x, y) = np.where(mask == 255)
(topx, topy) = (np.min(x), np.min(y))
(bottomx, bottomy) = (np.max(x), np.max(y))
Cropped = gray[topx:bottomx+1, topy:bottomy+1]

#Read the number plate
text = pytesseract.image_to_string(Cropped, config='--psm 11')
print("Detected Number is:",text)


cv2.imshow('image',Cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()

Base image is here:enter image description here


Solution

  • You may try different psm configuration:

    text = pytesseract.image_to_string(Cropped, config='--psm 3')
    

    Output is: Detected Number is: PHR. 26.BR 9044;.

    Tesseract manual page:

    0 = Orientation and script detection (OSD) only.
    1 = Automatic page segmentation with OSD.
    2 = Automatic page segmentation, but no OSD, or OCR. (not implemented)
    3 = Fully automatic page segmentation, but no OSD. (Default)
    4 = Assume a single column of text of variable sizes.
    5 = Assume a single uniform block of vertically aligned text.
    6 = Assume a single uniform block of text.
    7 = Treat the image as a single text line.
    8 = Treat the image as a single word.
    9 = Treat the image as a single word in a circle.
    10 = Treat the image as a single character.
    11 = Sparse text. Find as much text as possible in no particular order.
    12 = Sparse text with OSD.
    13 = Raw line. Treat the image as a single text line,
         bypassing hacks that are Tesseract-specific.
    I don't know why `psm` `11` is not giving any output...  
    

    It looks like psm 11 is not yet published (or it's too new):

    tesseract-ocr:

    void PrintHelpForPSM() {
      const char* msg =
          "Page segmentation modes:\n"
            "  0    Orientation and script detection (OSD) only.\n"
            "  1    Automatic page segmentation with OSD.\n"
            "  2    Automatic page segmentation, but no OSD, or OCR.\n"
            "  3    Fully automatic page segmentation, but no OSD. (Default)\n"
            "  4    Assume a single column of text of variable sizes.\n"
            "  5    Assume a single uniform block of vertically aligned text.\n"
            "  6    Assume a single uniform block of text.\n"
            "  7    Treat the image as a single text line.\n"
            "  8    Treat the image as a single word.\n"
            "  9    Treat the image as a single word in a circle.\n"
            " 10    Treat the image as a single character.\n"
    
            //TODO: Consider publishing these modes.
            #if 0
            " 11    Sparse text. Find as much text as possible in no"
              " particular order.\n"
            " 12    Sparse text with OSD.\n"
            " 13    Raw line. Treat the image as a single text line,\n"
              "\t\t\tbypassing hacks that are Tesseract-specific.\n"
            #endif
            ;