Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Tratativa de imagens para identificação de placas veiculares (opencv e pyesseract)

29 views
Skip to first unread message

Pedro Andrade Lima

unread,
Nov 6, 2024, 2:33:16 PM11/6/24
to Python Brasil
O problema se dá na leitura do contorno da placa no sentido anti-horário.
Quando a placa se encontra na posição reta e em sentido horário funciona muito bem porém, no sentido contrario não roda de forma nenhuma até agora, já tentei em 360º e sentido anti-horário isoladamente e não foi, fora outras 10 maneiras de como não dar certo.

Tive que isolar para tratar até dar certo.

Segue parte do código para eventuais duvidas de como está rodando.

Grato por qualquer orientação.

import cv2
import numpy as np

# Função para configurar a URL RTSP da câmera
def configurar_camera_rtsp(username, password, ip_address, port, stream_path):
return f"rtsp://{username}:{password}@{ip_address}:{port}/{stream_path}"

# Função para detectar e desenhar contornos com restrição de ângulo
def detectar_contornos(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
imagem_suavizada = cv2.GaussianBlur(gray, (5, 5), 0)
bordas = cv2.Canny(imagem_suavizada, 100, 200)
contornos, _ = cv2.findContours(bordas, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contorno in contornos:
# Aproximar o contorno para um retângulo rotacionado
retangulo = cv2.minAreaRect(contorno)
(x, y), (w, h), angulo = retangulo

# Ajustar o ângulo se necessário
if angulo < -45:
 angulo = 90 + angulo

# Filtrar para contornos com ângulo entre -30 e 30 graus
if (0 <= angulo <= 30) or (-30 <= angulo <= 0):
# Filtrar também por aspecto e tamanho para corresponder à proporção de uma placa
aspect_ratio = w / float(h) if h != 0 else 0
if 2 <= aspect_ratio <= 5 and w > 100:
# Obter e desenhar o retângulo
box = cv2.boxPoints(retangulo)
box = np.int32(box)
cv2.drawContours(frame, [box], 0, (0, 255, 0), 2)

return frame

# Configurações da câmera IP
username = "admin"
password = "admin"
ip_address = "192.168.0.100" # IP da sua câmera
port = "554"
stream_path = "caminho_do_stream"

# URL RTSP
rtsp_url = configurar_camera_rtsp(username, password, ip_address, port, stream_path)

# Captura de vídeo com RTSP
cap = cv2.VideoCapture(rtsp_url)

if not cap.isOpened():
print("Erro ao abrir o stream da câmera RTSP")
exit()

# Definir resolução máxima, caso seja suportada
resolucao_largura = 2304
resolucao_altura = 1296
cap.set(cv2.CAP_PROP_FRAME_WIDTH, resolucao_largura)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, resolucao_altura)

# Nome da janela para ajuste de resolução
window_name = "Detecção de Contornos de Placa"

# Criar janela ajustável
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(window_name, resolucao_largura, resolucao_altura)

# Loop para capturar e processar frames do vídeo
while True:
ret, frame = cap.read()

if not ret:
print("Erro na captura do frame ou final do vídeo")
break

# Detectar contornos no frame
frame_com_contornos = detectar_contornos(frame)

# Exibir o frame com contornos detectados
cv2.imshow(window_name, frame_com_contornos)

# Pressione 'q' para sair
if cv2.waitKey(1) & 0xFF == ord('q'):
break

# Liberar a câmera e fechar as janelas
cap.release()
cv2.destroyAllWindows()
Reply all
Reply to author
Forward
0 new messages