find_lines.py
# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Пример поиска линий
#
# Этот пример демонстрирует, как находить линии на изображении. Для каждого объекта линии,
# найденного на изображении, возвращается объект линии, который включает угол её поворота.
# Примечание: обнаружение линий выполняется с помощью преобразования Хафа:
# http://en.wikipedia.org/wiki/Hough_transform
# Пожалуйста, прочитайте об этом по ссылке выше, чтобы узнать подробнее о том, что такое `theta` и `rho`.
# find_lines() находит линии бесконечной длины. Используйте find_line_segments() для поиска конечных линий.
import csi
import time
ENABLE_LENS_CORR = False # включите для более прямых линий...
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565) # градации серого работают быстрее
csi0.framesize(csi.QQVGA)
csi0.snapshot(time=2000)
clock = time.clock()
# У всех объектов линий есть атрибут `theta` для получения угла поворота в градусах.
# Вы можете фильтровать линии по углу их поворота.
min_degree = 0
max_degree = 179
# У всех линий также есть атрибуты `x1`, `y1`, `x2` и `y2` для получения координат их конечных точек.
# Объекты линий можно передавать напрямую в `draw_line()`.
while True:
clock.tick()
img = csi0.snapshot()
if ENABLE_LENS_CORR:
img.lens_corr(1.8) # для объектива 2,8 мм...
# `threshold` управляет количеством найденных на изображении линий. Обнаруживаются только линии с
# суммой величин разности краёв больше `threshold`...
# Подробнее о `threshold` — каждый пиксель изображения вносит значение величины
# в линию. Сумма всех вкладов — это величина для данной линии. Затем,
# при объединении линий их величины складываются. Обратите внимание, что `threshold`
# отфильтровывает линии с низкими величинами перед объединением. Чтобы увидеть величину
# необъединённых линий, установите `theta_margin` и `rho_margin` в 0...
# `theta_margin` и `rho_margin` управляют объединением похожих линий. Если разница значений theta и rho
# двух линий меньше заданных допусков, они объединяются.
for l in img.find_lines(threshold=1000, theta_margin=25, rho_margin=25):
if (min_degree <= l.theta) and (l.theta <= max_degree):
img.draw_line(l, color=(255, 0, 0))
# print(l)
print("FPS %f" % clock.fps())
# Об отрицательных значениях rho:
#
# Кортеж [theta+0:-rho] эквивалентен [theta+180:+rho].