質問編集履歴

2

書式を誤っている箇所を修正。内容は変更なし。

2023/04/10 07:50

投稿

2ckD
2ckD

スコア305

test CHANGED
File without changes
test CHANGED
@@ -1,233 +1,112 @@
1
1
  ### 前提
2
-
3
2
  - Python
4
-
5
3
  - Tkinter
6
-
7
4
  - OpenCV
8
-
9
5
  - webカメラ
10
6
 
11
-
12
-
13
- ###実現したいこと
7
+ ### 実現したいこと
14
-
15
8
  OpenCVでwebカメラから取得した画像(動画)をウインドウ内に表示したいです。
16
9
 
17
-
18
-
19
10
  ### 発生している問題
20
-
21
- 0. 番号リストcv2.imshowならスムーズに画像が切り替わりますが、
22
-
23
- 別ウインドウを開く必要があります。そうすることなく動画を表示したいです。
11
+ 0. cv2.imshowならスムーズに画像が切り替わりますが、別ウインドウを開く必要があります。そうすることなく動画を表示したいです。
24
-
25
- 0. ```canvas.itemconfig()```で画像を切り替えようとすると、
12
+ 0. ```canvas.itemconfig()```で画像を切り替えようとすると、「画像が消える(一瞬canvasの背景色のみが表示される)→画像が表示される」というプロセスを経るためにスムーズに画像を切り替えることができません。
26
-
27
- 画像が消える(一瞬canvasの背景色のみが表示される)→画像が表示される
28
-
29
- というプロセスを経るためにスムーズに画像を切り替えることができません。
30
-
31
-
32
13
 
33
14
  ### 該当のソースコード
34
15
 
35
-
36
-
37
16
  ```Python
38
-
39
17
  import tkinter as tk
40
-
41
18
  import threading as th
42
-
43
19
  import cv2
44
-
45
20
  from PIL import Image,ImageTk
46
-
47
21
  import numpy as np
48
22
 
49
-
50
-
51
23
  root=tk.Tk()
52
-
53
24
  root.title("camera")
54
-
55
25
  root.geometry("720x480")
56
-
57
26
  canvas=tk.Canvas(root, width=640, height=480)
58
-
59
27
  canvas.pack()
60
28
 
61
-
62
-
63
29
  def camera():
64
-
65
30
  try:
66
-
67
31
  c=cv2.VideoCapture(0)
68
-
69
32
  h=c.get(cv2.CAP_PROP_FRAME_HEIGHT)
70
-
71
33
  w=c.get(cv2.CAP_PROP_FRAME_WIDTH)
72
-
73
34
  i=0
74
-
75
35
  while(True):
76
-
77
36
  ret, frame =c.read()
78
-
79
37
  if (not ret):
80
-
81
38
  break
82
-
83
39
  if cv2.waitKey(1)&0xFF==ord('q'):
84
-
85
40
  canvas.delete("all")
86
-
87
41
  break
88
-
89
42
  cv2.imshow('camera', frame)
90
-
91
43
  image=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
92
-
93
44
  if not i:#初回起動時の処理
94
-
95
45
  i=1
96
-
97
46
  canvas.create_image(w/2,h/2,image=image,tag="img")
98
-
99
47
  continue
100
-
101
48
  canvas.itemconfig("img", image=image)
102
-
103
49
  c.release()
104
-
105
50
  cv2.destroyAllWindows()
106
-
107
51
  except:
108
-
109
52
  import sys
110
-
111
53
  print(sys.exec_info()[0])
112
-
113
54
  print(sys.exec_info()[1])
114
55
 
115
-
116
-
117
56
  t1=th.Thread(target=camera)
118
-
119
57
  t1.start()
120
-
121
58
  root.mainloop()
122
-
123
-
124
59
 
125
60
  ```
126
61
 
127
-
128
-
129
62
  ### 試したこと
130
63
 
131
-
132
-
133
64
  labelで画像を表示する場合も同じ結果に終わりました。
134
-
65
+ ```
66
+ label.configure(image=image)
135
67
  ```
136
68
 
137
- label.configure(image=image)
138
-
139
- ```
140
-
141
-
142
-
143
- ###回答をもとにできたもの
69
+ ### 回答をもとにできたもの
144
-
145
- aaaa
146
-
147
-
148
-
149
70
  ```python
150
-
151
71
  import tkinter as tk
152
-
153
72
  import cv2
154
-
155
73
  from PIL import Image,ImageTk
156
-
157
74
  import numpy as np
158
75
 
159
-
160
-
161
76
  root=tk.Tk()
162
-
163
77
  root.title("camera")
164
-
165
78
  root.geometry("720x480")
166
-
167
79
  root.resizable(width=False, height=False)
168
-
169
80
  canvas=tk.Canvas(root, width=640, height=480, bg="white")
170
-
171
81
  canvas.pack()
172
82
 
173
-
174
-
175
83
  def capStart():
176
-
177
84
  print('camera-ON')
178
-
179
85
  try:
180
-
181
86
  global c, w, h, img
182
-
183
87
  c=cv2.VideoCapture(0)
184
-
185
88
  w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT)
186
-
187
89
  print('w:'+str(w)+'px+h:'+str(h)+'px')
188
-
189
90
  except:
190
-
191
91
  import sys
192
-
193
92
  print("error-----")
194
-
195
93
  print(sys.exec_info()[0])
196
-
197
94
  print(sys.exec_info()[1])
198
-
199
95
  '''終了時の処理はここでは省略します。
200
-
201
96
  c.release()
202
-
203
97
  cv2.destroyAllWindows()'''
204
98
 
205
-
206
-
207
99
  def u():#update
208
-
209
100
  global img
210
-
211
101
  ret, frame =c.read()
212
-
213
102
  if ret:
214
-
215
103
  img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
216
-
217
104
  canvas.create_image(w/2,h/2,image=img)
218
-
219
105
  else:
220
-
221
106
  print("u-Fail")
222
-
223
107
  root.after(1,u)
224
108
 
225
-
226
-
227
109
  capStart()
228
-
229
110
  u()
230
-
231
111
  root.mainloop()
232
-
233
112
  ```

1

回答をもとにできたものを追記

2019/05/05 19:38

投稿

2ckD
2ckD

スコア305

test CHANGED
File without changes
test CHANGED
@@ -132,4 +132,102 @@
132
132
 
133
133
  labelで画像を表示する場合も同じ結果に終わりました。
134
134
 
135
+ ```
136
+
135
- ```label.configure(image=image)```
137
+ label.configure(image=image)
138
+
139
+ ```
140
+
141
+
142
+
143
+ ###回答をもとにできたもの
144
+
145
+ aaaa
146
+
147
+
148
+
149
+ ```python
150
+
151
+ import tkinter as tk
152
+
153
+ import cv2
154
+
155
+ from PIL import Image,ImageTk
156
+
157
+ import numpy as np
158
+
159
+
160
+
161
+ root=tk.Tk()
162
+
163
+ root.title("camera")
164
+
165
+ root.geometry("720x480")
166
+
167
+ root.resizable(width=False, height=False)
168
+
169
+ canvas=tk.Canvas(root, width=640, height=480, bg="white")
170
+
171
+ canvas.pack()
172
+
173
+
174
+
175
+ def capStart():
176
+
177
+ print('camera-ON')
178
+
179
+ try:
180
+
181
+ global c, w, h, img
182
+
183
+ c=cv2.VideoCapture(0)
184
+
185
+ w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT)
186
+
187
+ print('w:'+str(w)+'px+h:'+str(h)+'px')
188
+
189
+ except:
190
+
191
+ import sys
192
+
193
+ print("error-----")
194
+
195
+ print(sys.exec_info()[0])
196
+
197
+ print(sys.exec_info()[1])
198
+
199
+ '''終了時の処理はここでは省略します。
200
+
201
+ c.release()
202
+
203
+ cv2.destroyAllWindows()'''
204
+
205
+
206
+
207
+ def u():#update
208
+
209
+ global img
210
+
211
+ ret, frame =c.read()
212
+
213
+ if ret:
214
+
215
+ img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
216
+
217
+ canvas.create_image(w/2,h/2,image=img)
218
+
219
+ else:
220
+
221
+ print("u-Fail")
222
+
223
+ root.after(1,u)
224
+
225
+
226
+
227
+ capStart()
228
+
229
+ u()
230
+
231
+ root.mainloop()
232
+
233
+ ```