文章目录

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

可视化辅助函数

在下面的代码的注释内有大致的操作
基本操作与前面的人脸检测的操作相似,增加了可视化的辅助函数


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转RGBimg_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_utilsdef process_frame(img):# 记录该帧开始处理的时间start_time = time.time()# 获取图像宽高h, w = img.shape[0], img.shape[1]# 水平镜像翻转图像,使图中左右手与真实左右手对应# 参数 1:水平翻转,0:竖直翻转,-1:水平和竖直都翻转img = cv2.flip(img, 1)# BGR转RGBimg_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].labelhandness_str += '{}:{} '.format(hand_idx, temp_handness)# 获取手腕根部深度坐标cz0 = hand_21.landmark[0].zfor 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].zdepth_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 = 1img = 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()# 计算每秒处理图像帧数FPSFPS = 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:breakframe = 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手部关键点识别相关推荐

  1. 【机器视觉案例】(15) 虚拟答题板,手部关键点识别,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv+Mediapipe 制作虚拟问答,先放张图看效果. 当食指在某个答案框内部,并且食指指尖和中指指尖之间的距离小于预设值,那么就认为是点击该答案框, ...

  2. 集成华为手部关键点识别服务轻松识别手语字母

    集成华为手部关键点识别服务轻松识别手语字母 介绍 华为机器学习(ML Kit)提供手部关键点识别服务,可用于手语识别.手部关键点识别服务能识别手部21个关键点,通过每个手指的方向和手语规则作比较去找手 ...

  3. 看手相不?【人体分析-手部关键点】JavaAPI示例

    手相其源有西洋.印度和中国三支,中国民间的手相学源远而流长,终成博杂大观.掌纹也会随着时间发生变化.看手相分男左女右,拿男生举例子,35岁之前看左手,35之后看右手(女生相反). 接口说明可以参考 h ...

  4. MMPose姿态估计+人体关键点识别效果演示

    MMPose--开源姿态估计算法库(附人体关键点识别效果演示) 一.简介 1.1 背景 首先姿态估计属于计算机视觉领域的一个基础研究方向.MMPose是基于Pytorch的姿态估计开源算法库,功能全, ...

  5. 机器视觉 手部关键点检测(手部识别)安卓应用App(Hand Tracking)基于mediapipe。

    目录 前言 一.下载APP! 二.安装后使用结果: 三.总结 前言 安卓系统手机实现对手部关键点的识别. 一.下载APP! csdn下载:Hand Tracking 百度网盘下载:链接:https:/ ...

  6. 【MediaPipe】(1) AI视觉,手部关键点实时跟踪,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe完成手部关键点实时检测跟踪.先放张图看效果,15代表FPS值. 1. 导入工具包 # 安装opencv pip install opencv-c ...

  7. OpenCV手部关键点检测(手势识别)代码示例

    点击我爱计算机视觉标星,更快获取CVML新技术 前几日分享了learnopencv.com博主Satya Mallick发表的关于OpenCV Mask RCNN实例分割的博文(详见:OpenCV4. ...

  8. python dlib人脸检测_使用Python+OpenCV+Dlib实现人脸检测与人脸特征关键点识别

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,我们将学习如何检测图像中的人脸并提取面部特征,如眼睛.鼻子. ...

  9. 使用Python+OpenCV+Dlib实现人脸检测与人脸特征关键点识别

    今天,我们将学习如何检测图像中的人脸并提取面部特征,如眼睛.鼻子.嘴巴等.我们可以将这些信息作为一个预处理步骤来完成,例如捕捉照片中人物的人脸(手动或通过机器学习),创建效果来"增强&quo ...

最新文章

  1. ORA-01919: role 'PLUSTRACE' does not exist
  2. ubantu 添加防火墙策略_企业环境下用脚本设置ubuntu防火墙
  3. VB动态添加WebBrowser控件,并拦截弹出窗口(不用引用任何组件)
  4. 乐高小颗粒履带机器人_玩转乐高大颗粒积木(四十二)——乐高不倒翁、轮式是挖掘机、大颗粒皮筋车...
  5. 逻辑卷、物理卷、卷组相关操作
  6. 在 Flutter 中更改文本的字体系列
  7. 问题 | CondaHTTPError: HTTP 404 NOT FOUND for url
  8. import cv2找不到模块的解决方法
  9. 怎么解决64位Access与32位不能同时安装的问题
  10. iostat来对linux硬盘IO性能进行了解
  11. 网络资源-深入剖析Binding2(学习)
  12. 信息学奥赛一本通(1006:A+B问题)
  13. Fedora上配置一个安全FTP
  14. JavaScript的可变参数介绍
  15. PIC16F877A开发板 数码管计数器实验
  16. mysql sql语法区别_sql和mysql语法有什么不同
  17. OpenGL 编程指南 ( 原书第 9 版 ) --- 第一章
  18. c语言数值常量4.5e0,c语言数值常量表示方法问题
  19. 闲谈mac地址学习以及IVL/SVL
  20. Android 蓝牙手柄 延迟,安卓免设置,0.15s低延迟,飞智银狐蓝牙耳机体验

热门文章

  1. php mongodb execute,php简单操作mongodb
  2. HarmonyOS 实现跑马灯效果
  3. Cause:compileSdkVersion is not specified
  4. window10 系统查看控制面板的方法
  5. Scala函数式编程(三) scala集合和函数
  6. 【动态规划】Part1
  7. 51单片机 小车 L298N pwm调速 串口控制 按键控制
  8. RzPageControl 关闭按钮
  9. Android 5.0新特性之沉浸式状态栏
  10. YTU 2723: 默认参数--求圆的面积