Texto Não e reconhecido

Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #45292

    Olá, estou pegando as imagens de veiculos e depois passo ela para o processo de ocr para pegar o texto da placa, mesmo o texto estando em otima qualidade e ele estar detectando a placa e tudo mais o texto não esta sendo extraido,  gostaria de uma ajuda para tentar entender o que tem de errado com o codigo.

    Esta e a Imagem

    Veiculo sendo detectado

     

    import cv2
    import numpy as np
    import imutils
    import pytesseract
    from matplotlib import pyplot as plt
    
    def show_img(img, title="Image"):
        fig = plt.gcf()
        fig.set_size_inches(128, 64) 
        plt.axis("off")
        plt.title(title)
        plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        plt.show()
    
    def preprocessing(img):
      increase = cv2.resize(img, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_CUBIC)
      value, otsu = cv2.threshold(increase, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
      return otsu
    
    def ocr_plate(plate):
      config_tesseract = "--tessdata-dir tessdata --psm 6"
      text = pytesseract.image_to_string(plate, lang="por", config=config_tesseract)
      print(text)
      text = "".join(c for c in text if c.isalnum())
      return text
    
    def recognize_plate(file_img):
      img, plate, beginX, beginY, endX, endY = detect_plate(file_img)
      
      if plate is False:
        print("It was not possible to detect!")
        return 0
    
      text = ocr_plate(plate)
      print(text)
      img = cv2.putText(img, text, (beginX, beginY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (150,255,0), 2, lineType=cv2.LINE_AA)
      img = cv2.rectangle(img, (beginX, beginY), (endX, endY), (150, 255, 0), 2)
      #show_img(img)
    
      return img, plate
    
    def detect_plate(file_img):
      img = cv2.imread(file_img)
      (H, W) = img.shape[:2]
      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      blur = cv2.bilateralFilter(gray, 11, 17, 17)
      edged = cv2.Canny(blur, 30, 200)
      #show_img(edged)
      conts = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
      conts = imutils.grab_contours(conts) 
      conts = sorted(conts, key=cv2.contourArea, reverse=True)[:8]
    
      location = None
      for c in conts:
        peri = cv2.arcLength(c, True)
        aprox = cv2.approxPolyDP(c, 0.02 * peri, True)
        if cv2.isContourConvex(aprox):
          if len(aprox) == 4:
              location = aprox
              break
    
      beginX = beginY = endX = endY = None
      if location is None:
        plate = False
      else:
        mask = np.zeros(gray.shape, np.uint8)
    
        img_plate = cv2.drawContours(mask, [location], 0, 255, -1)
        img_plate = cv2.bitwise_and(img, img, mask=mask)
    
        (y, x) = np.where(mask==255)
        (beginX, beginY) = (np.min(x), np.min(y))
        (endX, endY) = (np.max(x), np.max(y))
    
        plate = gray[beginY:endY, beginX:endX]
        #show_img(plate)
    
      return img, plate, beginX, beginY, endX, endY
    
    
    #improving the quality
    img, plate = recognize_plate("./veiculos/entrada/car_27_05_2024_20_15_41.jpg")
    
    processed_plate = preprocessing(plate)
    #show_img(processed_plate)
    text = ocr_plate(processed_plate)
    print(f'placa detectada:\n')
    print(text)
    #45304
    Gabriel Alves
    Moderador

      Olá Rodrigo!

      Você já tentou alterar os parâmetros, como o –psm?

      Outra coisa, apesar de ter detectado você consegue verificar se foi detectada exatamente a região correta da placa? Para isso, retire do comentário a linha de código show_img(processed_plate)

      Pois nesse código está programado para mostrar que houve a detecção, mas em alguns casos não foi a região certa da placa.

      Sugiro testar também o EasyOCR, caso não tenha testado ainda, pois ele tem uma tendência a funcionar melhor para imagens em situações inseridas no mundo real (em “cenários naturais”) exigindo menos esforço para se conseguir melhores resultados. Também pode conseguir resultados ótimos com o Tesseract, porém exige um pouco de atenção a mais para as técnicas de pré-processamento de imagem. Por isso, recomendamos explorar todas as citadas na seção “Técnicas para pré-processamento de imagens”.

      Já se você verificou ali que o problema foi em detectar corretamente a região da placa, então você pode customizar os parâmetros do código de detecção, ou (mais indicado) usar alguma técnica mais moderna baseada em deep learning, como o YOLO, assim garantirá uma detecção mais precisa da placa para as imagens que vier a testar. Você pode encontrar um código completo com a versão mais recente do YOLO nesse repositório.

      Então se houver dificuldade na detecção da placa eu sugiro usar logo algumas dessas técnicas baseadas em deep learning para garantir maior precisão, exigindo menos tempo para adaptar o algoritmo. Como o foco do curso acaba sendo o OCR então isso não foi abordado, porém visto que essas técnicas modernas de detecção hoje em dia permitem uma implementação mais fácil então eu sugiro usá-las.

      #45308

      Olá Gabriel tudo bem ?, eu testei praticamente todos os parametros do PSM sem sucesso, e o codigo ele detecta certinho a placa conforme instruido no curso porem na hora de fazer o OCR ele nao faz. por isso postei aqui o codigo para ver se seu não tinha feito algo errado, se baixar a imagem e o codigo vai ver que ele detecta certinho mas nao faz o OCR , achei estrano porque a qualidade da imagem mesmo ele recortaando a placa esta muito boa e  nao tenho o resultado positivo, vou tentar com este outra que me informou. mas se puder dar uma olhada no meu codigo

       

      #45309

      estou vendo os modelos sugeridos e acho que vou seguir por eles por enquanto muito obrigado.

      #45324
      Gabriel Alves
      Moderador

        Olá, que ótimo!

        Quanto ao exemplo fornecido, o que pode estar dificultando o reconhecimento é a perspectiva de placa na foto, veja que pelo fato de não estar alinhada o texto fica na diagonal e isso pode dificultar o OCR. Para corrigir isso, você pode usar alguns conjuntos de técnicas de processamento para fazer a correção da perspectiva, veja esse código aqui de exemplo.

        #45327

        Muito obrigado pela Resposta

        #45334
        Gabriel Alves
        Moderador

          Disponha =)

        Visualizando 7 posts - 1 até 7 (de 7 do total)
        • Você deve fazer login para responder a este tópico.