linear_regression.py
# Este trabalho está licenciado sob a licença MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos os direitos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Exemplo de Regressão Linear
#
# Este exemplo mostra como usar o método get_regression() da sua OpenMV Cam
# para obter a regressão linear de uma ROI. Usando esse método, você pode construir facilmente
# um robô que consiga seguir linhas que apontam na mesma direção geral,
# mas que não estejam realmente conectadas. Use find_blobs() em linhas bem
# conectadas para melhores opções de filtragem e controle.
#
# get_regression() é executado em tempo O(N^2) na imagem. Para manter isso administrável, ele
# redimensiona por área a ROI de origem para um buffer temporário antes de ajustar a linha;
# o tamanho do buffer é configurável pelo argumento nomeado target_size=(w, h)
# (padrão (80, 60)). Passe uma tupla maior para operar em resolução mais alta.
import csi
import time
THRESHOLD = (0, 100) # Limiar em escala de cinza para objetos escuros.
BINARY_VISIBLE = True # Passe primeiro por binarização para ver sobre o que a regressão linear está sendo executada.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
clock = time.clock() # para processar um quadro às vezes.
while True:
clock.tick()
img = csi0.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else csi0.snapshot()
# Retorna um objeto de linha semelhante aos objetos de linha retornados por find_lines() e
# find_line_segments(). Você tem os atributos x1, y1, x2, y2, length,
# theta (rotação em graus), rho e magnitude.
#
# magnitude representa o quão bem a regressão linear funcionou. Em geral,
# quanto maior o valor, melhor...
line = img.get_regression([(255, 255) if BINARY_VISIBLE else THRESHOLD])
if line:
img.draw_line(line, color=127)
print(
"FPS %f, mag = %s" % (clock.fps(), str(line.magnitude) if (line) else "N/A")
)
# Sobre valores negativos de rho:
#
# Uma tupla [theta+0:-rho] é equivalente a [theta+180:+rho].