OpenCV手部识别中各个函数功能

接上一个博文,对里面的函数做出简单的解释

首先来介绍所用到的两个库

OpenCV

全称Open Source Computer Vision Library,是一个开源的计算机视觉库,它实现了很多计算机视觉和机器学习方面的通用算法。该库是用C++语言编写的,但是也提供了Python、Java、MATLAB等其他语言的接口。

OpenCV具有以下优点:

      1.具有跨平台的特性,可以在Linux、Windows、Android、Mac OS等操作系统上运行。它主要用于实时视觉应用,并且利用MMX和SSE指令优化了性能。

      2.提供了大量的图像处理函数,包括滤波、色彩空间转换、特征检测等。此外,OpenCV还包括一些常用的机器学习模块,例如正态贝叶斯、K最近邻、支持向量机等。

OpenCV的应用领域非常广泛,包括但不限于图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。由于其强大的功能和广泛的应用,OpenCV已经成为计算机视觉领域最有力的研究工具之一。

Mediapipe

MediaPipe是一个开源项目,提供跨平台的常用机器学习方案。它实际上是一个集成的机器学习视觉算法的工具库,包含了人脸检测、人脸关键点、手势识别、头像分割和姿态识别等各种模型。

MediaPipe具有以下优点:

  1. 支持各种平台和语言:包括IOS,Android,C++,Python,JAVAScript,Coral等。
  2. 速度快:各种模型基本上可以做到实时运行。

此外,MediaPipe还依赖OpenCV来处理视频,FFMPEG来处理音频数据。它还依赖其他库,如OpenGL/Metal、Tensorflow、Eigen等。在实际应用中,MediaPipe已被用于多种产品中,如Netcom的感知系统、谷歌镜头的目标检测、增强现实广告、谷歌图片、谷歌Home、Gmail、云视觉API等。

hand.py

cv2.VideoCapture()

OpenCV(一个强大的计算机视觉库)中的一个函数,用于从视频文件中读取帧。这个函数通常用于处理视频流或者从摄像头捕获视频。
基本语法:camera = cv2.VideoCapture(video_file_path)


其中,video_file_path`是视频文件的路径。如果视频文件在当前目录下,你可以直接传入文件名(例如 'my_video.mp4')。如果视频文件在其他位置,你需要提供完整的文件路径。你也可以使用 cv2.VideoCapture(0)来从默认摄像头捕获视频。这里的 0 是设备编号,你可以根据需要更改它来选择不同的摄像头。注意,OpenCV 使用的是 OpenCV 的默认设置来打开摄像头,所以你可能需要调整一些参数(例如帧率、分辨率等)来满足你的需求。

camera.isOpened()

检查是否成功打开视频设备:使用camera.isOpened()函数检查 VideoCapture 对象是否成功打开视频设备。如果打开成功,该函数将返回 True,否则返回 False。

cv2.flip() 

OpenCV中用于翻转图像的函数,它可以沿着水平或垂直方向翻转图像

参数包括:

src:输入图像,必须是一个 NumPy 数组。
flipCode:翻转的代码,它是一个整数。当 flipCode 为 0 时,图像进行垂直翻转(上下翻转)。当 flipCode 为 1 时,图像进行水平翻转(左右翻转)。当 flipCode 为 -1 时,图像同时进行水平和垂直翻转。
dst:输出图像,可选参数。如果提供了这个参数,那么函数会返回输出图像。否则,它会直接修改输入图像。

注意:cv2.flip() 函数不会检查输入图像是否为空,所以在调用该函数之前,最好确保输入图像已经被正确地读取或创建。

camera.read()

读取视频帧:使用camera.read()函数读取视频帧。该函数将返回一个布尔值和一个图像对象。如果成功读取视频帧,该函数将返回 True,并将图像对象存储在img变量中。如果无法读取视频帧,该函数将返回 False。

get()

在Python编程中,get()函数是字典对象中用于检索指定键对应的值的方法。它的语法为dict.get(key,[default]),其中:
    ●    key:要检索的键。
    ●    default(可选):如果键不存在时返回的默认值。如果不提供default参数,函数将返回None。

cv2.circle()

函数是OpenCV库中用于在图像中绘制圆形的函数之一。它的语法为:
cv2.circle(img, center, radius, color, thickness, lineType, shift)
该函数的参数解释如下:

主要参数
    ●    img:要绘制圆形的图像。
    ●    center:圆心的坐标,格式为(x, y)。
    ●    radius:圆的半径。

可选参数
    ●    color:圆的颜色,通常以BGR格式表示。
    ●    thickness:圆的线条粗细。可以使用cv.FILLED来填充圆
    ●    lineType:线条的类型。默认情况下为8连接线。
    ●    shift:线条的透明度,默认是0

cv2.imshow()

函数将显示指定的图像,并将其显示在指定的窗口(以Video命名的窗口)中。

语法:cv2.imshow(Video,img)

参数说明:
    ●    Video:窗口的名称,用于标识窗口。
    ●    img:要显示的图像。

cv2.waitkey()

用于等待用户按下键盘上的按键

语法:k = cv2.waitkey(delay)

其中,delay 是等待的时间(以毫秒为单位)。如果将 delay 设置为 0,则函数会一直等待用户按下键盘上的按键。如果将 delay 设置为负数,则函数会立即返回。
当用户按下键盘上的按键时,cv2.waitKey() 函数会返回按键的 ASCII 码值并赋值给k。如果用户按下了特殊键(如 Esc 键、Ctrl+C 键等),则函数会返回特定的整数值。

ord()

主要用来返回对应字符的 ASCII 码值或Unicode数值

扩展:Unicode是一种通用的字符编码标准,旨在为世界上所有脚本和语言中的每个字符提供一个唯一的数值标识,称为代码点(code point)。它使用十六进制数值表示每个字符的代码点,例如,拉丁字母大写字母“A”的代码点是U+0041,希腊字母大写字母“Ω”的代码点是U+03A9。

camera.release()

释放VideoCapture对象,解除程序占用摄像头,以释放资源

cv2.destroyAllWindows()

OpenCV 库中的一个函数,用于关闭所有由 OpenCV 创建的窗口
当你使用 OpenCV 进行图像处理和显示时,可能会创建多个窗口来显示图像、视频或其他可视化内容。cv2.destroyAllWindows() 函数可以一次性关闭所有这些窗口,释放相关资源。
使用该函数可以确保在程序结束时,所有 OpenCV 创建的窗口都被正确关闭,以避免资源泄漏和其他潜在问题。
需要注意的是,cv2.destroyAllWindows() 函数不会关闭由其他库或应用程序创建的窗口。如果你在程序中使用了其他图形界面库(如 Tkinter、PyQt 等)创建的窗口,你需要使用相应库提供的方法来关闭这些窗口。

handms.py

mp.solutions.hands.Hands()

手部检测和追踪解决方案

一个用于手部关键点检测的函数,其返回值和参数如下:
    ●    MULTI_HAND_LANDMARKS(multi_hand_landmarks)被检测/跟踪的手的集合,其中每只手被表示为21个手部地标的列表,每个地标由x、y、z组成。x和y分别由图像的宽度和高度,Z表示地标深度(距离摄像头的远近)。
    ●    MULTI_HANDEDNESS(multi_handedness)被检测/追踪的手是左手还是右手的集合。返回classification每只手由label(标签)和score(分数,可理解为是该只手的概率大小)组成。label是'Left'或'Right'值得字符串。
该函数的默认参数static_image_mode为False,将输入图像视为视频流。它将尝试在第一个输入图像中检测手,并在成功检测后进一步定位手的坐标。在随后的图像中,它只是简单地跟踪那些地标,而不会调用另一个检测,直到失去对目标的跟踪,可以减少计算和延迟。

mediapipe.solutions.hands.Hands()函数的参数有以下几个:
    ●    static_image_mode:默认为False,将输入图像视为视频流。它将尝试在第一个输入图像中检测手,并在成功检测后进一步定位手的坐标。在随后的图像中,一旦检测到所有max_num_hands手并定位了相应的手的坐标,它就会跟踪这些坐标,而不会调用另一个检测,直到它失去对任何一只手的跟踪。这减少了延迟,非常适合处理视频帧。
    ●    max_num_hands:默认2,表示最多检测几只手。
    ●    model_complexity:参数值为0或1,表示模型的复杂度,0代表轻量级模型,1代表全功能模型。
    ●    min_detection_confidence:参数值为0到1之间的浮点数,表示最低检测的置信度。
    ●    min_tracking_confidence:参数值为0到1之间的浮点数,表示最低追踪的置信度。

cv2.cvtColor()

用于将图像从一个颜色空间转换到另一个颜色空间

语法:cv2.cvtColor(src,code,dstCn0)

参数说明:
    ●    src:输入图像,可以是 numpy.ndarray 或 cv2Mat 对象。
    ●    code:颜色转换代码,表示要进行的颜色空间转换。可以是以下值之一:
          cv2.COLOR_BGR2RGB:将 BGR(蓝、绿、红)图像转换为 RGB(红、绿、蓝)图像。
          cv2.COLOR_BGR2GRAY:将 BGR 图像转换为灰度图像。
          cv2.COLOR_RGB2BGR:将 RGB 图像转换为 BGR 图像。
          cv2.COLOR_RGB2GRAY:将 RGB 图像转换为灰度图像。
          cv2.COLOR_GRAY2BGR:将灰度图像转换为 BGR 图像。
          cv2.COLOR_GRAY2RGB:将灰度图像转换为 RGB 图像。
    ●    dstCn:目标图像的通道数。如果为 0,则根据转换代码自动选择目标通道数。
cv2.cvtColor() 函数将输入图像转换为指定的颜色空间,并返回转换后的图像。在进行颜色空间转换时,它会根据需要进行像素值的转换和舍入。

self.hand_detector.process(img_rgb)

用于处理手部检测和跟踪的数据。该方法会返回一个布尔值,表示处理是否成功
这个方法通常是在使用 mediapipe的手部检测和跟踪功能时调用的。它接受一个cv2.VideoCapture 对象或图像作为输入,并返回一个  mp.solutions.hands.Hands 对象,其中包含了检测到的手部数据。

mp.solutions.draw_utils.draw_landmarks()

用于在图像上绘制地标(人脸关键点或其他对象的关键点)。
这个函数通常在计算机视觉和图像处理中使用,特别是在人脸检测和跟踪等应用中。它接受一个图像、一个地标列表和一个可选的颜色列表作为输入,并在图像上绘制出地标。

这个函数通常在使用mediapipe进行面部地标检测或其他地标检测任务时使用。

以下是 draw_landmarks() 函数的一般语法:
draw_landmarks(
    image: np.ndarray,
    landmarks: List[Tuple[float, float]],
    landmark_color: Tuple[float, float, float] = (0, 255, 0),
    connection_color: int = 2
)
image: 要绘制地标到的图像数据。这可以是一个 numpy 数组或 OpenCV 的图像对象。

landmarks: 一个包含所有关键点信息的mediapipe类型对象,例如mediapipe.solutions.face_mesh.FaceMesh或mediapipe.solutions.hands.Hands。

landmark_color: 地标颜色,通常是一个 RGB 元组表示颜色。

connection_color: 连接线颜色,传入参数mp.solutions.hands.HAND_CONNECTIONS

可将各个点连起来,通常是一个 RGB 元组表示颜色。

multi_hand_landmarks[i].landmark

mediapipe.solutions.hands模块中Hands类的一个属性,用于获取手部关键点的坐标,它包含了多只手的所有指尖和关节的坐标信息。这些坐标可以用于绘制出手的轮廓和各个指尖的位置,以便进行手势识别、手部跟踪等操作。

enumerate() 

 Python 中的一个内置函数,用于将一个可遍历的数据对象(如列表、元组或字符串等)组合为一个索引序列,同时列出数据的索引和数据,一般用在 for 循环当中。
enumerate函数的语法格式如下:


enumerate(sequence, start=0)


参数sequence表示一个可变量的对象,start表示索引开始值,为非必须参数,默认为 0 。

猜你喜欢

转载自blog.csdn.net/sunjianghan/article/details/135334211
今日推荐