linear_regression.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 線形回帰の例
#
# この例は、OpenMV Cam で get_regression() メソッドを使用する方法を示します
# 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] と同じです。