目录
1 实验目的
使用OpenCV库来获取摄像头的视频流,并通过手势分析来快速准确地检测出1至5的手势。该程序通过采集视频帧并对其进行处理来分析手势。它使用图像处理算法来提取手势的形状,并根据手部的位置和轮廓来确定手势是哪个数字。运行程序后,摄像头将启动,并在摄像头下方的区域显示视频流。将手放在这个区域中,并展示你想识别的数字。程序会在摄像头捕捉到手势后立即返回相应的数字。虽然这种方法没有使用机器学习技术,但同样可以识别手势,并且运算速度较快,适合在一些低配置的设备上进行使用。
2 项目介绍
本项目目前使用到和未来可能使用的第三方库或者模块有:
库 |
介绍 |
tkinter |
Tkinter是Python内置的GUI库,它提供了一个简单、易于使用的界面设计工具,可以创建各种窗口和控件,如文本框、标签、按钮等,方便用户与程序交互。Tkinter是Tcl/Tk GUI工具包在Python中的接口,Tcl/Tk是一个跨平台的图形用户界面(GUI)工具包,它是在现代操作系统中提供标准GUI工具包的一种选择。 |
cv2(OpenCV) |
OpenCV是一个基于开源发行的跨平台计算机视觉库,包含了数百个计算机视觉算法和工具,它可以跨平台使用,并提供了Python、C++等语言支持,常用于图像和视频处理、目标检测、人脸识别等方面的应用程序开发。cv2是Python中OpenCV库的接口,可以使用Python调用OpenCV提供的算法库和工具,用来完成各种计算机视觉任务,包括: 1)图像和视频读写、显示和保存 2)图像预处理、滤波和边缘检测 3)物体检测和跟踪、人脸识别、光流估计等 4)图像变换和几何变换 5)相机标定和姿态估计等 |
PIL(pillow) |
Image库是PIL中最核心的库之一,用于读取、处理和保存图像数据。 以下是一些Image库的主要功能: 打开和保存图像文件,支持JPEG、PNG、BMP、GIF、ICO和TIFF等格式。 1)提供了基本的图像处理方法,如裁剪、旋转、缩放、镜像、转换为黑白图等。 2)提供了滤镜效果,如模糊、轮廓、锐化、浮雕、柔化、颜色空间转换等。 3)支持像素级别的操作,包括像素的读取、修改、合并等。 4)支持文本渲染、字体调用和排版等。 |
ImageTk是Python的一个模块,用于将PIL库的图像转换为Tkinter库中的图像格式,方便在Tkinter GUI程序中显示和操作图像。 |
|
sklearn.metrics |
sklearn.metrics是Scikit-learn库的一个模块,提供了一系列的评估指标和工具,用于评估模型的性能和质量,包括分类、回归、聚类等算法的评估。 |
sys |
sys是Python中的一个内置模块,提供了对Python解释器的访问和控制,包括操作系统、环境变量、标准输入输出等功能。 |
numpy |
NumPy是Python的一个非常重要的数值计算库,提供了各种多维数组操作、线性代数、傅里叶变换、随机数生成等函数,是数据分析、科学计算和机器学习等领域中必不可少的工具之一。NumPy的核心是ndarray(N-dimensional array,多维数组),是一个具有相同类型和大小的元素网格。 |
SciPy |
SciPy 是一个开源的,基于 Python 的计算生态系统,用于执行科学、工程和技术计算。它构建在 NumPy 库之上,为高级计算提供了许多实用的模块和函数。这些模块包括线性代数、优化算法、信号和图像处理、统计和随机模拟等,比如图像二值化和形态学操作等。 |
表1 此项目所涉及的第三方库或模块
用到的方法 |
用法 |
root = tk.Tk() |
使用 tkinter 模块创建了一个 GUI 窗口的根节点对象(即一个 Tk() 对象)。 |
root.geometry("宽x高+ X轴偏移量+ Y轴偏移量") |
设置窗口位置和大小的方法:“宽”表示窗口的宽度;“高”表示窗口的高度;“ X轴偏移量”表示窗口左上角相对于屏幕左边缘的横向偏移量;“Y轴偏移量”表示窗口左上角相对于屏幕上边缘的纵向偏移量。root.geometry('400x400')只设置宽度和高度,不设置偏移量,这样窗口将会出现在屏幕的中央 |
root.title("窗口标题") |
设置窗口的标题,即在窗口的顶部栏中显示的文字。 |
filedialog.askopenfilename() |
方法用于打开一个文件对话框,并返回用户所选择文件的路径。该方法有以下参数:initialdir指定对话框中显示的初始目录;title指定对话框的标题;filetypes指定要显示哪些类型的文件,这里限定只能选择.jpg和.png两种类型的文件。iledialog.askopenfilename(initialdir='/',title='SelectImage', filetypes=(('JPEG iles', '*.jpg'), ('PNG files', '*.png'))) |
background=frame.copy(). astype("float") |
这行代码将一个名为"frame"的变量复制,并将其转换为浮点类型,并将其分配给名为"background"的新变量。这可能是用于计算视频分离技术中的背景模型的一部分。 |
root.mainloop() |
进入窗口事件循环,等待并处理用户的交互,直到窗口被关闭为止,必须调用的方法。在创建窗口和完成窗口设置之后,该方法将进入一个无限循环,等待处理窗口事件(如鼠标点击、键盘按键、窗口关闭等)。只有当窗口被关闭时,该循环才会停止。 |
cv2.accumulateWeighted( frame, background, accumulated_weight) |
这段代码使用了OpenCV中的accumulateWeighted函数,用于在获取视频流过程中实时计算当前视频帧和背景的加权平均值,以更新背景模型。frame是当前读取的视频帧,background是当前背景模型,accumulated_weight是加权平均值的系数。通过计算加权平均值,程序可以利用背景模型来准确分析视频帧中的移动对象。随着时间的推移,背景模型将因为被动了多次而不断更新,以适应环境中的变化和移动对象。 |
cv2.absdiff(background. astype('uint8'), frame) |
这段代码使用了OpenCV中的absdiff函数,用于计算两个图像的差异(绝对值差分)。background是背景模型,即计算平均加权值得到的图像;frame是当前读取的视频帧。函数会返回两个图像的差分结果,表示这两个图像之间的绝对值差异。通过计算背景模型和当前视频帧之间的差异,程序可以检测到当前视频帧中的像素变化,例如移动对象、光线变化等。 |
ret, thresholded = cv2.threshold( |