2021年8月14日土曜日

Raspberry Pi 上でOpenCVを動かす

OpenCVを使うことで、いろいろな画像処理が簡単にプログラムできるということで、Raspberry Piを引っ張り出してきて試してみました。下の写真は、Youtubeにある渋谷交差点のライブ映像をリアルタイムで引っ張ってきて、動いている物体を抽出表示したものです。プログラムはhitomatagiさんのページを参考にさせていただきました。ありがとうございます。歩いている人々が移動物体として抽出されています。

 

こんな簡単なプログラムで出来るとは、恐るべしOpenCV。 

# coding: utf-8

import cv2
import numpy as np
import pafy
import imutils

# 定数定義
ESC_KEY = 27     # Escキー
INTERVAL= 33     # インターバル
FRAME_RATE = 30  # fps

WINDOW_ORG = "org"
WINDOW_BACK = "back"
WINDOW_DIFF = "diff"

# ウィンドウの準備
cv2.namedWindow(WINDOW_ORG)
cv2.namedWindow(WINDOW_BACK)
cv2.namedWindow(WINDOW_DIFF)

#url = "https://www.youtube.com/watch?v=mEx0DiQcOQw"
url = "https://www.youtube.com/watch?v=8QX0uwJpBW4"
ytube = pafy.new( url )
best = ytube.getbest( preftype="mp4" )
mov_org = cv2.VideoCapture( best.url )

# 最初のフレーム読み込み
has_next, o_frame = mov_org.read()
i_frame = imutils.resize( o_frame, width=640 )

# 背景フレーム
back_frame = np.zeros_like(i_frame, np.float32)

# 変換処理ループ
while has_next == True:
    # 入力画像を浮動小数点型に変換
    f_frame = i_frame.astype(np.float32)

    # 差分計算
    diff_frame = cv2.absdiff(f_frame, back_frame)
    # 背景の更新
    #cv2.accumulateWeighted(f_frame, back_frame, 0.025)
    cv2.accumulateWeighted(f_frame, back_frame, 0.01)

    # フレーム表示
    cv2.imshow(WINDOW_ORG, i_frame)
    cv2.imshow(WINDOW_BACK, back_frame.astype(np.uint8))
    cv2.imshow(WINDOW_DIFF, diff_frame.astype(np.uint8))

    # Escキーで終了
    key = cv2.waitKey(INTERVAL)
    if key == ESC_KEY:
        break

    # 次のフレーム読み込み
    has_next, o_frame = mov_org.read()
    i_frame = imutils.resize( o_frame, width=640 )

# 終了処理
cv2.destroyAllWindows()
mov_org.release()


0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

WSJT-X 2.7.0-rc3 公開

 WSJT-X 2.7.0-rc3 リリースノート 2024年1月1日 WSJT-X 2.7.0-rc3では、いくつかの新しい機能、たくさんの強化改善、バグの修正を行いました。 「Hamlib更新」機能追加。Windows版では、WSJT-Xから直接Hamlibを更新することがで...