absolute-rotation-scale.py

# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 絶対オプティカルフロー 回転/スケール
#
# この例では、OpenMV Camを使って
# 現在の画像と直前の画像を比較することで回転/スケールを計測します
# 回転/スケールのみが扱われ、
# このモードではX・Y方向の平行移動は扱われません。
#
# このデモを効果的に実行するには、OpenMV Camを安定した
# 台に固定し、レンズを中心にゆっくりとカメラを回転させたり、前後に
# 動かしたりして数値の変化を確認してください。
# つまりZ方向のみの変化です。
#
# 注意: find_displacement()を使用する場合は、小さい2のべき乗の
# 解像度を使用する必要があります。これは、このアルゴリズムが
# 位相相関と呼ばれる手法によって動作しており、FFTを使って
# 画像比較を行うためです。2のべき乗でない解像度は、2のべき乗に
# パディングする必要があり、アルゴリズムの結果の有用性が低下します。
# B64X64やB64X32(2倍高速)のような解像度を使用してください。
#
# OpenMV Camは64x32、64x64、128x64、128x128の
# 2のべき乗解像度に対応しています。32x32の解像度が必要な場合は、
# 64x64画像に対して"img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)"を実行することで作成できます。

import csi
import image
import time
import math

csi0 = csi.CSI()
csi0.reset()  # センサーをリセットして初期化します。
csi0.pixformat(csi.RGB565)  # ピクセルフォーマットをRGB565(またはGRAYSCALE)に設定します
csi0.framesize((64, 64))  # フレームサイズを64x64(または64x32)に設定します……
csi0.snapshot(time=2000)  # 設定が反映されるまで待ちます。
clock = time.clock()  # FPSを計測するためのclockオブジェクトを作成します。

# ヒープ上に2つ目のフレームバッファを作成します。
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())

while True:
    clock.tick()  # snapshot()呼び出し間の経過ミリ秒を計測します。
    img = csi0.snapshot()  # 画像を撮影して返します。

    # このアルゴリズムは完璧な治具なしではテストが難しいものです……そこで、動作確認用の簡単な方法を紹介します。
    # 以下にz_rotationの値を入力すると、出力のrがその値と等しくなるはずです。
    if 0:
        expected_rotation = 20.0
        img.rotation_corr(z_rotation=expected_rotation)

    # このアルゴリズムは完璧な治具なしではテストが難しいものです……そこで、動作確認用の簡単な方法を紹介します。
    # 以下にzoomの値を入力すると、出力のzがその値と等しくなるはずです。
    if 0:
        expected_zoom = 0.8
        img.rotation_corr(zoom=expected_zoom)

    # この例では、絶対的な変化を計測するために古い画像を更新しません。
    displacement = extra_fb.find_displacement(img, logpolar=True)

    # オフセット結果はフィルタリングしないとノイズが多いため、精度を多少犠牲にします。
    rotation_change = int(math.degrees(displacement.rotation) * 5) / 5.0
    zoom_amount = displacement.scale

    if (
        displacement.response > 0.1
    ):  # 0.1程度を下回ると(環境によります)、結果は単なるノイズになります。
        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 ""