取得した画像の指定範囲のみに画像処理してみます。
今回は動画の指定範囲内の動体検知を実施するサンプルを作成しました。
下記の投稿に範囲を指定する処理を追加する形としました。
概要
OpenCVでは画像は行列として扱われる為、frame[ymin:ymax,xmin:xmax]という風にすることで座標(xmin,ymin)から(xmax,ymax)までの範囲を指定できます。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import cv2 #認識範囲 xmin,xmax = 240,440 ymin,ymax = 120,360 # 動画読み込みの設定 #movie = cv2.VideoCapture('motion_in.mp4') movie = cv2.VideoCapture(0) # 背景差分の設定 fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() # 背景オブジェクト # ファイルからフレームを1枚ずつ取得して動画処理後に保存する while True: ret, frame = movie.read() # フレーム取得 # フレームが取得できない場合はループを抜ける if not ret: break detframe = frame[ymin:ymax,xmin:xmax] # 背景差分する範囲を指定 cv2.rectangle(frame,(xmin,ymin),(xmax,ymax),(0,0,255),2) # 指定範囲に赤枠 fgmask = fgbg.apply(detframe) # 前景領域のマスクを取得 moment = cv2.countNonZero(fgmask) # 動体検知した画素数を取得 text = 'Motion:' + str(moment) font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame,text,(20,400),font,1,(0,255,0),2,cv2.LINE_AA) #フレームに表示 cv2.imshow('frame',frame) cv2.waitKey(1) # 撮影用オブジェクトとウィンドウの解放 movie.release() |
4,5行目:範囲を指定
20行目:frameから指定範囲のみトリミングしdetframeを作成
21行目:指定範囲に赤枠をつける
23行目:detframeに対し背景差分処理→指定範囲のみの動体検知
結果
赤枠の範囲の時だけ動体検知できました。