質問編集履歴
6
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -92,6 +92,8 @@
|
|
92
92
|
|
93
93
|
self.label_header = "バーコード:"
|
94
94
|
|
95
|
+
self.barcodeData = ""
|
96
|
+
|
95
97
|
|
96
98
|
|
97
99
|
self.queue_to_subthread = queue.Queue()
|
@@ -314,7 +316,7 @@
|
|
314
316
|
|
315
317
|
|
316
318
|
|
317
|
-
if ret
|
319
|
+
if ret and decode_cnt % decode_span == 0:
|
318
320
|
|
319
321
|
self.queue_to_subthread.put(["decode", self.frame])
|
320
322
|
|
@@ -328,24 +330,34 @@
|
|
328
330
|
|
329
331
|
print(d)
|
330
332
|
|
331
|
-
|
333
|
+
x,y,w,h = (0,0,0,0)
|
334
|
+
|
332
|
-
|
335
|
+
if d:
|
336
|
+
|
333
|
-
for barcode in d:
|
337
|
+
for barcode in d:
|
334
|
-
|
338
|
+
|
335
|
-
x,y,w,h = barcode.rect
|
339
|
+
x,y,w,h = barcode.rect
|
340
|
+
|
336
|
-
|
341
|
+
self.barcodeData = barcode.data.decode("utf-8")
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
else:
|
348
|
+
|
349
|
+
self.barcodeData = ""
|
350
|
+
|
351
|
+
self.label["text"] = self.label_header + self.barcodeData
|
352
|
+
|
337
|
-
|
353
|
+
cv2.rectangle(self.frame,(x,y),(x+w,y+h),(0,0,255),2)
|
338
|
-
|
339
|
-
|
354
|
+
|
340
|
-
|
341
|
-
|
355
|
+
frame = cv2.putText(self.frame,self.barcodeData,(x,y-10),self.font,.5,(0,0,255),2,cv2.LINE_AA)
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
self.label["text"] = self.label_header + barcodeData
|
346
356
|
|
347
357
|
|
348
358
|
|
359
|
+
|
360
|
+
|
349
361
|
except queue.Empty:
|
350
362
|
|
351
363
|
pass
|
@@ -356,7 +368,7 @@
|
|
356
368
|
|
357
369
|
self.canvas.itemconfig(self.img_id, image=self.photo)
|
358
370
|
|
359
|
-
|
371
|
+
decode_cnt += 1
|
360
372
|
|
361
373
|
self.canvas.after(15, self.update_by_timer)
|
362
374
|
|
@@ -404,6 +416,10 @@
|
|
404
416
|
|
405
417
|
queue_to_mainthread.put(["result", d])
|
406
418
|
|
419
|
+
else:
|
420
|
+
|
421
|
+
queue_to_mainthread.put(["result", None])
|
422
|
+
|
407
423
|
elif msg == "snapshot":
|
408
424
|
|
409
425
|
self.snapshot()
|
@@ -448,8 +464,6 @@
|
|
448
464
|
|
449
465
|
main()
|
450
466
|
|
451
|
-
|
452
|
-
|
453
467
|
```
|
454
468
|
|
455
469
|
|
5
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -314,7 +314,7 @@
|
|
314
314
|
|
315
315
|
|
316
316
|
|
317
|
-
if ret and decode_cnt % decode_span == 0:
|
317
|
+
if ret: #and decode_cnt % decode_span == 0:
|
318
318
|
|
319
319
|
self.queue_to_subthread.put(["decode", self.frame])
|
320
320
|
|
@@ -322,11 +322,27 @@
|
|
322
322
|
|
323
323
|
try:
|
324
324
|
|
325
|
-
msg, d
|
325
|
+
msg, d = self.queue_to_mainthread.get_nowait()
|
326
|
+
|
326
|
-
|
327
|
+
#print("data: \n{}".format(d))
|
328
|
+
|
329
|
+
print(d)
|
330
|
+
|
331
|
+
barcodeData = ""
|
332
|
+
|
333
|
+
for barcode in d:
|
334
|
+
|
335
|
+
x,y,w,h = barcode.rect
|
336
|
+
|
337
|
+
cv2.rectangle(self.frame,(x,y),(x+w,y+h),(0,0,255),2)
|
338
|
+
|
339
|
+
barcodeData = barcode.data.decode("utf-8")
|
340
|
+
|
341
|
+
frame = cv2.putText(self.frame,barcodeData,(x,y-10),self.font,.5,(0,0,255),2,cv2.LINE_AA)
|
342
|
+
|
343
|
+
|
344
|
+
|
327
|
-
self.label["text"] = self.label_header + data
|
345
|
+
self.label["text"] = self.label_header + barcodeData
|
328
|
-
|
329
|
-
self.frame = data[1]
|
330
346
|
|
331
347
|
|
332
348
|
|
@@ -334,11 +350,13 @@
|
|
334
350
|
|
335
351
|
pass
|
336
352
|
|
353
|
+
|
354
|
+
|
337
|
-
self.photo = ImageTk.PhotoImage(image = Image.fromarray(self.frame)
|
355
|
+
self.photo = ImageTk.PhotoImage(image = Image.fromarray(self.frame))
|
338
356
|
|
339
357
|
self.canvas.itemconfig(self.img_id, image=self.photo)
|
340
358
|
|
341
|
-
decode_cnt += 1
|
359
|
+
#decode_cnt += 1
|
342
360
|
|
343
361
|
self.canvas.after(15, self.update_by_timer)
|
344
362
|
|
@@ -380,27 +398,11 @@
|
|
380
398
|
|
381
399
|
if msg == "decode":
|
382
400
|
|
383
|
-
barcodeData = ""
|
384
|
-
|
385
|
-
frame = data
|
386
|
-
|
387
|
-
d = decode(
|
401
|
+
d = decode(data)
|
388
402
|
|
389
403
|
if d:
|
390
404
|
|
391
|
-
#print("d: \n{}".format(d))
|
392
|
-
|
393
|
-
for barcode in d:
|
394
|
-
|
395
|
-
x,y,w,h = barcode.rect
|
396
|
-
|
397
|
-
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
|
398
|
-
|
399
|
-
barcodeData = barcode.data.decode('utf-8')
|
400
|
-
|
401
|
-
frame = cv2.putText(frame,barcodeData,(x,y-10),self.font,.5,(0,0,255),2,cv2.LINE_AA)
|
402
|
-
|
403
|
-
queue_to_mainthread.put(["result",
|
405
|
+
queue_to_mainthread.put(["result", d])
|
404
406
|
|
405
407
|
elif msg == "snapshot":
|
406
408
|
|
@@ -446,6 +448,8 @@
|
|
446
448
|
|
447
449
|
main()
|
448
450
|
|
451
|
+
|
452
|
+
|
449
453
|
```
|
450
454
|
|
451
455
|
|
4
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -326,16 +326,18 @@
|
|
326
326
|
|
327
327
|
self.label["text"] = self.label_header + data[0]
|
328
328
|
|
329
|
-
|
330
|
-
|
331
|
-
self.
|
329
|
+
self.frame = data[1]
|
332
|
-
|
333
|
-
|
330
|
+
|
331
|
+
|
334
332
|
|
335
333
|
except queue.Empty:
|
336
334
|
|
337
335
|
pass
|
338
336
|
|
337
|
+
self.photo = ImageTk.PhotoImage(image = Image.fromarray(self.frame)
|
338
|
+
|
339
|
+
self.canvas.itemconfig(self.img_id, image=self.photo)
|
340
|
+
|
339
341
|
decode_cnt += 1
|
340
342
|
|
341
343
|
self.canvas.after(15, self.update_by_timer)
|
@@ -394,6 +396,8 @@
|
|
394
396
|
|
395
397
|
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
|
396
398
|
|
399
|
+
barcodeData = barcode.data.decode('utf-8')
|
400
|
+
|
397
401
|
frame = cv2.putText(frame,barcodeData,(x,y-10),self.font,.5,(0,0,255),2,cv2.LINE_AA)
|
398
402
|
|
399
403
|
queue_to_mainthread.put(["result", [barcodeData, frame]])
|
@@ -416,7 +420,7 @@
|
|
416
420
|
|
417
421
|
def snapshot(self):
|
418
422
|
|
419
|
-
filename = "/home/pi/デスクトップ/img/frame-" + datetime.now().strftime("%Y-%
|
423
|
+
filename = "/home/pi/デスクトップ/img/frame-" + datetime.now().strftime("%Y-%m-%d-%H-%M-%S_%f") + ".jpg"
|
420
424
|
|
421
425
|
cv2.imwrite(filename,
|
422
426
|
|
3
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -320,15 +320,21 @@
|
|
320
320
|
|
321
321
|
|
322
322
|
|
323
|
+
try:
|
324
|
+
|
323
|
-
msg, data = self.queue_to_mainthread.get()
|
325
|
+
msg, data = self.queue_to_mainthread.get_nowait()
|
324
|
-
|
326
|
+
|
325
|
-
self.label["text"] = self.label_header + data[0]
|
327
|
+
self.label["text"] = self.label_header + data[0]
|
326
|
-
|
327
|
-
|
328
|
-
|
328
|
+
|
329
|
+
|
330
|
+
|
329
|
-
self.photo = ImageTk.PhotoImage(image = Image.fromarray(data[1]))
|
331
|
+
self.photo = ImageTk.PhotoImage(image = Image.fromarray(data[1]))
|
330
|
-
|
332
|
+
|
331
|
-
self.canvas.itemconfig(self.img_id, image=self.photo)
|
333
|
+
self.canvas.itemconfig(self.img_id, image=self.photo)
|
334
|
+
|
335
|
+
except queue.Empty:
|
336
|
+
|
337
|
+
pass
|
332
338
|
|
333
339
|
decode_cnt += 1
|
334
340
|
|
2
変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -52,6 +52,12 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
+
decode_cnt = 0
|
56
|
+
|
57
|
+
decode_span = 20
|
58
|
+
|
59
|
+
|
60
|
+
|
55
61
|
class App:
|
56
62
|
|
57
63
|
def __init__(self, win):
|
@@ -84,11 +90,13 @@
|
|
84
90
|
|
85
91
|
|
86
92
|
|
87
|
-
self.label_header = "
|
93
|
+
self.label_header = "バーコード:"
|
88
|
-
|
89
|
-
|
90
|
-
|
94
|
+
|
95
|
+
|
96
|
+
|
91
|
-
self.
|
97
|
+
self.queue_to_subthread = queue.Queue()
|
98
|
+
|
99
|
+
self.queue_to_mainthread = queue.Queue()
|
92
100
|
|
93
101
|
|
94
102
|
|
@@ -96,7 +104,7 @@
|
|
96
104
|
|
97
105
|
self.win.title("Camera")
|
98
106
|
|
99
|
-
self.thread = threading.Thread(target=self.get_queue)
|
107
|
+
self.thread = threading.Thread(target=self.get_queue, args=(self.queue_to_mainthread,))
|
100
108
|
|
101
109
|
self.thread.start()
|
102
110
|
|
@@ -116,7 +124,7 @@
|
|
116
124
|
|
117
125
|
#self.update_by_timer()
|
118
126
|
|
119
|
-
self.canvas.after(
|
127
|
+
self.canvas.after(15, self.update_by_timer)
|
120
128
|
|
121
129
|
|
122
130
|
|
@@ -142,7 +150,7 @@
|
|
142
150
|
|
143
151
|
def close(self, e=None):
|
144
152
|
|
145
|
-
self.
|
153
|
+
self.queue_to_subthread.put(["close", None])
|
146
154
|
|
147
155
|
self.thread.join()
|
148
156
|
|
@@ -180,25 +188,67 @@
|
|
180
188
|
|
181
189
|
|
182
190
|
|
183
|
-
|
191
|
+
ret, frm = self.vcap.read()
|
184
192
|
|
185
193
|
#print("ret: {}".format(ret))
|
186
194
|
|
187
195
|
#print("frm: {}".format(frm))
|
188
196
|
|
189
|
-
|
197
|
+
self.frame = cv2.cvtColor(frm, cv2.COLOR_BGR2RGB)
|
190
|
-
|
198
|
+
|
191
|
-
|
199
|
+
self.photo = ImageTk.PhotoImage(image = Image.fromarray(self.frame))
|
192
|
-
|
200
|
+
|
193
|
-
|
201
|
+
self.canvas.update()
|
194
|
-
|
202
|
+
|
195
|
-
|
203
|
+
cv_w = self.canvas.winfo_reqwidth()
|
196
|
-
|
204
|
+
|
197
|
-
|
205
|
+
cv_h = self.canvas.winfo_reqheight()
|
198
|
-
|
206
|
+
|
199
|
-
|
207
|
+
self.img_id = self.canvas.create_image(cv_w // 2, cv_h // 2, image=self.photo, anchor="center")
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
|
200
|
-
|
213
|
+
"""
|
214
|
+
|
201
|
-
|
215
|
+
self.canvas.update()
|
216
|
+
|
217
|
+
cv_w = self.canvas.winfo_width()
|
218
|
+
|
219
|
+
cv_h = self.canvas.winfo_height()
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
rec_id = self.canvas.create_rectangle(0, 0, cv_w, cv_h, fill="black")
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
# 長方形の座標取得
|
230
|
+
|
231
|
+
rec_pos = self.canvas.coords(rec_id)
|
232
|
+
|
233
|
+
# テキストを描画(位置は適当)
|
234
|
+
|
235
|
+
text_id = self.canvas.create_text(0, 0, text="NO SIGNAL", font=("", 20), fill="white")
|
236
|
+
|
237
|
+
# テキストのサイズ取得
|
238
|
+
|
239
|
+
text_size = self.canvas.bbox(text_id)
|
240
|
+
|
241
|
+
# テキストの座標移動
|
242
|
+
|
243
|
+
rc_x = rec_pos[2] / 2
|
244
|
+
|
245
|
+
rc_y = rec_pos[2] / 3
|
246
|
+
|
247
|
+
tc_y = text_size[3] / 2
|
248
|
+
|
249
|
+
self.canvas.move(text_id, rc_x - (rec_pos[0] / 2), rc_y - tc_y)
|
250
|
+
|
251
|
+
"""
|
202
252
|
|
203
253
|
|
204
254
|
|
@@ -220,7 +270,7 @@
|
|
220
270
|
|
221
271
|
def pushed_button(self):
|
222
272
|
|
223
|
-
self.
|
273
|
+
self.queue_to_subthread.put(["snapshot", None])
|
224
274
|
|
225
275
|
|
226
276
|
|
@@ -228,7 +278,7 @@
|
|
228
278
|
|
229
279
|
def update_by_timer(self):
|
230
280
|
|
231
|
-
|
281
|
+
global decode_cnt, decode_span
|
232
282
|
|
233
283
|
ret, self.frame = self.vcap.read()
|
234
284
|
|
@@ -264,86 +314,98 @@
|
|
264
314
|
|
265
315
|
|
266
316
|
|
317
|
+
if ret and decode_cnt % decode_span == 0:
|
318
|
+
|
319
|
+
self.queue_to_subthread.put(["decode", self.frame])
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
msg, data = self.queue_to_mainthread.get()
|
324
|
+
|
325
|
+
self.label["text"] = self.label_header + data[0]
|
326
|
+
|
327
|
+
|
328
|
+
|
329
|
+
self.photo = ImageTk.PhotoImage(image = Image.fromarray(data[1]))
|
330
|
+
|
331
|
+
self.canvas.itemconfig(self.img_id, image=self.photo)
|
332
|
+
|
333
|
+
decode_cnt += 1
|
334
|
+
|
335
|
+
self.canvas.after(15, self.update_by_timer)
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
|
340
|
+
|
341
|
+
def update_by_resize(self, e):
|
342
|
+
|
343
|
+
self.canvas.itemconfig(self.img_id, image=self.photo, anchor="center")
|
344
|
+
|
345
|
+
cv_w = self.canvas.winfo_width()
|
346
|
+
|
347
|
+
cv_h = self.canvas.winfo_height()
|
348
|
+
|
349
|
+
self.canvas.coords(self.img_id, cv_w // 2, cv_h // 2)
|
350
|
+
|
351
|
+
#pass
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
|
356
|
+
|
357
|
+
def bind_event(self):
|
358
|
+
|
359
|
+
self.win.bind("<Escape>", self.close)
|
360
|
+
|
361
|
+
self.canvas.bind("<Configure>", self.update_by_resize)
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
def get_queue(self, queue_to_mainthread):
|
368
|
+
|
267
|
-
i
|
369
|
+
while True:
|
370
|
+
|
268
|
-
|
371
|
+
msg, data = self.queue_to_subthread.get()
|
372
|
+
|
373
|
+
if msg == "decode":
|
374
|
+
|
375
|
+
barcodeData = ""
|
376
|
+
|
377
|
+
frame = data
|
378
|
+
|
269
|
-
d = decode(
|
379
|
+
d = decode(frame)
|
270
|
-
|
380
|
+
|
271
|
-
if d:
|
381
|
+
if d:
|
272
|
-
|
382
|
+
|
273
|
-
#print("d: \n{}".format(d))
|
383
|
+
#print("d: \n{}".format(d))
|
274
|
-
|
384
|
+
|
275
|
-
for barcode in d:
|
385
|
+
for barcode in d:
|
276
|
-
|
386
|
+
|
277
|
-
x,y,w,h = barcode.rect
|
387
|
+
x,y,w,h = barcode.rect
|
278
|
-
|
388
|
+
|
279
|
-
cv2.rectangle(
|
389
|
+
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
|
280
|
-
|
281
|
-
|
390
|
+
|
282
|
-
|
283
|
-
self.label["text"] = self.label_header + barcodeData
|
284
|
-
|
285
|
-
frame = cv2.putText(
|
391
|
+
frame = cv2.putText(frame,barcodeData,(x,y-10),self.font,.5,(0,0,255),2,cv2.LINE_AA)
|
392
|
+
|
393
|
+
queue_to_mainthread.put(["result", [barcodeData, frame]])
|
394
|
+
|
395
|
+
elif msg == "snapshot":
|
396
|
+
|
397
|
+
self.snapshot()
|
398
|
+
|
399
|
+
elif msg == "close":
|
400
|
+
|
401
|
+
break
|
286
402
|
|
287
403
|
else:
|
288
404
|
|
289
|
-
self.label["text"] = self.label_header
|
290
|
-
|
291
|
-
#self.photo = ImageTk.PhotoImage(image = Image.fromarray(self.frame))
|
292
|
-
|
293
|
-
#self.canvas.itemconfig(self.img_id, image=self.photo)
|
294
|
-
|
295
|
-
self.canvas.after(100, self.update_by_timer)
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
def update_by_resize(self, e):
|
302
|
-
|
303
|
-
#self.canvas.itemconfig(self.img_id, image=self.photo, anchor="center")
|
304
|
-
|
305
|
-
#cv_w = self.canvas.winfo_width()
|
306
|
-
|
307
|
-
#cv_h = self.canvas.winfo_height()
|
308
|
-
|
309
|
-
#self.canvas.coords(self.img_id, cv_w // 2, cv_h // 2)
|
310
|
-
|
311
|
-
pass
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
def bind_event(self):
|
318
|
-
|
319
|
-
|
405
|
+
print("----- Undefined msg -----")
|
320
|
-
|
321
|
-
self.canvas.bind("<Configure>", self.update_by_resize)
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
def get_queue(self):
|
328
|
-
|
329
|
-
while True:
|
330
|
-
|
331
|
-
msg, data = self.data_queue.get()
|
332
|
-
|
333
|
-
if msg == "snapshot":
|
334
|
-
|
335
|
-
self.snapshot()
|
336
|
-
|
337
|
-
elif msg == "close":
|
338
406
|
|
339
407
|
break
|
340
408
|
|
341
|
-
else:
|
342
|
-
|
343
|
-
print("----- Undefined msg -----")
|
344
|
-
|
345
|
-
break
|
346
|
-
|
347
409
|
|
348
410
|
|
349
411
|
def snapshot(self):
|
1
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
|
9
9
|
after()の中にprint()にてタイムスタンプ表示を行うと、指定[ms]に対して少し誤差はあるものの、映像表示ほどの遅れはありません。
|
10
10
|
|
11
|
+
指定時間[ms]は10[ms]、100[ms]、1000[ms]で試験しましたが、どれも同じくらい遅いです。
|
12
|
+
|
11
13
|
|
12
14
|
|
13
15
|
canvasの描画内容をコメントアウトしてバーコードの読み取りのみに変更しても、読み取るのに要する時間(バーコードをカメラの前にもっていってから、tkinterのラベルに表示するまでの時間)が2~3秒と長いような気がします。(単にピントが合っておらず、時間がかかっているときもありますが)
|