回答編集履歴

2

a

2018/10/12 05:22

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -75,3 +75,77 @@
75
75
  cv2.destroyAllWindows()
76
76
 
77
77
  ```
78
+
79
+
80
+
81
+ ## 追記
82
+
83
+
84
+
85
+ おそらく原因がわかりました。
86
+
87
+ グローバル変数で avi = cv2.VideoWriter() としたあと、init_avi() 内で `avi = cv2.VideoWriter(aviname, fourcc, fps, (size_width, size_height))` としていますが、これはローカル変数のため、関数を抜けた段階で破棄されます。
88
+
89
+ グローバル変数の avi に代入されているわけではありません。
90
+
91
+
92
+
93
+ 関数内でグローバル変数に代入する場合は global avi とする必要があります。
94
+
95
+ [こちらの記事](http://ama-ch.hatenablog.com/entry/20080723/1216772273) で言語仕様を確認してください。
96
+
97
+
98
+
99
+ そのあと、process_image() 内で avi を参照したときは、グローバル変数の `avi = cv2.VideoWriter()` を参照しています。
100
+
101
+ そのため、動画は出力されません。
102
+
103
+ `print(avi)` でオブジェクトの ID を確認してみてください。
104
+
105
+
106
+
107
+ 実証コード
108
+
109
+
110
+
111
+ ```python
112
+
113
+ import datetime
114
+
115
+
116
+
117
+ import cv2
118
+
119
+
120
+
121
+ avi = cv2.VideoWriter()
122
+
123
+ print(avi) # <VideoWriter 0000016D5B99CAD0>
124
+
125
+
126
+
127
+ def init_avi():
128
+
129
+ aviname = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S.avi")
130
+
131
+ fourcc = cv2.VideoWriter_fourcc(*"DIVX")
132
+
133
+ avi = cv2.VideoWriter("output.avi", fourcc, 30., (1280, 1024))
134
+
135
+ print(avi) # <VideoWriter 0000016D5E1BF1B0>
136
+
137
+
138
+
139
+
140
+
141
+ def func():
142
+
143
+ print(avi) # <VideoWriter 0000016D5B99CAD0>
144
+
145
+
146
+
147
+ init_avi()
148
+
149
+ func()
150
+
151
+ ```

1

2018/10/12 05:22

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -11,3 +11,67 @@
11
11
 
12
12
 
13
13
  image の型は image.dtype で uint8 になっていることを確認してください。
14
+
15
+
16
+
17
+ ----
18
+
19
+
20
+
21
+ ## 追記
22
+
23
+
24
+
25
+ VideoWriter がそもそも使えるのか確認してみてはどうでしょうか
26
+
27
+
28
+
29
+ [vtest.avi](https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi)
30
+
31
+
32
+
33
+ ```python
34
+
35
+ import cv2
36
+
37
+
38
+
39
+ # Video Reader を作成
40
+
41
+ cap = cv2.VideoCapture('vtest.avi')
42
+
43
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
44
+
45
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
46
+
47
+ fps = cap.get(cv2.CAP_PROP_FPS)
48
+
49
+
50
+
51
+ # Video Writer を作成
52
+
53
+ fourcc = cv2.VideoWriter_fourcc(*'DIVX')
54
+
55
+ writer = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
56
+
57
+
58
+
59
+ while True:
60
+
61
+ ret, frame = cap.read()
62
+
63
+ if not ret:
64
+
65
+ break
66
+
67
+ writer.write(frame)
68
+
69
+
70
+
71
+ writer.release()
72
+
73
+ cap.release()
74
+
75
+ cv2.destroyAllWindows()
76
+
77
+ ```