基于opencv模块来调用笔记本摄像头,通过GUI界面,然后从视频流中获取到图像数据,并将图像数据持久化。要求保存小组成员图像(类似证件照);
时间: 2024-03-26 14:41:13 浏览: 59
以下是基于OpenCV模块调用笔记本摄像头,并通过GUI界面获取图像数据并持久化的代码:
```python
import cv2
import tkinter as tk
from PIL import Image, ImageTk
class Camera:
def __init__(self, window, video_source=0):
self.window = window
self.window.title("Camera")
self.video_source = video_source
# 打开视频流
self.vid = cv2.VideoCapture(self.video_source)
# 获取视频流的宽度和高度
self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 创建Canvas组件用于显示视频流
self.canvas = tk.Canvas(window, width=self.width, height=self.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.btn_quit = tk.Button(window, text="退出", width=50, command=self.quit)
self.btn_quit.pack(anchor=tk.CENTER, expand=True)
self.delay = 15
self.update()
self.window.mainloop()
def snapshot(self):
# 获取当前帧的图像数据
ret, frame = self.vid.read()
if ret:
# 将图像数据持久化
cv2.imwrite("member.jpg", frame)
def update(self):
# 获取当前帧的图像数据
ret, frame = self.vid.read()
if ret:
# 将图像数据转换为RGB格式
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 将图像数据转换为ImageTk格式
self.photo = ImageTk.PhotoImage(image=Image.fromarray(frame))
# 显示图像数据
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
self.window.after(self.delay, self.update)
def quit(self):
# 关闭视频流
if self.vid:
self.vid.release()
# 关闭窗口
self.window.destroy()
if __name__ == '__main__':
# 创建窗口
window = tk.Tk()
# 创建摄像头对象
camera = Camera(window)
# 进入消息循环
window.mainloop()
```
该代码中,首先定义了一个名为`Camera`的类,该类包含以下方法:
- `__init__(self, window, video_source=0)`:初始化方法,用于创建GUI界面和打开视频流;
- `snapshot(self)`:拍照方法,用于获取当前帧的图像数据并持久化;
- `update(self)`:更新方法,用于获取当前帧的图像数据并显示在GUI界面上;
- `quit(self)`:退出方法,用于关闭视频流和窗口。
在主程序中,首先创建了一个窗口,并创建了一个名为`Camera`的摄像头对象,然后进入消息循环等待用户操作。用户可以通过GUI界面拍照,同时程序会将拍摄的照片保存到当前目录下的`member.jpg`文件中。
阅读全文