Home › Fóruns › Fórum Reconhecimento de Textos com OCR e Python › Texto Não e reconhecido
- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 10 meses, 3 semanas atrás por
Gabriel Alves.
- AutorPosts
- 29 de maio de 2024 às 14:19 #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
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)
31 de maio de 2024 às 02:45 #45304Olá 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.
1 de junho de 2024 às 12:55 #45308Olá 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
1 de junho de 2024 às 13:02 #45309estou vendo os modelos sugeridos e acho que vou seguir por eles por enquanto muito obrigado.
4 de junho de 2024 às 00:03 #45324Olá, 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.
4 de junho de 2024 às 15:01 #45327Muito obrigado pela Resposta
6 de junho de 2024 às 00:42 #45334Disponha =)
- AutorPosts
- Você deve fazer login para responder a este tópico.