teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

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

2023/04/10 07:50

投稿

2ckD
2ckD

スコア305

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. 番号リストcv2.imshowならスムーズに画像が切り替わりますが、
12
- 別ウインドウ開く必要があます。そうするなく動表示したいで
13
- 0. ```canvas.itemconfig()```で画像を切り替えようとすると、
14
- 画像が消える(一瞬canvas背景色のみが表示される)→画像が表示される
15
- というプロセスを経るためにスムーズに画像を切り替えることができません。
16
-
17
- ### 該当のソースコード
18
-
19
- ```Python
20
- import tkinter as tk
21
- import threading as th
22
- import cv2
23
- from PIL import Image,ImageTk
24
- import numpy as np
25
-
26
- root=tk.Tk()
27
- root.title("camera")
28
- root.geometry("720x480")
29
- canvas=tk.Canvas(root, width=640, height=480)
30
- canvas.pack()
31
-
32
- def camera():
33
- try:
34
- c=cv2.VideoCapture(0)
35
- h=c.get(cv2.CAP_PROP_FRAME_HEIGHT)
36
- w=c.get(cv2.CAP_PROP_FRAME_WIDTH)
37
- i=0
38
- while(True):
39
- ret, frame =c.read()
40
- if (not ret):
41
- break
42
- if cv2.waitKey(1)&0xFF==ord('q'):
43
- canvas.delete("all")
44
- break
45
- cv2.imshow('camera', frame)
46
- image=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
47
- if not i:#初回起動時の処理
48
- i=1
49
- canvas.create_image(w/2,h/2,image=image,tag="img")
50
- continue
51
- canvas.itemconfig("img", image=image)
52
- c.release()
53
- cv2.destroyAllWindows()
54
- except:
55
- import sys
56
- print(sys.exec_info()[0])
57
- print(sys.exec_info()[1])
58
-
59
- t1=th.Thread(target=camera)
60
- t1.start()
61
- root.mainloop()
62
-
63
- ```
64
-
65
- ### 試したこと
66
-
67
- labelで画像を表示する場合も同じ結果に終わりました。
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()
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

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

2019/05/05 19:38

投稿

2ckD
2ckD

スコア305

title CHANGED
File without changes
body CHANGED
@@ -65,4 +65,53 @@
65
65
  ### 試したこと
66
66
 
67
67
  labelで画像を表示する場合も同じ結果に終わりました。
68
+ ```
68
- ```label.configure(image=image)```
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
+ ```