目录
1.介绍
2.系统依赖
(1)OpenCV-Python库
(2)Tkinter库
(3)Pillow库
(4)Time库
3.系统代码
4.效果展示
5.注意事项
这是一个有趣的项目,通过Python程序调用系统的摄像头,实现了拍照的功能.
我的主页还有一些文章介绍了其他有趣的项目,可以动手尝试一下:
代码写不完了的博客_CSDN博客代码写不完了擅长Python项目,python操作文件,系统环境配置,等方面的知识,代码写不完了关注pandas,python,django,pygame,spark,pip,virtualenv,numpy,flask领域.https://blog.csdn.net/spx_0108
OpenCV-Python是一个基于Python的计算机视觉库,它可以用于处理图像和视频数据。OpenCV(开源计算机视觉库)最初是由英特尔公司于1999年开发的。OpenCV支持不同平台像Windows,Linux,Android和Mac OS X,同时也支持不同的编程语言,包括C++和Python等。
OpenCV-Python封装了OpenCV C++库中的函数,并为Python提供了简单易用的API。Python API对OpenCV库的调用方式相对更加简单和直观,这个特点使OpenCV-Python非常适合初学者和快速原型开发。
OpenCV-Python中涵盖了许多计算机视觉领域的常用算法和函数,例如图像处理和分析、目标检测和跟踪、机器学习和深度学习等。OpenCV-Python也提供了一些图形用户界面和多媒体处理等模块,方便用户进行图像和视频的输入输出操作。
总的来说,OpenCV-Python是一款功能完备的计算机视觉库,它使得从图像和视频数据中获取信息或进行操作变得容易而直观。
Tkinter是Python内置的GUI(图形用户界面)库,它提供了创建基于GUI的桌面应用程序所需的组件和工具。Tkinter是Python自带的标准库,不需要额外安装即可使用。
Tkinter库包含了几个常用的模块,包括Tk核心模块(Tkinter),多个小部件模块以及布局管理模块。Tkinter小部件是构建GUI界面的基本单元,例如按钮、标签、文本框、下拉菜单、组合框和滚动条等。
Tkinter使用简单,容易上手。在使用Tkinter之前,通常需要了解一下一些基本概念和术语,比如主窗口、小部件、事件循环以及回调函数等。
在Python中,使用Tkinter可以快速构建图形用户界面,让用户可以通过图形化的操作来使用和操作程序。同时,Tkinter也支持跨平台开发,可以在多种操作系统上使用,例如Windows、Linux和Mac OS X。总的来说,Tkinter是一个非常方便实用的GUI库,尤其适用于初学者和快速开发小型应用。
Pillow库是由从Python Imaging Library(PIL)分支出来的一个Python Imaging Library的分支,它提供了处理图像的基本功能,例如加载、显示、编辑、保存等。
Pillow库支持多种常见的图像格式,可以处理各种类型的图像数据,包括位图、矢量图和RAW格式等。此外,Pillow库还提供了图像转换、颜色调整、滤波、错切变形、裁剪和缩放等一系列辅助功能。
Pillow库的API简单易用,因此它非常适合用于处理图像的初学者和中级开发者。开发者可以通过Pillow库快速地添加图像处理的功能,使他们的应用能够支持更多的图像处理需求。
总之,Pillow库是Python中处理图像和图像数据最常用最受欢迎的库之一。在构建需要处理图像和图形数据的应用时,使用Pillow库可以很快地完成一些复杂的任务,并将应用提升到更高的水平。
time库是Python中用于获取和操作时间的标准库。它提供了一系列函数,可以用于获取当前时间、计算时间差、格式化时间字符串等。
time库包含了很多方法,其中一些重要的方法如下:
time()
:返回当前时间的时间戳(从1970年1月1日开始的秒数)。
gmtime()
:返回当前时间的UTC时间元组。
localtime()
:使用本地时区返回当前时间的时间元组。
asctime()
:将时间元组转换为可读字符串形式。
strftime()
:将时间元组格式化为指定的格式。
sleep()
:使当前线程暂停指定的时间。
使用time库可以获取当前时间、计算函数运行时间、进行时间戳转换等各种操作。time库是Python的标准库之一,不需要额外安装即可使用,而且它是处理时间的最基本、最常用的库之一。如果你需要在Python中操作时间,在熟练掌握它的使用后,time库将成为你的得力工具之一。
import time
import cv2
import tkinter as tk
from PIL import Image, ImageTk
class CameraApp:
def __init__(self):
# 创建界面
self.window = tk.Tk() # 创建一个窗口对象
self.window.title("照相机") # 设置窗口标题
self.window.geometry("700x600") # 设置窗口大小
# 创建显示拍摄照片的控件
self.photo_label = tk.Label(self.window, width=700, height=550) # 创建一个标签控件
self.photo_label.pack() # 将标签控件添加到窗口中
# 创建拍照按钮
self.take_photo_button = tk.Button(self.window, text="拍照", command=self.take_photo) # 创建一个按钮控件
self.take_photo_button.pack() # 将按钮控件添加到窗口中
# 打开摄像头
self.cap = cv2.VideoCapture(0) # 创建一个 VideoCapture 对象,打开默认摄像头
_, self.frame = self.cap.read() # 读取摄像头的一帧数据
self.frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB) # 将 BGR 格式的图片转换为 RGB 格式
self.image_flipped = True # 控制是否镜像照片
# 设置界面保持更新
self.update_frame()
self.window.mainloop() # 进入窗口消息循环,等待用户操作
def update_frame(self):
_, self.frame = self.cap.read() # 读取新的摄像头帧数据
if self.image_flipped:
self.frame = cv2.flip(self.frame, 1) # 如果需要镜像显示照片,则在更新帧时进行翻转操作
self.frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB) # 将 BGR 格式的图片转换为 RGB 格式
# 将摄像头帧转为 PIL 图片格式
pil_image = Image.fromarray(self.frame)
# 将 PIL 图片转为 Tkinter 中可以显示的图片格式
tk_image = ImageTk.PhotoImage(image=pil_image)
# 更新显示照片的控件图片
self.photo_label.configure(image=tk_image) # 将标签控件的图片属性设置为新的图片
self.photo_label.image = tk_image # 将标签控件的 image 属性设置为新的图片
# 循环更新帧
self.window.after(10, self.update_frame) # 在 10 毫秒之后调用 update_frame 函数,实现不断更新摄像头帧的效果
def take_photo(self):
# 拍照
_, frame = self.cap.read() # 读取摄像头的一帧数据
if self.image_flipped:
frame = cv2.flip(frame, 1) # 如果需要镜像照片,则在拍照时进行翻转操作
# 获取十三位时间戳
now_time = Utils().getCurrentDateLong() # 使用 Utils 类中的方法获取当前时间的 13 位时间戳
# 保存照片,以时间戳命名
cv2.imwrite(f"./data/{now_time}.jpg", frame) # 保存图片到指定路径下,以当前时间戳作为文件名
# 将照片显示在控件中
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 将 BGR 格式的图片转换为 RGB 格式
pil_image = Image.fromarray(frame) # 将摄像头帧转换为 PIL 图片格式
tk_image = ImageTk.PhotoImage(image=pil_image) # 将 PIL 图片转为 Tkinter 可以显示的图片格式
self.photo_label.configure(image=tk_image) # 将标签控件的图片属性设置为新的图片
self.photo_label.image = tk_image # 将标签控件的 image 属性设置为新的图片
print("照片已保存!")
class Utils():
# 获取 13 位的时间戳
def getCurrentDateLong(self):
current_timestamp = int(round(time.time() * 1000)) # 获取当前时间的时间戳(精确到毫秒)
return current_timestamp
# 主函数
if __name__ == "__main__":
app = CameraApp() # 创建 CameraApp 对象,启动程序
如果出现报错,首先检查需要是否缺失需要导入的包,如果有缺失,可以在终端安装:
pip install 包名
如果出现其他报错,检查一下你电脑的摄像头是否可用,以及检查摄像头是否正在被其他应用使用.