【iPadでプログラミング】OpenCVで移動体検出!

iPadでOpenCVが使えることは前回の通りです。今回はiPadでOpenCVを活用した移動体検出を行ってみたいと思います。

前回記事は下記からご覧ください。

開発環境

今回も使うアプリはPytoです。

ダウンロードは無料ですが、3日間の試用期間が終わるとFull版かLite版を購入しないと何もできなくなります。

  • Full版・・・文字通り全機能が使える
  • Lite版・・・基本機能のみ。NumpyやPandasといった必須とも言える外部モジュールが使えない

今回のような画像系を扱うようになるとNumpyやPandasを使うようになるので、初めからFull版を購入するのが良いでしょう。

Pytoのプランごとの違い

出来上がりイメージ

今回作成するアプリを動かすと下記のようになります(動画)。渋谷のスクランブル交差点をYoutubeで再生したものを移動体検出したのですが、それなりに検出できています。
動画を見ると背景部分が浮き上がって見えますが、これはYoutubeの動画をiPadで撮影しているので、オートフォーカスが動作して背景に微妙な違いが生まれるためです。あと、手持ちで撮影したことも影響しているかもしれません汗

ソースコード

下記が実際に動かしたソースコードです。基本的なところはQRコード読み取りの例と同じで、大きな違いはcv2.absdiff()を呼び出しているところです。absdiff()は2つの配列の要素毎の差の絶対値を求めるものです。つまり2つの画像の差分を求めることができるので、動体を検出することができるというわけです。

import cv2
import time


font = cv2.FONT_HERSHEY_SIMPLEX
device = 0 # Back camera

bg = None
cnt = 0

cap = cv2.VideoCapture(device)
while cap.isOpened:
    try:
        ret, frame = cap.read()
        # 1フレーム目が読み取れないことがある
        if not ret:
            continue
        
        img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        if bg is None:
            bg = img_gray
            
        mask = cv2.absdiff(img_gray, bg)
        
        # 差分画像を二値化してマスク画像を算出
        mask[mask < 30] = 0
        mask[mask >= 30] = 255

        cv2.imshow('image', mask)
        
        cnt += 1
        if cnt >= 50:
            cnt = 0
            bg = img_gray
        
        time.sleep(0.05)

    except:
        break

cap.release()

最後に

OpenCVを使うことで、iPadの可能性が格段に広がるように思います。プログラミンをするのにも、iPadだけでなくとも活用できる知識が身につくので、手軽に使えるiPadで本格的プログラミングを初めてみても面白そうです。

画像処理を始めると、ものづくりの楽しさがグッと理解できるような気がして楽しいですね。それでは、また。

Twitterでフォローしよう

Pickup
おすすめの記事