OpenMVを測距に利用する方法

動画チュートリアル10 - 測距と物体サイズの測定: https://singtown.com/learn/50001/
動画チュートリアル33 - ToF光学測距: https://singtown.com/learn/50539/
  • 1つ目の方法:\ AprilTagを利用する方法です。AprilTagは3D位置測定を行うことができます。具体的な実装方法については、以下のチュートリアルを参照してください。\ http://book.openmv.cc/image/apriltag.html

  • 2つ目の方法:\ OpenMVは単眼カメラを使用しています。距離測定を行うには、基準となる物体を選び、その物体のサイズ比を用いて距離を算出する必要があります。

このセクションでは2つ目の方法、すなわちカメラに映るピンポン球のサイズから、カメラとピンポン球の間の距離を計算する方法を紹介します。

よく知られているように、ピンポン球がカメラから遠ざかるほど、カメラに映るピンポン球のサイズは小さくなります。では、この関係はどのようなものでしょうか?\ 両者の関係はどうなっているのでしょうか?\ (注:ここで扱う幾何学の問題は、高校数学の三角関数の範囲にとどまります。読みたくない場合は、結論だけを見ていただいても構いません)

問題を単純化するために、次の図を見てみましょう。\

左側のカメラ内の幾何学的関係から、次のことがわかります。

したがって(式1)が成り立ちます。

右側の実環境における幾何学的関係から、次のことがわかります。

(式1)を代入すると、(結論の式)が得られます。

以上が、最終的に求めたかった関係です!\ これはどういう意味でしょうか?\ 等号の左辺のLmは長さであり、Bpixはカメラ内でボールが占めるピクセル数(直径のピクセル数)です。等号の右辺のRmはボールの実際の半径、Apixは固定のピクセル値、aは視野角の半分です。\ つまり!つまり!つまり!つまり!つまり!つまり!つまり!\ この式が示しているのは、次のことです。

実際の長さはカメラ内のピクセル数に反比例する

単純化すると、

距離 = ある定数 / 直径のピクセル数

さて、この関係がわかったところで、実にエレガントでシンプルですね!\ 具体的な手順としては、まずこの定数の値を測定します。方法は簡単で、まずボールをカメラから10cm離した状態で、カメラに映る直径のピクセル値を出力し、それに距離を掛け合わせることでkの値を得ます!

その後は、距離 = この定数 / カメラ内のピクセル数、という式で計算できるので非常に簡単です。

以下はOpenMVのコードです。

# Measure the distance
#
# この例は、画像内のサイズから距離を測定する方法を示しています。
# 特にこの例では、黄色いピンポン球を対象としています。

import csi, image, time
csi0 = csi.CSI()

# カラートラッキングを確実に機能させるには、非常に、非常に、
# 照明環境が一定に制御された状態が理想的です…
yellow_threshold   = ( 56,   83,    5,   57,   63,   80)
# 緑色の物体を追跡するには、上記の設定を調整する必要があるかもしれません…
# フレームバッファ内の領域を選択して、色設定をコピーしてください。

csi0.reset() # カメラセンサーを初期化します。
csi0.pixformat(csi.RGB565) # RGB565を使用します。
csi0.framesize(csi.QQVGA) # 高速化のためQQVGAを使用します。
csi0.snapshot(frames=10) # 新しい設定を反映させます。
csi0.auto_whitebal(False) # オフにします。
clock = time.clock() # FPSを計測します。

K=5000#この値は実測する必要があります

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

    blobs = img.find_blobs([yellow_threshold])
    if len(blobs) == 1:
        # ブロブの周囲に矩形を描画します。
        b = blobs[0]
        img.draw_rectangle(b[0:4]) # 矩形
        img.draw_cross((b[5], b[6])) # 中心 (cx, cy)
        Lm = (b[2]+b[3])/2
        length = K/Lm
        print(length)

    #print(clock.fps()) # 補足: コンピュータに接続している間、OpenMV Camの動作速度は
    # 約半分になります。接続を外すとFPSは向上します。

結果は次のようになり、距離がシリアルポート経由で出力されます。

results matching ""

    No results matching ""