image-patches-differential-translation.py

# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Дифференциальный оптический поток по фрагментам изображения: смещение
#
# Этот пример демонстрирует использование камеры OpenMV Cam для измерения смещения
# по осям X и Y путём сравнения текущего и предыдущего
# изображений друг с другом. Обратите внимание, что обрабатывается только смещение по X и Y
# — а не поворот/масштаб в этом режиме.
#
# Однако этот пример выходит за рамки простого вычисления оптического потока по всему
# изображению сразу. Вместо этого процесс разбивается на работу с группами
# пикселей изображения. Это даёт вам «новое» изображение результатов.
#
# ОБРАТИТЕ ВНИМАНИЕ: поверхности должны иметь какой-либо тип «края», чтобы
# алгоритм работал. Поверхность без особенностей даёт странные результаты.
#
# Для эффективного запуска этой демонстрации закрепите камеру OpenMV Cam на устойчивом
# основании и МЕДЛЕННО перемещайте её влево, вправо, вверх и вниз, и
# наблюдайте за изменением чисел. Обратите внимание, что значения смещения видны
# в пределах +- половины горизонтального и вертикального разрешения.
#
# ОБРАТИТЕ ВНИМАНИЕ: при использовании
# find_displacement() необходимо использовать небольшое разрешение, кратное степени двойки. Это связано с тем, что в основе алгоритма лежит
# метод, называемый фазовой корреляцией, который выполняет сравнение изображений
# с использованием БПФ. Разрешение, не являющееся степенью двойки, требует дополнения до степени
# двойки, что снижает полезность результатов алгоритма. Пожалуйста,
# используйте разрешение вроде B128X128 или B128X64 (в 2 раза быстрее).
#
# Ваша камера OpenMV Cam поддерживает разрешения, кратные степени двойки: 64x32, 64x64,
# 128x64 и 128x128. Если вам нужно разрешение 32x32, вы можете получить его,
# выполнив "img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)" на изображении 64x64.

import csi
import image
import time

BLOCK_W = 16  # pow2
BLOCK_H = 16  # pow2

csi0 = csi.CSI()
csi0.reset()  # Сброс и инициализация датчика.
csi0.pixformat(csi.GRAYSCALE)  # Установите формат пикселей в GRAYSCALE
csi0.framesize((128, 128))  # Установите размер кадра 128x128... (или 64x64)...
csi0.snapshot(time=2000)  # Подождать, пока настройки вступят в силу.
clock = time.clock()  # Создать объект clock для отслеживания FPS.

# Создайте второй буфер кадра в куче.
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())

while True:
    clock.tick()  # Отслеживание количества миллисекунд, прошедших между snapshots().
    img = csi0.snapshot()  # Сделать снимок и вернуть изображение.

    for y in range(0, csi0.height(), BLOCK_H):
        for x in range(0, csi0.width(), BLOCK_W):
            displacement = extra_fb.find_displacement(
                img, roi=(x, y, BLOCK_W, BLOCK_H), template_roi=(x, y, BLOCK_W, BLOCK_H)
            )

            # Ниже примерно 0.1 (может отличаться) результаты — это просто шум.
            if displacement.response > 0.1:
                pixel_x = x + (BLOCK_W // 2) + int(displacement.x_translation)
                pixel_y = y + (BLOCK_H // 2) + int(displacement.y_translation)
                img.draw_line(
                    (x + BLOCK_W // 2, y + BLOCK_H // 2, pixel_x, pixel_y), color=255
                )
            else:
                img.draw_line(
                    (
                        x + BLOCK_W // 2,
                        y + BLOCK_H // 2,
                        x + BLOCK_W // 2,
                        y + BLOCK_H // 2,
                    ),
                    color=0,
                )
    extra_fb.draw_image(img)

    print(clock.fps())

results matching ""

    No results matching ""