OpenCV+MediaPipe实现手部关键点识别

目录
  • 可视化辅助函数
  • 单张图片
  • 摄像头检测
  • 改变关键点数据特征

可视化辅助函数

在下面的代码的注释内有大致的操作

基本操作与前面的人脸检测的操作相似,增加了可视化的辅助函数

import matplotlib.pyplot as plt
# 使用ipython的魔法方法,将绘制出的图像直接嵌入在notebook单元格中
import cv2

# 定义可视化图像函数
def look_img(img):
    '''opencv读入图像格式为BGR,matplotlib可视化格式为RGB,因此需将BGR转RGB'''
    img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(img_RGB)
    plt.show()

#调用摄像头拍照

time.sleep(2) # 运行本代码后两秒拍照

# 获取摄像头,0为电脑默认摄像头,1为外接摄像头
cap = cv2.VideoCapture(0)
# 从摄像头捕获一帧画面
success, image = cap.read()

# 关闭摄像头
cap.release()
# 关闭图像窗口
cv2.destroyAllWindows()

cv2.imwrite('photo.jpg', image)

#调用摄像头拍视频
import cv2
import time
# 定义逐帧处理函数,可不进行任何处理,直接将摄像头捕获的画面写入视频帧
def process_frame(img):
    return img
output_name = 'record_video.mp4'

# 获取摄像头,传入0表示获取系统默认摄像头
cap = cv2.VideoCapture(0)

# 打开cap
cap.open(0)

frame_size = (cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
fps = cap.get(cv2.CAP_PROP_FPS)

out = cv2.VideoWriter(output_name, fourcc, fps, (int(frame_size[0]), int(frame_size[1])))

# 无限循环,直到break被触发
while cap.isOpened():
    # 获取画面
    success, frame = cap.read()
    if not success:
        break

    # 对捕获的帧进行图像处理
    frame = process_frame(frame)

    ## 将帧写入视频文件中
    out.write(frame)

    # 展示处理后的三通道图像
    cv2.imshow('press q to break', frame)

    if cv2.waitKey(1) in [ord('q'), 27]:  # 按键盘上的q或esc退出(在英文输入法下)
        break
# 关闭图像窗口
cv2.destroyAllWindows()
out.release()
# 关闭摄像头
cap.release()
print('视频已保存', output_name)

单张图片

import cv2 as cv
import mediapipe as mp
import  tqdm
import time
import  matplotlib.pyplot as plt
def look_img(img):
    img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
    plt.imshow(img_RGB)
    plt.show()
# 手部关键点检测模型
mp_hand=mp.solutions.hands

# 导入模型
hands=mp_hand.Hands(static_image_mode=False,
                    max_num_hands=5,
                    min_detection_confidence=0.3,
                    min_tracking_confidence=0.3
                    )
# 导入绘图函数
mpDraw=mp.solutions.drawing_utils
img=cv.imread('hand2.png')
# look_img(img)
img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
results=hands.process(img_RGB)
if results.multi_hand_landmarks:
    for hand_idx in range(len(results.multi_hand_landmarks)):
        hand_21=results.multi_hand_landmarks[hand_idx]
        mpDraw.draw_landmarks(img, hand_21, mp_hand.HAND_CONNECTIONS)  # 可视化
look_img(img)
cv.imwrite('hands2.jpg',img)
# 在三维坐标系中可视化索引为0的手
mpDraw.plot_landmarks(results.multi_hand_landmarks[0], mp_

摄像头检测

import cv2
# mediapipe人工智能工具包
import mediapipe as mp
# 进度条库
from tqdm import tqdm
# 时间库
import time

# 导入模型
# 导入solution
mp_hands = mp.solutions.hands
# 导入模型
hands = mp_hands.Hands(static_image_mode=False,        # 是静态图片还是连续视频帧
                       max_num_hands=2,                # 最多检测几只手
                       min_detection_confidence=0.7,   # 置信度阈值
                       min_tracking_confidence=0.5)    # 追踪阈值
# 导入绘图函数
mpDraw = mp.solutions.drawing_utils

# 处理单帧函数

# 处理帧函数
def process_frame(img):
    # 水平镜像翻转图像,使图中左右手与真实左右手对应
    # 参数 1:水平翻转,0:竖直翻转,-1:水平和竖直都翻转
    img = cv2.flip(img, 1)
    # BGR转RGB
    img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # 将RGB图像输入模型,获取预测结果
    results = hands.process(img_RGB)

    if results.multi_hand_landmarks:  # 如果有检测到手
        # 遍历每一只检测出的手
        for hand_idx in range(len(results.multi_hand_landmarks)):
            hand_21 = results.multi_hand_landmarks[hand_idx]  # 获取该手的所有关键点坐标
            mpDraw.draw_landmarks(img, hand_21, mp_hands.HAND_CONNECTIONS)  # 可视化
        # 在三维坐标系中可视化索引为0的手
        # mpDraw.plot_landmarks(results.multi_hand_landmarks[0], mp_hands.HAND_CONNECTIONS)
    return img

# 导入opencv-python
import cv2
import time

# 获取摄像头,传入0表示获取系统默认摄像头
cap = cv2.VideoCapture(1)

# 打开cap
cap.open(0)

# 无限循环,直到break被触发
while cap.isOpened():
    # 获取画面
    success, frame = cap.read()
    if not success:
        print('Error')
        break

    ## !!!处理帧函数
    frame = process_frame(frame)

    # 展示处理后的三通道图像
    cv2.imshow('my_window', frame)

    if cv2.waitKey(1) in [ord('q'), 27]:  # 按键盘上的q或esc退出(在英文输入法下)
        break

# 关闭摄像头
cap.release()

# 关闭图像窗口
cv2.destroyAllWindows()

改变关键点数据特征

import cv2
# mediapipe人工智能工具包
import mediapipe as mp
# 进度条库
from tqdm import tqdm
# 时间库
import time
# 导入solution
mp_hands = mp.solutions.hands
# 导入模型
hands = mp_hands.Hands(static_image_mode=False,        # 是静态图片还是连续视频帧
                       max_num_hands=2,                # 最多检测几只手
                       min_detection_confidence=0.7,   # 置信度阈值
                       min_tracking_confidence=0.5)    # 追踪阈值
# 导入绘图函数
mpDraw = mp.solutions.drawing_utils

def process_frame(img):
    # 记录该帧开始处理的时间
    start_time = time.time()
    # 获取图像宽高
    h, w = img.shape[0], img.shape[1]
    # 水平镜像翻转图像,使图中左右手与真实左右手对应
    # 参数 1:水平翻转,0:竖直翻转,-1:水平和竖直都翻转
    img = cv2.flip(img, 1)
    # BGR转RGB
    img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    # 将RGB图像输入模型,获取预测结果
    results = hands.process(img_RGB)
    if results.multi_hand_landmarks:  # 如果有检测到手
        handness_str = ''
        index_finger_tip_str = ''
        for hand_idx in range(len(results.multi_hand_landmarks)):
            # 获取该手的21个关键点坐标
            hand_21 = results.multi_hand_landmarks[hand_idx]
            # 可视化关键点及骨架连线
            mpDraw.draw_landmarks(img, hand_21, mp_hands.HAND_CONNECTIONS)
            # 记录左右手信息
            temp_handness = results.multi_handedness[hand_idx].classification[0].label
            handness_str += '{}:{} '.format(hand_idx, temp_handness)
            # 获取手腕根部深度坐标
            cz0 = hand_21.landmark[0].z
            for i in range(21):  # 遍历该手的21个关键点
                # 获取3D坐标
                cx = int(hand_21.landmark[i].x * w)
                cy = int(hand_21.landmark[i].y * h)
                cz = hand_21.landmark[i].z
                depth_z = cz0 - cz
                # 用圆的半径反映深度大小
                radius = max(int(6 * (1 + depth_z * 5)), 0)
                if i == 0:  # 手腕
                    img = cv2.circle(img, (cx, cy), radius, (0, 0, 255), -1)
                if i == 8:  # 食指指尖
                    img = cv2.circle(img, (cx, cy), radius, (193, 182, 255), -1)
                    # 将相对于手腕的深度距离显示在画面中
                    index_finger_tip_str += '{}:{:.2f} '.format(hand_idx, depth_z)
                if i in [1, 5, 9, 13, 17]:  # 指根
                    img = cv2.circle(img, (cx, cy), radius, (16, 144, 247), -1)
                if i in [2, 6, 10, 14, 18]:  # 第一指节
                    img = cv2.circle(img, (cx, cy), radius, (1, 240, 255), -1)
                if i in [3, 7, 11, 15, 19]:  # 第二指节
                    img = cv2.circle(img, (cx, cy), radius, (140, 47, 240), -1)
                if i in [4, 12, 16, 20]:  # 指尖(除食指指尖)
                    img = cv2.circle(img, (cx, cy), radius, (223, 155, 60), -1)
        scaler = 1
        img = cv2.putText(img, handness_str, (25 * scaler, 100 * scaler), cv2.FONT_HERSHEY_SIMPLEX, 1.25 * scaler,
                          (255, 0, 255), 2 * scaler)
        img = cv2.putText(img, index_finger_tip_str, (25 * scaler, 150 * scaler), cv2.FONT_HERSHEY_SIMPLEX,
                          1.25 * scaler, (255, 0, 255), 2 * scaler)
        # 记录该帧处理完毕的时间
        end_time = time.time()
        # 计算每秒处理图像帧数FPS
        FPS = 1 / (end_time - start_time)
        # 在图像上写FPS数值,参数依次为:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        img = cv2.putText(img, 'FPS  ' + str(int(FPS)), (25 * scaler, 50 * scaler), cv2.FONT_HERSHEY_SIMPLEX,
                          1.25 * scaler, (255, 0, 255), 2 * scaler)
    return img
# 获取摄像头,传入0表示获取系统默认摄像头
cap = cv2.VideoCapture(0)
# 打开cap
cap.open(0)
# 无限循环,直到break被触发
while cap.isOpened():
    # 获取画面
    success, frame = cap.read()
    if not success:
        break
    frame = process_frame(frame)
    # 展示处理后的三通道图像
    cv2.imshow('my_window', frame)
    if cv2.waitKey(1) in [ord('q'), 27]:  # 按键盘上的q或esc退出(在英文输入法下)
        break
# 关闭摄像头
cap.release()
# 关闭图像窗口
cv2.destroyAllWindows()

以上就是OpenCV+MediaPipe实现手部关键点识别的详细内容,更多关于OpenCV MediaPipe手部关键点识别的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV MediaPipe实现颜值打分功能

    目录 颜值打分 摄像头实时检测颜值打分 达芬奇指标 摄像头实时达芬奇颜值指标 颜值打分 定义可视化图像函数 导入三维人脸关键点检测模型 导入可视化函数和可视化样式 将图像模型输入,获取预测结果 BGR转RGB 将RGB图像输入模型,获取预测结果 预测人人脸个数 获取脸上关键点轮廓的坐标,并且将相应的坐标标注出来,在标注点之间绘制连线(例如:左眼左眼角的识别点标号为33号) # 颜值打分--五眼指标 import cv2 as cv import mediapipe as mp import nu

  • opencv+mediapipe实现人脸检测及摄像头实时示例

    目录 单张人脸关键点检测 单张图像人脸检测 摄像头实时关键点检测 单张人脸关键点检测 定义可视化图像函数 导入三维人脸关键点检测模型 导入可视化函数和可视化样式 读取图像 将图像模型输入,获取预测结果 BGR转RGB 将RGB图像输入模型,获取预测结果 预测人人脸个数 可视化人脸关键点检测效果 绘制人来脸和重点区域轮廓线,返回annotated_image 绘制人脸轮廓.眼睫毛.眼眶.嘴唇 在三维坐标中分别可视化人脸网格.轮廓.瞳孔 import cv2 as cv import mediapi

  • OpenCV+MediaPipe实现手部关键点识别

    目录 可视化辅助函数 单张图片 摄像头检测 改变关键点数据特征 可视化辅助函数 在下面的代码的注释内有大致的操作 基本操作与前面的人脸检测的操作相似,增加了可视化的辅助函数 import matplotlib.pyplot as plt # 使用ipython的魔法方法,将绘制出的图像直接嵌入在notebook单元格中 import cv2 # 定义可视化图像函数 def look_img(img): '''opencv读入图像格式为BGR,matplotlib可视化格式为RGB,因此需将BGR

  • python+mediapipe+opencv实现手部关键点检测功能(手势识别)

    目录 一.mediapipe是什么? 二.使用步骤 1.引入库 2.主代码 3.识别结果 补充: 一.mediapipe是什么? mediapipe官网 二.使用步骤 1.引入库 代码如下: import cv2 from mediapipe import solutions import time 2.主代码 代码如下: cap = cv2.VideoCapture(0) mpHands = solutions.hands hands = mpHands.Hands() mpDraw = so

  • python+opencv实现的简单人脸识别代码示例

    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image): '''检测图片,获取人脸在图片中的坐标''' grayscale = cv.CreateImage((image.width, image.height), 8, 1) cv.CvtColor(image, grayscale, cv.CV_BGR2GR

  • Tensorflow实现卷积神经网络用于人脸关键点识别

    今年来人工智能的概念越来越火,AlphaGo以4:1击败李世石更是起到推波助澜的作用.作为一个开挖掘机的菜鸟,深深感到不学习一下deep learning早晚要被淘汰. 既然要开始学,当然是搭一个深度神经网络跑几个数据集感受一下作为入门最直观了.自己写代码实现的话debug的过程和运行效率都会很忧伤,我也不知道怎么调用GPU- 所以还是站在巨人的肩膀上,用现成的框架吧.粗略了解一下,现在比较知名的有caffe.mxnet.tensorflow等等.选哪个呢?对我来说选择的标准就两个,第一要容易安

  • OpenCV+face++实现实时人脸识别解锁功能

    本文实例为大家分享了OpenCV+face++实现实时人脸识别解锁功能的具体代码,供大家参考,具体内容如下 1.背景 最近做一个小东西,需要登录功能,一开始做的就是普通的密码登录功能,但是之前看到过python可以做人脸识别,所以我就开了下脑洞,能不能实现一个自己的刷脸解锁功能. 2.知识储备 python基础语法 opencv face++文档 requests库 3.基本思路 准备一张你想要被识别出的人脸照片,后面刷脸就是按照这张照片来识别,如果和照片中是同一个人就解锁,刷脸就是打开摄像头获

  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num

  • python opencv实现信用卡的数字识别

    本项目利用python以及opencv实现信用卡的数字识别 前期准备 导入工具包 定义功能函数 模板图像处理 读取模板图像 cv2.imread(img) 灰度化处理 cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 二值化 cv2.threshold() 轮廓 - 轮廓 信用卡图像处理 读取信用卡图像 cv2.imread(img) 灰度化处理 cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 礼帽处理 cv2.morphologyEx(gray

  • Python 使用Opencv实现目标检测与识别的示例代码

    在上章节讲述到图像特征检测与匹配 ,本章节是讲述目标检测与识别.后者是在前者的基础上进一步完善. 在本章中,我们使用HOG算法,HOG和SIFT.SURF同属一种类型的描述符.功能代码如下: import cv2 def is_inside(o, i): ox, oy, ow, oh = o ix, iy, iw, ih = i # 如果符合条件,返回True,否则返回False return ox > ix and oy > iy and ox + ow < ix + iw and o

随机推荐