質問編集履歴
2
書式を誤っている箇所を修正。内容は変更なし。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,117 +1,112 @@
|
|
1
|
-
### 前提
|
2
|
-
- Python
|
3
|
-
- Tkinter
|
4
|
-
- OpenCV
|
5
|
-
- webカメラ
|
6
|
-
|
7
|
-
###実現したいこと
|
8
|
-
OpenCVでwebカメラから取得した画像(動画)をウインドウ内に表示したいです。
|
9
|
-
|
10
|
-
### 発生している問題
|
11
|
-
0.
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
import
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
break
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
```
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
print(
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
root.after(1,u)
|
113
|
-
|
114
|
-
capStart()
|
115
|
-
u()
|
116
|
-
root.mainloop()
|
1
|
+
### 前提
|
2
|
+
- Python
|
3
|
+
- Tkinter
|
4
|
+
- OpenCV
|
5
|
+
- webカメラ
|
6
|
+
|
7
|
+
### 実現したいこと
|
8
|
+
OpenCVでwebカメラから取得した画像(動画)をウインドウ内に表示したいです。
|
9
|
+
|
10
|
+
### 発生している問題
|
11
|
+
0. cv2.imshowならスムーズに画像が切り替わりますが、別ウインドウを開く必要があります。そうすることなく動画を表示したいです。
|
12
|
+
0. ```canvas.itemconfig()```で画像を切り替えようとすると、「画像が消える(一瞬canvasの背景色のみが表示される)→画像が表示される」というプロセスを経るためにスムーズに画像を切り替えることができません。
|
13
|
+
|
14
|
+
### 該当のソースコード
|
15
|
+
|
16
|
+
```Python
|
17
|
+
import tkinter as tk
|
18
|
+
import threading as th
|
19
|
+
import cv2
|
20
|
+
from PIL import Image,ImageTk
|
21
|
+
import numpy as np
|
22
|
+
|
23
|
+
root=tk.Tk()
|
24
|
+
root.title("camera")
|
25
|
+
root.geometry("720x480")
|
26
|
+
canvas=tk.Canvas(root, width=640, height=480)
|
27
|
+
canvas.pack()
|
28
|
+
|
29
|
+
def camera():
|
30
|
+
try:
|
31
|
+
c=cv2.VideoCapture(0)
|
32
|
+
h=c.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
33
|
+
w=c.get(cv2.CAP_PROP_FRAME_WIDTH)
|
34
|
+
i=0
|
35
|
+
while(True):
|
36
|
+
ret, frame =c.read()
|
37
|
+
if (not ret):
|
38
|
+
break
|
39
|
+
if cv2.waitKey(1)&0xFF==ord('q'):
|
40
|
+
canvas.delete("all")
|
41
|
+
break
|
42
|
+
cv2.imshow('camera', frame)
|
43
|
+
image=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
|
44
|
+
if not i:#初回起動時の処理
|
45
|
+
i=1
|
46
|
+
canvas.create_image(w/2,h/2,image=image,tag="img")
|
47
|
+
continue
|
48
|
+
canvas.itemconfig("img", image=image)
|
49
|
+
c.release()
|
50
|
+
cv2.destroyAllWindows()
|
51
|
+
except:
|
52
|
+
import sys
|
53
|
+
print(sys.exec_info()[0])
|
54
|
+
print(sys.exec_info()[1])
|
55
|
+
|
56
|
+
t1=th.Thread(target=camera)
|
57
|
+
t1.start()
|
58
|
+
root.mainloop()
|
59
|
+
|
60
|
+
```
|
61
|
+
|
62
|
+
### 試したこと
|
63
|
+
|
64
|
+
labelで画像を表示する場合も同じ結果に終わりました。
|
65
|
+
```
|
66
|
+
label.configure(image=image)
|
67
|
+
```
|
68
|
+
|
69
|
+
### 回答をもとにできたもの
|
70
|
+
```python
|
71
|
+
import tkinter as tk
|
72
|
+
import cv2
|
73
|
+
from PIL import Image,ImageTk
|
74
|
+
import numpy as np
|
75
|
+
|
76
|
+
root=tk.Tk()
|
77
|
+
root.title("camera")
|
78
|
+
root.geometry("720x480")
|
79
|
+
root.resizable(width=False, height=False)
|
80
|
+
canvas=tk.Canvas(root, width=640, height=480, bg="white")
|
81
|
+
canvas.pack()
|
82
|
+
|
83
|
+
def capStart():
|
84
|
+
print('camera-ON')
|
85
|
+
try:
|
86
|
+
global c, w, h, img
|
87
|
+
c=cv2.VideoCapture(0)
|
88
|
+
w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
89
|
+
print('w:'+str(w)+'px+h:'+str(h)+'px')
|
90
|
+
except:
|
91
|
+
import sys
|
92
|
+
print("error-----")
|
93
|
+
print(sys.exec_info()[0])
|
94
|
+
print(sys.exec_info()[1])
|
95
|
+
'''終了時の処理はここでは省略します。
|
96
|
+
c.release()
|
97
|
+
cv2.destroyAllWindows()'''
|
98
|
+
|
99
|
+
def u():#update
|
100
|
+
global img
|
101
|
+
ret, frame =c.read()
|
102
|
+
if ret:
|
103
|
+
img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
|
104
|
+
canvas.create_image(w/2,h/2,image=img)
|
105
|
+
else:
|
106
|
+
print("u-Fail")
|
107
|
+
root.after(1,u)
|
108
|
+
|
109
|
+
capStart()
|
110
|
+
u()
|
111
|
+
root.mainloop()
|
117
112
|
```
|
1
回答をもとにできたものを追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -65,4 +65,53 @@
|
|
65
65
|
### 試したこと
|
66
66
|
|
67
67
|
labelで画像を表示する場合も同じ結果に終わりました。
|
68
|
+
```
|
68
|
-
|
69
|
+
label.configure(image=image)
|
70
|
+
```
|
71
|
+
|
72
|
+
###回答をもとにできたもの
|
73
|
+
aaaa
|
74
|
+
|
75
|
+
```python
|
76
|
+
import tkinter as tk
|
77
|
+
import cv2
|
78
|
+
from PIL import Image,ImageTk
|
79
|
+
import numpy as np
|
80
|
+
|
81
|
+
root=tk.Tk()
|
82
|
+
root.title("camera")
|
83
|
+
root.geometry("720x480")
|
84
|
+
root.resizable(width=False, height=False)
|
85
|
+
canvas=tk.Canvas(root, width=640, height=480, bg="white")
|
86
|
+
canvas.pack()
|
87
|
+
|
88
|
+
def capStart():
|
89
|
+
print('camera-ON')
|
90
|
+
try:
|
91
|
+
global c, w, h, img
|
92
|
+
c=cv2.VideoCapture(0)
|
93
|
+
w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
94
|
+
print('w:'+str(w)+'px+h:'+str(h)+'px')
|
95
|
+
except:
|
96
|
+
import sys
|
97
|
+
print("error-----")
|
98
|
+
print(sys.exec_info()[0])
|
99
|
+
print(sys.exec_info()[1])
|
100
|
+
'''終了時の処理はここでは省略します。
|
101
|
+
c.release()
|
102
|
+
cv2.destroyAllWindows()'''
|
103
|
+
|
104
|
+
def u():#update
|
105
|
+
global img
|
106
|
+
ret, frame =c.read()
|
107
|
+
if ret:
|
108
|
+
img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
|
109
|
+
canvas.create_image(w/2,h/2,image=img)
|
110
|
+
else:
|
111
|
+
print("u-Fail")
|
112
|
+
root.after(1,u)
|
113
|
+
|
114
|
+
capStart()
|
115
|
+
u()
|
116
|
+
root.mainloop()
|
117
|
+
```
|