linear_regression.py
# Esta obra está licenciada bajo la licencia MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos los derechos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Ejemplo de regresión lineal
#
# Este ejemplo muestra cómo usar el método get_regression() en su OpenMV Cam
# para obtener la regresión lineal de una ROI. Con este método puede construir fácilmente
# un robot que pueda seguir líneas que apuntan todas en la misma dirección general
# pero que en realidad no están conectadas. Use find_blobs() en líneas que estén bien
# conectadas para obtener mejores opciones de filtrado y control.
#
# get_regression() se ejecuta en tiempo O(N^2) sobre la imagen. Para mantenerlo manejable,
# escala por área la ROI de origen a un búfer temporal antes de ajustar la línea;
# el tamaño del búfer es configurable mediante el argumento con nombre target_size=(w, h)
# (por defecto (80, 60)). Pase una tupla mayor para operar a mayor resolución.
import csi
import time
THRESHOLD = (0, 100) # Umbral de escala de grises para cosas oscuras.
BINARY_VISIBLE = True # Primero un paso binario para ver sobre qué se está ejecutando la regresión lineal.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
clock = time.clock() # procesar un fotograma a veces.
while True:
clock.tick()
img = csi0.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else csi0.snapshot()
# Devuelve un objeto línea similar a los objetos línea devueltos por find_lines() y
# find_line_segments(). Tiene x1, y1, x2, y2, length,
# theta (rotación en grados), rho y magnitude como atributos.
#
# magnitude representa qué tan bien funcionó la regresión lineal. En general,
# cuanto mayor sea el valor, mejor...
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 los valores negativos de rho:
#
# Una tupla [theta+0:-rho] es igual a [theta+180:+rho].