回答編集履歴

3

修正

2020/07/01 07:13

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -68,8 +68,6 @@
68
68
 
69
69
 
70
70
 
71
- # 使用した動画 https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi
72
-
73
71
  cap = cv2.VideoCapture("vtest.avi")
74
72
 
75
73
  width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
@@ -104,17 +102,23 @@
104
102
 
105
103
 
106
104
 
107
- frame[roi == 0] = 0
105
+ # roi に基づき、検出対象外の画素を黒にする
108
106
 
107
+ masked_frame = frame.copy()
109
108
 
109
+ masked_frame[roi == 0] = 0
110
110
 
111
+ # 背景差分結果
112
+
111
- fgmask = model.apply(frame)
113
+ fgmask = model.apply(masked_frame)
112
114
 
113
115
 
114
116
 
115
117
  # 検出領域をわかりやすいように可視化
116
118
 
117
119
  cv2.circle(frame, (cx, cy), 200, (0, 0, 255), 2)
120
+
121
+ cv2.circle(masked_frame, (cx, cy), 200, (0, 0, 255), 2)
118
122
 
119
123
  cv2.circle(fgmask, (cx, cy), 200, 255, 2)
120
124
 
@@ -124,6 +128,8 @@
124
128
 
125
129
  cv2.imshow("frame", fgmask)
126
130
 
131
+ cv2.imshow("masked_frame", masked_frame)
132
+
127
133
  cv2.waitKey(wait_secs)
128
134
 
129
135
 
@@ -132,6 +138,8 @@
132
138
 
133
139
  cv2.destroyAllWindows()
134
140
 
141
+
142
+
135
143
  ```
136
144
 
137
145
 

2

修正

2020/07/01 07:12

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- 参考 [OpenCV - 背景差分で物体を検出する方法について - pystyle]
53
+ 参考 [OpenCV - 背景差分で物体を検出する方法について - pystyle](https://pystyle.info/opencv-background-substraction/)
54
54
 
55
55
 
56
56
 
@@ -136,4 +136,4 @@
136
136
 
137
137
 
138
138
 
139
- ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)(https://pystyle.info/opencv-background-substraction/)
139
+ ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)

1

修正

2020/07/01 06:59

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -43,3 +43,97 @@
43
43
 
44
44
 
45
45
  ピクセル単位で検出対象の画素とそうでない画素を定義するので、Q3の問題は発生しません。
46
+
47
+
48
+
49
+ ## サンプル
50
+
51
+
52
+
53
+ 参考 [OpenCV - 背景差分で物体を検出する方法について - pystyle]
54
+
55
+
56
+
57
+ 今回は簡単な例として、検出範囲を円とした場合のサンプルを記載しました。
58
+
59
+ 「検出対象の画素が255、そうでない画素は0のマスクを作成する」部分は質問者さんのほうで適宜変更してください。
60
+
61
+
62
+
63
+ ```python
64
+
65
+ import cv2
66
+
67
+ import numpy as np
68
+
69
+
70
+
71
+ # 使用した動画 https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi
72
+
73
+ cap = cv2.VideoCapture("vtest.avi")
74
+
75
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
76
+
77
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
78
+
79
+ wait_secs = int(1000 / cap.get(cv2.CAP_PROP_FPS))
80
+
81
+
82
+
83
+ model = cv2.bgsegm.createBackgroundSubtractorMOG()
84
+
85
+
86
+
87
+ # 検出対象の画素が255、そうでない画素は0の roi を定義する。
88
+
89
+ roi = np.zeros((height, width), dtype=np.uint8)
90
+
91
+ cx, cy = width // 2, height // 2
92
+
93
+ cv2.circle(roi, (cx, cy), 200, 255, -1)
94
+
95
+
96
+
97
+ while True:
98
+
99
+ ret, frame = cap.read()
100
+
101
+ if not ret:
102
+
103
+ break
104
+
105
+
106
+
107
+ frame[roi == 0] = 0
108
+
109
+
110
+
111
+ fgmask = model.apply(frame)
112
+
113
+
114
+
115
+ # 検出領域をわかりやすいように可視化
116
+
117
+ cv2.circle(frame, (cx, cy), 200, (0, 0, 255), 2)
118
+
119
+ cv2.circle(fgmask, (cx, cy), 200, 255, 2)
120
+
121
+
122
+
123
+ cv2.imshow("fgmask", frame)
124
+
125
+ cv2.imshow("frame", fgmask)
126
+
127
+ cv2.waitKey(wait_secs)
128
+
129
+
130
+
131
+ cap.release()
132
+
133
+ cv2.destroyAllWindows()
134
+
135
+ ```
136
+
137
+
138
+
139
+ ![イメージ説明](95799578ef4f27ee426d7ae1f385bd85.png)(https://pystyle.info/opencv-background-substraction/)