teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2020/07/01 07:13

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -33,7 +33,6 @@
33
33
  import cv2
34
34
  import numpy as np
35
35
 
36
- # 使用した動画 https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi
37
36
  cap = cv2.VideoCapture("vtest.avi")
38
37
  width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
39
38
  height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
@@ -51,20 +50,25 @@
51
50
  if not ret:
52
51
  break
53
52
 
53
+ # roi に基づき、検出対象外の画素を黒にする
54
+ masked_frame = frame.copy()
54
- frame[roi == 0] = 0
55
+ masked_frame[roi == 0] = 0
56
+ # 背景差分結果
57
+ fgmask = model.apply(masked_frame)
55
58
 
56
- fgmask = model.apply(frame)
57
-
58
59
  # 検出領域をわかりやすいように可視化
59
60
  cv2.circle(frame, (cx, cy), 200, (0, 0, 255), 2)
61
+ cv2.circle(masked_frame, (cx, cy), 200, (0, 0, 255), 2)
60
62
  cv2.circle(fgmask, (cx, cy), 200, 255, 2)
61
63
 
62
64
  cv2.imshow("fgmask", frame)
63
65
  cv2.imshow("frame", fgmask)
66
+ cv2.imshow("masked_frame", masked_frame)
64
67
  cv2.waitKey(wait_secs)
65
68
 
66
69
  cap.release()
67
70
  cv2.destroyAllWindows()
71
+
68
72
  ```
69
73
 
70
74
  ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)

2

修正

2020/07/01 07:12

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  ## サンプル
26
26
 
27
- 参考 [OpenCV - 背景差分で物体を検出する方法について - pystyle]
27
+ 参考 [OpenCV - 背景差分で物体を検出する方法について - pystyle](https://pystyle.info/opencv-background-substraction/)
28
28
 
29
29
  今回は簡単な例として、検出範囲を円とした場合のサンプルを記載しました。
30
30
  「検出対象の画素が255、そうでない画素は0のマスクを作成する」部分は質問者さんのほうで適宜変更してください。
@@ -67,4 +67,4 @@
67
67
  cv2.destroyAllWindows()
68
68
  ```
69
69
 
70
- ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)(https://pystyle.info/opencv-background-substraction/)
70
+ ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)

1

修正

2020/07/01 06:59

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -20,4 +20,51 @@
20
20
 
21
21
  > Q3:Q2が可能だった場合、フレームからはみ出した画像処理範囲はどうなるのでしょうか?きちんと、フレームの中のみ処理を行ってくれるのでしょうか?
22
22
 
23
- ピクセル単位で検出対象の画素とそうでない画素を定義するので、Q3の問題は発生しません。
23
+ ピクセル単位で検出対象の画素とそうでない画素を定義するので、Q3の問題は発生しません。
24
+
25
+ ## サンプル
26
+
27
+ 参考 [OpenCV - 背景差分で物体を検出する方法について - pystyle]
28
+
29
+ 今回は簡単な例として、検出範囲を円とした場合のサンプルを記載しました。
30
+ 「検出対象の画素が255、そうでない画素は0のマスクを作成する」部分は質問者さんのほうで適宜変更してください。
31
+
32
+ ```python
33
+ import cv2
34
+ import numpy as np
35
+
36
+ # 使用した動画 https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi
37
+ cap = cv2.VideoCapture("vtest.avi")
38
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
39
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
40
+ wait_secs = int(1000 / cap.get(cv2.CAP_PROP_FPS))
41
+
42
+ model = cv2.bgsegm.createBackgroundSubtractorMOG()
43
+
44
+ # 検出対象の画素が255、そうでない画素は0の roi を定義する。
45
+ roi = np.zeros((height, width), dtype=np.uint8)
46
+ cx, cy = width // 2, height // 2
47
+ cv2.circle(roi, (cx, cy), 200, 255, -1)
48
+
49
+ while True:
50
+ ret, frame = cap.read()
51
+ if not ret:
52
+ break
53
+
54
+ frame[roi == 0] = 0
55
+
56
+ fgmask = model.apply(frame)
57
+
58
+ # 検出領域をわかりやすいように可視化
59
+ cv2.circle(frame, (cx, cy), 200, (0, 0, 255), 2)
60
+ cv2.circle(fgmask, (cx, cy), 200, 255, 2)
61
+
62
+ cv2.imshow("fgmask", frame)
63
+ cv2.imshow("frame", fgmask)
64
+ cv2.waitKey(wait_secs)
65
+
66
+ cap.release()
67
+ cv2.destroyAllWindows()
68
+ ```
69
+
70
+ ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)(https://pystyle.info/opencv-background-substraction/)