find_lines.py
# この作品はMITライセンスの下で提供されています。
# Copyright (c) 2013-2023 OpenMV LLC. 全著作権所有。
# 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.8mm レンズの場合...
# `threshold` は画像内で検出されるラインの数を制御します。
# エッジ差分の大きさの合計が `threshold` より大きいラインのみが検出されます...
# `threshold` についての補足 - 画像内の各ピクセルは、あるラインに対して
# 大きさの値を寄与します。すべての寄与の合計がそのラインの大きさとなります。そして
# ラインが結合されると、それらの大きさが合算されます。`threshold` は
# 結合前に大きさの小さいラインを除外することに注意してください。結合されていない
# ラインの大きさを見るには、`theta_margin` と `rho_margin` を 0 に設定します...
# `theta_margin` と `rho_margin` は類似したラインの結合を制御します。2 本のラインの
# 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] と同じです。