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

回答編集履歴

2

a

2018/10/12 05:22

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -36,4 +36,41 @@
36
36
  writer.release()
37
37
  cap.release()
38
38
  cv2.destroyAllWindows()
39
+ ```
40
+
41
+ ## 追記
42
+
43
+ おそらく原因がわかりました。
44
+ グローバル変数で avi = cv2.VideoWriter() としたあと、init_avi() 内で `avi = cv2.VideoWriter(aviname, fourcc, fps, (size_width, size_height))` としていますが、これはローカル変数のため、関数を抜けた段階で破棄されます。
45
+ グローバル変数の avi に代入されているわけではありません。
46
+
47
+ 関数内でグローバル変数に代入する場合は global avi とする必要があります。
48
+ [こちらの記事](http://ama-ch.hatenablog.com/entry/20080723/1216772273) で言語仕様を確認してください。
49
+
50
+ そのあと、process_image() 内で avi を参照したときは、グローバル変数の `avi = cv2.VideoWriter()` を参照しています。
51
+ そのため、動画は出力されません。
52
+ `print(avi)` でオブジェクトの ID を確認してみてください。
53
+
54
+ 実証コード
55
+
56
+ ```python
57
+ import datetime
58
+
59
+ import cv2
60
+
61
+ avi = cv2.VideoWriter()
62
+ print(avi) # <VideoWriter 0000016D5B99CAD0>
63
+
64
+ def init_avi():
65
+ aviname = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S.avi")
66
+ fourcc = cv2.VideoWriter_fourcc(*"DIVX")
67
+ avi = cv2.VideoWriter("output.avi", fourcc, 30., (1280, 1024))
68
+ print(avi) # <VideoWriter 0000016D5E1BF1B0>
69
+
70
+
71
+ def func():
72
+ print(avi) # <VideoWriter 0000016D5B99CAD0>
73
+
74
+ init_avi()
75
+ func()
39
76
  ```

1

2018/10/12 05:22

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -4,4 +4,36 @@
4
4
  codec = "DIVX"
5
5
  ```
6
6
 
7
- image の型は image.dtype で uint8 になっていることを確認してください。
7
+ image の型は image.dtype で uint8 になっていることを確認してください。
8
+
9
+ ----
10
+
11
+ ## 追記
12
+
13
+ VideoWriter がそもそも使えるのか確認してみてはどうでしょうか
14
+
15
+ [vtest.avi](https://github.com/opencv/opencv/raw/master/samples/data/vtest.avi)
16
+
17
+ ```python
18
+ import cv2
19
+
20
+ # Video Reader を作成
21
+ cap = cv2.VideoCapture('vtest.avi')
22
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
23
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
24
+ fps = cap.get(cv2.CAP_PROP_FPS)
25
+
26
+ # Video Writer を作成
27
+ fourcc = cv2.VideoWriter_fourcc(*'DIVX')
28
+ writer = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
29
+
30
+ while True:
31
+ ret, frame = cap.read()
32
+ if not ret:
33
+ break
34
+ writer.write(frame)
35
+
36
+ writer.release()
37
+ cap.release()
38
+ cv2.destroyAllWindows()
39
+ ```