python调用摄像头实现拍照功能

目录


1.介绍

        这是一个有趣的项目,通过Python程序调用系统的摄像头,实现了拍照的功能.
        我的主页还有一些文章介绍了其他有趣的项目,可以动手尝试一下:

代码写不完了的博客_CSDN博客代码写不完了擅长Python项目,python操作文件,系统环境配置,等方面的知识,代码写不完了关注pandas,python,django,pygame,spark,pip,virtualenv,numpy,flask领域.python调用摄像头实现拍照功能https://blog.csdn.net/spx_0108

2.系统依赖

(1)OpenCV-Python库

        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是一款功能完备的计算机视觉库,它使得从图像和视频数据中获取信息或进行操作变得容易而直观。

(2)Tkinter库

        Tkinter是Python内置的GUI(图形用户界面)库,它提供了创建基于GUI的桌面应用程序所需的组件和工具。Tkinter是Python自带的标准库,不需要额外安装即可使用。

        Tkinter库包含了几个常用的模块,包括Tk核心模块(Tkinter),多个小部件模块以及布局管理模块。Tkinter小部件是构建GUI界面的基本单元,例如按钮、标签、文本框、下拉菜单、组合框和滚动条等。

        Tkinter使用简单,容易上手。在使用Tkinter之前,通常需要了解一下一些基本概念和术语,比如主窗口、小部件、事件循环以及回调函数等。

        在Python中,使用Tkinter可以快速构建图形用户界面,让用户可以通过图形化的操作来使用和操作程序。同时,Tkinter也支持跨平台开发,可以在多种操作系统上使用,例如Windows、Linux和Mac OS X。总的来说,Tkinter是一个非常方便实用的GUI库,尤其适用于初学者和快速开发小型应用。

(3)Pillow库

        Pillow库是由从Python Imaging Library(PIL)分支出来的一个Python Imaging Library的分支,它提供了处理图像的基本功能,例如加载、显示、编辑、保存等。

        Pillow库支持多种常见的图像格式,可以处理各种类型的图像数据,包括位图、矢量图和RAW格式等。此外,Pillow库还提供了图像转换、颜色调整、滤波、错切变形、裁剪和缩放等一系列辅助功能。

        Pillow库的API简单易用,因此它非常适合用于处理图像的初学者和中级开发者。开发者可以通过Pillow库快速地添加图像处理的功能,使他们的应用能够支持更多的图像处理需求。

        总之,Pillow库是Python中处理图像和图像数据最常用最受欢迎的库之一。在构建需要处理图像和图形数据的应用时,使用Pillow库可以很快地完成一些复杂的任务,并将应用提升到更高的水平。

(4)Time库

        time库是Python中用于获取和操作时间的标准库。它提供了一系列函数,可以用于获取当前时间、计算时间差、格式化时间字符串等。

time库包含了很多方法,其中一些重要的方法如下:

  • time():返回当前时间的时间戳(从1970年1月1日开始的秒数)。

  • gmtime():返回当前时间的UTC时间元组。

  • localtime():使用本地时区返回当前时间的时间元组。

  • asctime():将时间元组转换为可读字符串形式。

  • strftime():将时间元组格式化为指定的格式。

  • sleep():使当前线程暂停指定的时间。

        使用time库可以获取当前时间、计算函数运行时间、进行时间戳转换等各种操作。time库是Python的标准库之一,不需要额外安装即可使用,而且它是处理时间的最基本、最常用的库之一。如果你需要在Python中操作时间,在熟练掌握它的使用后,time库将成为你的得力工具之一。

3.系统代码

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 对象,启动程序

4.效果展示

5.注意事项

        如果出现报错,首先检查需要是否缺失需要导入的包,如果有缺失,可以在终端安装:

        pip install 包名

        如果出现其他报错,检查一下你电脑的摄像头是否可用,以及检查摄像头是否正在被其他应用使用.

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐