absolute-rotation-scale.py

# Ce travail est publié sous licence MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tous droits réservés.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Flux optique absolu - Rotation/Échelle
#
# Cet exemple montre comment utiliser votre OpenMV Cam pour mesurer
# la rotation/l'échelle en comparant l'image actuelle et une
# précédente. Notez que seules la rotation et l'échelle sont
# gérées, et non la translation X et Y dans ce mode.
#
# Pour exécuter cette démonstration efficacement, veuillez monter votre OpenMV Cam sur une
# base stable et faire tourner LENTEMENT la caméra autour de l'objectif, puis la déplacer
# vers l'avant/l'arrière pour voir les chiffres changer.
# C'est-à-dire uniquement des changements dans la direction Z.
#
# REMARQUE : vous devez utiliser une petite résolution puissance de 2 lorsque vous utilisez
# find_displacement(). En effet, l'algorithme repose sur
# un mécanisme appelé corrélation de phase, qui effectue la comparaison d'images
# à l'aide de FFT. Une résolution qui n'est pas une puissance de 2 nécessite un remplissage jusqu'à une puissance
# de 2, ce qui réduit l'utilité des résultats de l'algorithme. Veuillez
# utiliser une résolution telle que B64X64 ou B64X32 (2x plus rapide).
#
# Votre OpenMV Cam prend en charge les résolutions puissance de 2 de 64x32, 64x64,
# 128x64 et 128x128. Si vous souhaitez une résolution de 32x32, vous pouvez la créer
# en effectuant « img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA) » sur une image 64x64.

import csi
import image
import time
import math

csi0 = csi.CSI()
csi0.reset()  # Réinitialiser et initialiser le capteur.
csi0.pixformat(csi.RGB565)  # Définir le format de pixel sur RGB565 (ou GRAYSCALE)
csi0.framesize((64, 64))  # Définir la taille d'image sur 64x64... (ou 64x32)...
csi0.snapshot(time=2000)  # Attendre que les réglages prennent effet.
clock = time.clock()  # Créer un objet horloge pour suivre le FPS.

# Créer un second tampon d'image sur le tas.
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())

while True:
    clock.tick()  # Suivre les millisecondes écoulées entre les snapshots().
    img = csi0.snapshot()  # Prendre une photo et renvoyer l'image.

    # Cet algorithme est difficile à tester sans un montage parfait... Voici donc une astuce pour vérifier qu'il fonctionne.
    # Indiquez une valeur z_rotation ci-dessous et vous devriez voir la sortie r égale à celle-ci.
    if 0:
        expected_rotation = 20.0
        img.rotation_corr(z_rotation=expected_rotation)

    # Cet algorithme est difficile à tester sans un montage parfait... Voici donc une astuce pour vérifier qu'il fonctionne.
    # Indiquez une valeur de zoom ci-dessous et vous devriez voir la sortie z égale à celle-ci.
    if 0:
        expected_zoom = 0.8
        img.rotation_corr(zoom=expected_zoom)

    # Pour cet exemple, nous ne mettons jamais à jour l'ancienne image afin de mesurer le changement absolu.
    displacement = extra_fb.find_displacement(img, logpolar=True)

    # Les résultats de décalage sont bruités sans filtrage, nous sacrifions donc un peu de précision.
    rotation_change = int(math.degrees(displacement.rotation) * 5) / 5.0
    zoom_amount = displacement.scale

    if (
        displacement.response > 0.1
    ):  # En dessous d'environ 0,1 (les résultats peuvent varier), les résultats ne sont que du bruit.
        print(
            "{0:+f}r {1:+f}z {2} {3} FPS".format(
                rotation_change, zoom_amount, displacement.response, clock.fps()
            )
        )
    else:
        print(clock.fps())

results matching ""

    No results matching ""