10-9Background.py

000: import cv2
001: import numpy as np
002:
003: def __main():
004: cap = cv2.VideoCapture(“MVI_1592.MP4”)
005:
006: if not cap.isOpened(): # ビデオキャプチャー可能か判断
007: print(“Not Opened Video Camera”)
008: exit()
009:
010: while True:
011: ret, img = cap.read()
012: img = getResize(img)
013: org = img
014: if not ret: # キャプチャー画像取得に失敗したら終了
015: print(“Video Capture Err”)
016: break
017:
018: subImg = getBackgroundSubMog(org, img)
019: cv2.imshow(‘bugs’, subImg)
020: # cv2.imshow(‘Final result’, org)
021: if cv2.waitKeyEx(10) > -1:
022: break
023: cv2.destroyAllWindows()
024: def getResize(img):
025: basePixSize = 1280 # 縦横で大きい辺の変更したいサイズ
026: height = img.shape[0]
027: width = img.shape[1]
028:
029: largeSize = max(height, width) # 大きい方の辺のサイズ
030: resizeRate = basePixSize / largeSize # 変更比率を計算
031: img = cv2.resize(img, (int(width * resizeRate), int(height * resizeRate)))
032:
033: return img
034:
035: def getBackgroundSubMog(org, img):
036: global fgbg
037: # 背景差分フィルター実行
038: # 戻り値には2値化されて差分が白で表現された画像が戻る
039: subImg = fgbg.apply(img)
040: contours, hierarchy = cv2.findContours(image=subImg, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE)
041: contours = list(filter(lambda x: cv2.contourArea(x) > 100, contours)) # 小さい輪郭は誤検出として削除する
042: resultImg = cv2.drawContours(image=org, contours=contours, contourIdx=-1, color=(0, 0, 255), thickness=2) # 輪郭の描画
043:
044: return resultImg
045:
046: if __name__ == ‘__main__’:
047: print(cv2.__version__)
048:
049: # 背景差分のフィルター作成
050: fgbg = cv2.bgsegm.createBackgroundSubtractorMOG(history=120)
051: __main()