linear_regression.py
# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Пример линейной регрессии
#
# Этот пример демонстрирует, как использовать метод get_regression() на вашей камере OpenMV Cam
# для получения линейной регрессии области интереса (ROI). С помощью этого метода вы можете легко построить
# робота, который может отслеживать линии, направленные в целом в одну сторону,
# но фактически не соединённые между собой. Используйте find_blobs() для линий, которые хорошо
# соединены, чтобы получить лучшие возможности фильтрации и контроля.
#
# get_regression() выполняется за время O(N^2) относительно изображения. Чтобы это было управляемо, метод
# масштабирует исходную ROI по площади во временный буфер перед аппроксимацией линии;
# размер буфера настраивается с помощью именованного аргумента target_size=(w, h)
# (по умолчанию (80, 60)). Передайте больший кортеж, чтобы работать с более высоким разрешением.
import csi
import time
THRESHOLD = (0, 100) # Порог в градациях серого для тёмных объектов.
BINARY_VISIBLE = True # Сначала бинарный проход, чтобы увидеть, на чём выполняется линейная регрессия.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
clock = time.clock() # иногда для обработки кадра.
while True:
clock.tick()
img = csi0.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else csi0.snapshot()
# Возвращает объект линии, аналогичный объектам линий, возвращаемым find_lines() и
# find_line_segments(). Доступны атрибуты x1, y1, x2, y2, length,
# theta (угол поворота в градусах), rho и magnitude.
#
# magnitude показывает, насколько хорошо сработала линейная регрессия. В общем,
# чем больше значение, тем лучше...
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")
)
# Об отрицательных значениях rho:
#
# Кортеж [theta+0:-rho] эквивалентен [theta+180:+rho].