質問編集履歴

1

マルチスレッド化したが、エラーが発生した。

2020/03/20 09:14

投稿

falcon_titan
falcon_titan

スコア14

test CHANGED
File without changes
test CHANGED
@@ -189,3 +189,227 @@
189
189
  save_frame_camera_cycle(0, 'camera_data', 'camera_capture_cycle', 15)
190
190
 
191
191
  ```
192
+
193
+
194
+
195
+ アドバイスを受け、マルチスレッドで実行するようにプログラムを変更しました。
196
+
197
+ ```python
198
+
199
+ import cv2
200
+
201
+ import os
202
+
203
+ import datetime
204
+
205
+ from sklearn import svm
206
+
207
+ import pickle
208
+
209
+ from PIL import Image
210
+
211
+ import numpy as np
212
+
213
+ import tkinter as tk
214
+
215
+ from tkinter import font
216
+
217
+ import threading
218
+
219
+
220
+
221
+ # ウィンドウ表示の定義
222
+
223
+ def print_text():
224
+
225
+ root = tk.Tk()#ウィンドウを作る
226
+
227
+
228
+
229
+ root.title("ティッシュ認識システム") #タイトルの変更
230
+
231
+ root.geometry("300x100") #サイズの指定
232
+
233
+
234
+
235
+ font1 = font.Font(family='Helvetica', size=20, weight='bold') #フォントを設定
236
+
237
+
238
+
239
+ text = tk.StringVar()#textをStringVar関数にする
240
+
241
+
242
+
243
+ if result ==1:
244
+
245
+ text.set("これはティッシュです")
246
+
247
+
248
+
249
+ else:
250
+
251
+ text.set("これは床です")
252
+
253
+
254
+
255
+ label = tk.Label(textvariable = text, font = font1) #ラベルを追加
256
+
257
+ label.pack()
258
+
259
+
260
+
261
+ root.mainloop() #実行して表示
262
+
263
+ print("a")
264
+
265
+
266
+
267
+ # 画像認識の学習データを読み込む
268
+
269
+ filename = 'tissue_model_1.sav'
270
+
271
+ clf = pickle.load(open(filename, 'rb'))
272
+
273
+
274
+
275
+ # 変数の定義
276
+
277
+ size = 16
278
+
279
+
280
+
281
+ # 認識システムを関数で定義
282
+
283
+ def save_frame_camera_cycle(device_num, dir_path, basename, cycle, ext='JPG', delay=1, window_name='frame'):
284
+
285
+ cap = cv2.VideoCapture(1)# カメラは1(usbカメラ)を用いる
286
+
287
+
288
+
289
+ if not cap.isOpened():#カメラが見つからなかった場合
290
+
291
+ return#中止する 
292
+
293
+
294
+
295
+ os.makedirs(dir_path, exist_ok=True)
296
+
297
+ base_path = os.path.join(dir_path, basename)
298
+
299
+
300
+
301
+ n = 0
302
+
303
+ while True: #Trueでずっとループさせる
304
+
305
+ ret, frame = cap.read()
306
+
307
+ cv2.imshow(window_name, frame)
308
+
309
+ if cv2.waitKey(delay) & 0xFF == ord('q'):# qが押されたら終了する
310
+
311
+ break
312
+
313
+ if n == cycle:#cycleとnが同じ数になったら写真を保存する
314
+
315
+
316
+
317
+ cv2.imwrite('{}_{}.{}'.format(base_path, datetime.datetime.now().strftime('%Y%m%d%H%M%S%f'), ext), frame)#画像を保存
318
+
319
+ cv2.imwrite('picture.' + ext, frame)#画像を1時的に保存
320
+
321
+ img = Image.open('picture.JPG')#画像を開く
322
+
323
+ img = img.resize((size,size))#リサイズ
324
+
325
+ ary = np.array(img).reshape(-1,)#一次元の配列にする
326
+
327
+ global result
328
+
329
+ result = clf.predict(ary)#認識
330
+
331
+ print(result)#結果を表示
332
+
333
+
334
+
335
+ print_text(result = result)
336
+
337
+
338
+
339
+ n = 0
340
+
341
+ n += 1
342
+
343
+
344
+
345
+ cv2.destroyWindow(window_name)
346
+
347
+
348
+
349
+ #関数を実行
350
+
351
+ t1 = threading.Thread(target = save_frame_camera_cycle, args = (0, 'camera_data', 'camera_capture_cycle', 15))
352
+
353
+ t2 = threading.Thread(target = print_text,)
354
+
355
+ t2.start()
356
+
357
+ t1.start()
358
+
359
+ ```
360
+
361
+ しかし、
362
+
363
+ ```python
364
+
365
+ Exception in thread Thread-12:
366
+
367
+ Traceback (most recent call last):
368
+
369
+ File "C:\Users\ユーザー名\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
370
+
371
+ self.run()
372
+
373
+ File "C:\Users\ユーザー名\Anaconda3\lib\threading.py", line 864, in run
374
+
375
+ self._target(*self._args, **self._kwargs)
376
+
377
+ File "<ipython-input-8-c90b360b3e2d>", line 19, in print_text
378
+
379
+ font1 = font.Font(family='Helvetica', size=20, weight='bold') #フォントを設定
380
+
381
+ File "C:\Users\ユーザー名\Anaconda3\lib\tkinter\font.py", line 93, in __init__
382
+
383
+ tk.call("font", "create", self.name, *font)
384
+
385
+ RuntimeError: main thread is not in main loop
386
+
387
+
388
+
389
+ C:\Users\ユーザー名\Anaconda3\lib\site-packages\sklearn\utils\validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
390
+
391
+ DeprecationWarning)
392
+
393
+ Exception in thread Thread-11:
394
+
395
+ Traceback (most recent call last):
396
+
397
+ File "C:\Users\ユーザー名\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
398
+
399
+ self.run()
400
+
401
+ File "C:\Users\ユーザー名\Anaconda3\lib\threading.py", line 864, in run
402
+
403
+ self._target(*self._args, **self._kwargs)
404
+
405
+ File "<ipython-input-8-c90b360b3e2d>", line 69, in save_frame_camera_cycle
406
+
407
+ print_text(result = result)
408
+
409
+ TypeError: print_text() got an unexpected keyword argument 'result'
410
+
411
+ ```
412
+
413
+ と、結果となるresultをTkinterウィンドウの関数が受け取ることができませんでした。
414
+
415
+ 変数を共有するには、どうしたらよいでしょうか?