TK怎么在画布上显示摄像头
时间: 2024-03-29 09:39:50 浏览: 61
要在Tkinter画布上显示摄像头,可以使用OpenCV库来捕获摄像头帧,并将其转换为PIL图像格式,然后使用Tkinter的Canvas来显示图像。
以下是一个简单的例子,演示了如何在Tkinter画布上显示来自摄像头的实时视频:
```python
import cv2
import PIL.Image, PIL.ImageTk
import tkinter as tk
class App:
def __init__(self, window, window_title, video_source=0):
self.window = window
self.window.title(window_title)
self.video_source = video_source
# 打开摄像头
self.vid = MyVideoCapture(self.video_source)
# 创建一个Canvas组件来显示视频
self.canvas = tk.Canvas(window, width = self.vid.width, height = self.vid.height)
self.canvas.pack()
# 创建一个按钮,用于截图
self.btn_snapshot=tk.Button(window, text="截图", width=50, command=self.snapshot)
self.btn_snapshot.pack(anchor=tk.CENTER, expand=True)
# 更新画面
self.delay = 15
self.update()
self.window.mainloop()
def snapshot(self):
# 获取当前视频帧
ret, frame = self.vid.get_frame()
if ret:
# 将OpenCV图像转换为PIL图像
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = PIL.Image.fromarray(frame)
# 保存截图
filename = "snapshot.png"
frame.save(filename)
print(f"截图已保存为 {filename}")
def update(self):
# 获取下一帧
ret, frame = self.vid.get_frame()
if ret:
# 将OpenCV图像转换为PIL图像
self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
# 显示视频帧
self.canvas.create_image(0, 0, image = self.photo, anchor = tk.NW)
self.window.after(self.delay, self.update)
class MyVideoCapture:
def __init__(self, video_source=0):
# 打开摄像头
self.vid = cv2.VideoCapture(video_source)
if not self.vid.isOpened():
raise ValueError("无法打开摄像头")
# 获取摄像头帧的宽度和高度
self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
def get_frame(self):
if self.vid.isOpened():
ret, frame = self.vid.read()
if ret:
# 返回一个布尔值(ret)和一个OpenCV图像(frame)
return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
else:
return (ret, None)
else:
return (ret, None)
def __del__(self):
if self.vid.isOpened():
self.vid.release()
# 创建应用程序并启动
App(tk.Tk(), "Tkinter和OpenCV的摄像头应用程序")
```
在这个例子中,我们首先定义了一个`MyVideoCapture`类,用于捕获摄像头帧。然后我们定义了一个`App`类,用于在Tkinter画布上显示视频和截图。在`App`类的构造函数中,我们首先打开摄像头并创建一个Canvas组件来显示视频。然后我们创建一个按钮来截取当前视频帧,并更新画面。在`update`方法中,我们首先获取下一帧,并将其转换为PIL图像。然后我们使用Tkinter的Canvas组件来显示图像。最后,我们使用`after`方法来定期更新画面。
阅读全文