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"
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)
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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。