63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
import cv2
|
|
import numpy as np
|
|
|
|
# Função para processar cada frame do vídeo
|
|
def processar_frame(frame):
|
|
# Convertendo para escala de cinza
|
|
cinza = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
|
|
# Limiarização para criar uma imagem binária
|
|
_, binarizada = cv2.threshold(cinza, 128, 255, cv2.THRESH_BINARY_INV)
|
|
|
|
# Encontrar os contornos
|
|
contornos, _ = cv2.findContours(binarizada, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
|
|
|
# Supondo que o maior contorno seja o caminho
|
|
if contornos:
|
|
maior_contorno = max(contornos, key=cv2.contourArea)
|
|
|
|
# Encontrar retângulo delimitador para o maior contorno
|
|
x, y, w, h = cv2.boundingRect(maior_contorno)
|
|
|
|
# Calcular distância das bordas
|
|
largura_frame = frame.shape[1]
|
|
distancia_esquerda = x
|
|
distancia_direita = largura_frame - (x + w)
|
|
|
|
# Desenhar um retângulo ao redor do caminho detectado e linhas das bordas
|
|
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
|
cv2.line(frame, (x, 0), (x, frame.shape[0]), (255, 0, 0), 2)
|
|
cv2.line(frame, (x + w, 0), (x + w, frame.shape[0]), (255, 0, 0), 2)
|
|
|
|
return frame, distancia_esquerda, distancia_direita
|
|
else:
|
|
return frame, None, None
|
|
|
|
# Inicializando a captura de vídeo
|
|
cap = cv2.VideoCapture(1) # Use 0 para a câmera padrão do seu sistema
|
|
|
|
try:
|
|
while True:
|
|
# Capturando frame a frame
|
|
ret, frame = cap.read()
|
|
if not ret:
|
|
print("Falha ao capturar imagem da câmera")
|
|
break
|
|
|
|
# Processar o frame atual
|
|
frame_processado, distancia_esq, distancia_dir = processar_frame(frame)
|
|
|
|
if distancia_esq is not None and distancia_dir is not None:
|
|
print(f"Distância da borda esquerda: {distancia_esq} pixels")
|
|
print(f"Distância da borda direita: {distancia_dir} pixels")
|
|
|
|
# Exibir o frame processado
|
|
cv2.imshow('Frame Processado', frame_processado)
|
|
|
|
# Pressione 'q' para sair do loop
|
|
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
break
|
|
finally:
|
|
# Quando tudo estiver feito, liberar a captura
|
|
cap.release()
|
|
cv2.destroyAllWindows() |