回答編集履歴

3

d

2019/11/25 14:22

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
File without changes

2

d

2019/11/25 14:22

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -71,3 +71,161 @@
71
71
  video(output_dir)
72
72
 
73
73
  ```
74
+
75
+
76
+
77
+ ## 追記
78
+
79
+
80
+
81
+ Python ではあまりマルチスレッドをやったことがないので、やり方が間違っているかもしれませんが、以下のようにしてみてはどうでしょうか。
82
+
83
+
84
+
85
+ メインスレッド→子スレッド、子スレッド→メインスレッドの2つのキューを用意して、
86
+
87
+
88
+
89
+ 1. 「メインスレッド→子スレッドのキュー」が空ならメインスレッドから子スレッドへフレームを送る。
90
+
91
+ 2. 子スレッド側でそれを受け取り、処理して、「子スレッド→メインスレッドのキュー」で結果を送る。
92
+
93
+ 3. 「子スレッド→メインスレッドのキュー」が空でないなら、結果を受け取る。
94
+
95
+
96
+
97
+ ```python
98
+
99
+ import time
100
+
101
+ from multiprocessing import Process, Queue
102
+
103
+
104
+
105
+ import cv2
106
+
107
+
108
+
109
+
110
+
111
+ def process_frame(parent_to_child, child_to_parent):
112
+
113
+ while True:
114
+
115
+ # メインスレッドからフレームがある場合は受け取る。
116
+
117
+ frame = parent_to_child.get()
118
+
119
+ # print("recieved frame from main thread")
120
+
121
+
122
+
123
+ # なにか処理する。
124
+
125
+ time.sleep(1)
126
+
127
+
128
+
129
+ # メインスレッドへ処理した結果を送る。
130
+
131
+ # print("send result to main thread")
132
+
133
+ child_to_parent.put(frame)
134
+
135
+
136
+
137
+
138
+
139
+ def video(output_path=""):
140
+
141
+ cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
142
+
143
+
144
+
145
+ video_fourcc = cv2.VideoWriter_fourcc(*"XVID")
146
+
147
+ video_fps = int(cap.get(cv2.CAP_PROP_FPS))
148
+
149
+ video_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
150
+
151
+ video_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
152
+
153
+ out = cv2.VideoWriter(
154
+
155
+ output_path, video_fourcc, video_fps, (video_width, video_height)
156
+
157
+ )
158
+
159
+
160
+
161
+ parent_to_child = Queue()
162
+
163
+ child_to_parent = Queue()
164
+
165
+ process = Process(target=process_frame, args=(parent_to_child, child_to_parent))
166
+
167
+ process.start()
168
+
169
+
170
+
171
+ result = None
172
+
173
+ while True:
174
+
175
+ # 1フレームずつ取得する。
176
+
177
+ ret, frame = cap.read()
178
+
179
+
180
+
181
+ # メインスレッドから子スレッドへフレームを送る。
182
+
183
+ if parent_to_child.empty():
184
+
185
+ # print("send frame to child thread")
186
+
187
+ parent_to_child.put(frame)
188
+
189
+
190
+
191
+ # 処理結果がある場合は受け取る。
192
+
193
+ if not child_to_parent.empty():
194
+
195
+ result = child_to_parent.get()
196
+
197
+ # print("recieved result from child thread")
198
+
199
+
200
+
201
+ if result:
202
+
203
+ cv2.imshow("result", result)
204
+
205
+
206
+
207
+ # 動画保存処理
208
+
209
+ out.write(frame)
210
+
211
+ if not ret or cv2.waitKey(1) & 0xFF == ord("q"):
212
+
213
+ break
214
+
215
+
216
+
217
+ cap.release()
218
+
219
+ cv2.destroyAllWindows()
220
+
221
+
222
+
223
+ print("process finished.")
224
+
225
+
226
+
227
+
228
+
229
+ video("out.avi")
230
+
231
+ ```

1

d

2019/11/25 14:22

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -6,18 +6,68 @@
6
6
 
7
7
  ```python
8
8
 
9
+ def video(output_path=""):
10
+
11
+ vid = cv2.VideoCapture(0, cv2.CAP_DSHOW)
12
+
13
+ video_FourCC = cv2.VideoWriter_fourcc(*"XVID")
14
+
15
+ video_fps = vid.get(cv2.CAP_PROP_FPS)
16
+
17
+ video_size = 1920, 1080
18
+
19
+
20
+
21
+ isOutput = True if output_path != "" else False
22
+
23
+ if isOutput:
24
+
25
+ out = cv2.VideoWriter(output_path, video_FourCC, video_fps, video_size)
26
+
27
+
28
+
9
29
  i = 0
10
30
 
11
31
  while True:
12
32
 
13
- if i % 5 == 0:
33
+ return_value, frame = vid.read()
14
34
 
15
- # 5フレームに1回処理する。
35
+ if i % 10 == 0:
16
36
 
17
- video_process()
37
+ result_img = video_process(frame)
38
+
39
+ result_add = cv2.hconcat([frame, result_img])
18
40
 
19
41
 
20
42
 
43
+ cv2.namedWindow("result", cv2.WINDOW_KEEPRATIO | cv2.WINDOW_NORMAL)
44
+
45
+ cv2.imshow("result", result_add)
46
+
47
+
48
+
49
+ if isOutput:
50
+
51
+ out.write(result_img)
52
+
53
+ if cv2.waitKey(1) & 0xFF == ord("q"):
54
+
55
+ break
56
+
57
+
58
+
21
59
  i += 1
22
60
 
61
+
62
+
63
+
64
+
65
+ if __name__ == "__main__":
66
+
67
+
68
+
69
+ output_dir = "./movie.avi"
70
+
71
+ video(output_dir)
72
+
23
73
  ```