有一个 640x480的Label,一开始放置一张图片,点击打开监控按钮后显示监控内容,点击关闭按钮后摄像头数据消失变成显示原始图片tkinter
时间: 2023-12-03 18:45:25 浏览: 65
摄像头显示
5星 · 资源好评率100%
可以通过以下步骤来实现:
1. 创建一个`Label`并在其中显示一张图片,例如:
```
import tkinter as tk
from PIL import ImageTk, Image
root = tk.Tk()
root.geometry("640x480")
img = Image.open("image.jpg")
img = img.resize((640, 480))
img_tk = ImageTk.PhotoImage(img)
label = tk.Label(root, image=img_tk)
label.pack()
root.mainloop()
```
2. 创建一个函数`start_monitor()`,用于打开监控并更新`Label`中的内容。可以使用`cv2`库中的`VideoCapture()`函数打开摄像头,并使用`Pillow`库中的`ImageTk`将每一帧转换成`PhotoImage`格式后更新`Label`中的内容。函数如下:
```
import cv2
def start_monitor():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame)
img_tk = ImageTk.PhotoImage(img)
label.configure(image=img_tk)
label.image = img_tk
label.update()
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
3. 创建一个函数`stop_monitor()`,用于关闭监控并显示原始图片。可以直接使用之前创建的`img_tk`变量来更新`Label`中的内容。函数如下:
```
def stop_monitor():
label.configure(image=img_tk)
label.image = img_tk
label.update()
```
4. 创建两个按钮`start_btn`和`stop_btn`,并将它们分别绑定到`start_monitor()`和`stop_monitor()`函数上。完整代码如下:
```
import tkinter as tk
from PIL import ImageTk, Image
import cv2
root = tk.Tk()
root.geometry("640x480")
img = Image.open("image.jpg")
img = img.resize((640, 480))
img_tk = ImageTk.PhotoImage(img)
label = tk.Label(root, image=img_tk)
label.pack()
def start_monitor():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame)
img_tk = ImageTk.PhotoImage(img)
label.configure(image=img_tk)
label.image = img_tk
label.update()
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
def stop_monitor():
label.configure(image=img_tk)
label.image = img_tk
label.update()
start_btn = tk.Button(root, text="打开监控", command=start_monitor)
start_btn.pack(side="left")
stop_btn = tk.Button(root, text="关闭监控", command=stop_monitor)
stop_btn.pack(side="right")
root.mainloop()
```
阅读全文