使用Mediapipe对图像进行手部地标检测-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
总结
在本文中,我们将使用深度库(即Mediapipe)作为基本库,并使用计算机视觉预处理的其他CV2库来创建手部地标检测模型。市场上有很多关于这个问题的用例,例如与业务相关的虚拟现实和游戏部分的实时体验。
行业使用案例
1.智能家居:这是计算机视觉的现代使用案例之一。人们使用智能家居来过更舒适的生活,这就是为什么智能家居不再是一个利基领域,但它也在向普通家庭传播。
2.智能电视:我们经常看到这样的用例。您可以使用手势更改音量.频道等。
3.游戏:为了获得真实体验,这项技术越来越多地融入到互动游戏中。
让我们构建我们的手检测模型
导入库
在这里,我们将导入整个管道中所需的所有库。
导入cv2
将numpy导入为np
将mediapipe导入为mp
将matplotlib.pyplot导入为plt
使用Mediapipe初始化手的地标检测模型
第一步是使用有效参数初始化模型。无论我们使用什么检测技术,它都可以是Mediapipe或Yolo。初始化模型很重要。遵循同样的原则。我们将遵循所有给定步骤:
#第一步是初始化Hands类并将其存储在变量中
mp_手=mp.solutions.hands
#现在第二步是设置指针功能,该功能将保持地标点
hands=mp_hands。hands(静态_图像_模式=True,最大_num_手=2,最小_检测_置信度=0.3)
#最后一步是在图像上设置手标志的绘制功能
mp_drawing=mp.solutions.drawing_utils
代码分解:
1.首先,使用mp.solutions。hands初始化变量mphands。然后使用相同的变量通过mp为hands设置函数。解决。手。手()。
2.到目前为止,我们已经了解了手模型初始化的结构。现在让我们深入研究函数中使用的参数手。
·Static _image _mode:此参数将布尔值作为其有效值,即可以为true或false。处理视频流时,默认条件为False,这意味着它将减少处理延迟,也就是说,它将继续关注特定的手并定位同一只手,直到它跟踪的手消失。当我们必须在实时流或视频中检测手时,这可能是有益的。根据我们的要求,我们必须检测图像上的地标,因此我们将该值设置为True。
·Max_num_hands:此参数表示模型在实例中检测到的最大手数。默认情况下,该值为2,这也是有意义的。虽然我们可以改变它,但我们希望至少检测到一只手。
·Min_detection_confidence:它提供置信水平的阈值。最小检测置信度的理想范围为[0.0,1.0]。默认情况下,它保持在0.5,这意味着如果置信度小于50%,则在输出图像中不会检测到手。
最后,我们将使用mp.solutions。drawing_utils,它将负责绘制输出图像上的所有手标志。这些地标由我们的Hands功能检测。
读取图像
这里,我们将首先使用cv2.imread()读取要执行手部检测的图像,并使用matplotlib库显示特定的输入图像。
#读取我们将对其执行检测的样本图像
sample_img=cv2.imread(‘媒体/sample.jpg’)
#这里我们指定了图形的大小,即10-高度10-宽度。
plt.figure(图=〔10,10〕)
#这里我们将显示示例图像作为输出。
plt.title(“样本图像”)plt.轴(“关闭”)plt.imshow(示例_ img〔:,::-1〕)plt.show()
输出:
执行手标志检测
因此,现在我们已经初始化了手部检测模型,下一步将处理输入图像上的手部地标检测,并使用上述初始化模型在图像上绘制所有21个地标。我们将完成以下步骤。
结果=hands.process(cv2.cvtColor(样本_img,cv2.COLOR_BGR2RGB))
如果结果。多个手标志:
对于手牌不,手牌在枚举(results.multi-手牌
印刷品(‘)
对于范围(2)中的i:
打印(f’{mp}hands.HandLandmark(i).name}:’)
print(f’{hand_landmarks。landmark〔mp_hands。HandLandmark(i).value〕}’)
输出:
代码分解:
1.首先,我们使用Mediapipe库中的process函数将手标志检测结果存储在变量结果中。同时,我们将图像从BGR格式转换为RGB格式。
2.进入下一步时,我们将首先检查一些验证,以查看是否检测到点,即变量结果应存储一些结果。
3.如果是,我们将遍历图像中检测到手标志的所有点。
4.现在在另一个循环中,我们可以看到只有两次迭代,因为我们只想显示手的两个地标。
5.最后,我们将根据需要打印出所有检测到的和过滤过的地标。
通过上述处理,我们发现所有检测到的地标都被归一化为一个共同的尺度。但现在对于客户端来说,这些缩放点是不相关的,因此我们将这些地标恢复到其原始状态。
图片高度,图片宽度,样本形状
如果结果。多个手标志:
对于手_否,枚举中的手_界标(results.multi-手_界碑):
打印(f’手号:{手号+1}’)
印刷品(‘)
对于范围(2)中的i:
打印(f’{mp}hands.HandLandmark(i).name}:’)
打印(f’x:{hand_landmarks.landmarks[mp_hands_hand landmark(i).value].x*image_width}’)
print(f’y:{hand_landmarks.landmarks[mp_hands.HandLandmark(i).value].y*image_height}’)
print(f’z:{hand_landmarks.landmarks〔mp_hands.HandLandmark(i).value〕.z*image_width}n’)
输出:
代码分解:
我们只需要在这里执行一个额外的步骤,也就是说,我们将从我们定义的示例图像中获得图像的原始宽度和高度,然后所有步骤都将与我们之前所做的相同,唯一的区别是现在没有标点符号的特殊缩放。
在图像上绘制地标
由于我们已经从上述预处理中获得了手部地标,现在是时候执行我们的最后一步了,即在图像上绘制点,以便我们可以直观地看到我们的手部地标记检测模型是如何实现的。
img_copy=sample_img.copy()
如果结果。多个手标志:
对于手_否,枚举中的手_界标(results.multi-手_界碑):
mp_drawing。draw_地标(图像=img_副本,地标_列表=手_地标记
连接=mp_手。手_连接)
图=plt.figure(图=〔10,10〕)
plt.title(“合成图像”)plt.轴(“关闭”)plt.imshow(img _副本〔:,:,:-1〕)plt.show()
输出:
代码分解:
1.首先,我们将创建原始图像的副本。这一步是出于安全目的,因为我们不想失去图像的原创姓。
2.然后我们将处理之前完成的验证工作。
3.然后我们将手拿着手走过每个地标。
4.最后,借助mp_draw_landmarks函数,我们将在图像上绘制地标。
5.是时候使用matplotlib绘制图像了。首先,我们将给出图形大小(这里是宽度-10和高度-10)。然后,最后,我们将画画。imshow将BGR格式转换为RGB格式后,图像将使用该函数,因为它对RGB格式更有意义。
结论
在整个流水线中,我们首先初始化模型,然后读取图像,查看输入图像,然后执行预处理。我们减少了地标,但这些点与用户无关,因此我们将它们恢复到原始状态,最后我们将在图像上绘制地标。
600学习网 » 使用Mediapipe对图像进行手部地标检测-600学习网