回答編集履歴
3
修正
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
|
-
|
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
|

|
2
修正
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
|
-

|
70
|
+

|
1
修正
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
|
+
(https://pystyle.info/opencv-background-substraction/)
|