OpenCV 资料:

OpenCV 官方文档索引

OpenCV 官方文档 4.10.0

OpenCV 教程 4.10.0

OpenCV-Python 教程 4.10.0 我优先学这个

OpenCV第三方中文文档 (woshicver.com)

第三方中文文档 apachecn.github.io/opencv-doc-zh/

OpenCV中文论坛 https://www.opencv.org.cn/

Mediapipe 官方资料:

MediaPipe 解决方案指南 | Google AI Edge | Google AI for Developers

MediaPipe Studio (google.com)

0.配置:

IDE:PyCharm

Python解释器:python3.8.10

1.下载安装mediapipe

1
pip install mediapipe

2.下载 Handmarker手部模型包 ,包含两个打包的模型:手掌检测模型和手部特征点检测模型。

有关该 Handmarker手部模型包 的介绍:

  1. 模型卡片(MediaPipe Hands (Lite/Full))

  2. 该模型可检测已检测到的手部区域内 21 个手指节坐标(如下图所示)的关键点定位。该模型基于大约 3 万张真实图像以及对各种背景施加的几个渲染的合成手部模型进行了训练。

  3. 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部,手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。

    由于运行手掌检测模型非常耗时,因此在视频或直播跑步模式下,手部特征点会在一帧中使用手部特征点模型定义的边界框,以便为后续帧定位手部区域。仅当手部特征点模型不再识别出手部的存在或未能跟踪画面中的手部时,手部特征点才会重新触发手掌检测模型。这样可以减少手动标志器触发手掌检测模型的次数。

3.然后下载 手势分类模型包 。这个模型可以识别7种手势:👍, 👎, ✌️, ☝️, ✊, 👋, 🤟

有关该 手势分类模型包 的介绍:

  1. 模型卡片(MediaPipe Hand Gesture Classification)

获取视频流部分:

1
pip install opencv-python

1.下面是一段 使用 OpenCV 获取视频流 基础框架:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 导入OpenCV库
import cv2

# 打开摄像头(0为默认,1为设备列表第二个摄像头,以此类推;)
cap = cv2.VideoCapture(0)

# 主进程:
while True:
ret, img = cap.read() # 读取摄像头的图像帧
img = cv2.flip(img, 1) # 对img图像进行水平翻转
if ret:
cv2.imshow('img', img) # 显示处理后的图像

if cv2.waitKey(1) == ord('q'):
break # 如果按下 'q' 键,则退出循环

2.如果你想显示一段循环代码运行时的帧率:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 导入time库(python自带库)
import time

pTime = 0
cTime = 0

while True:
cTime = time.time() # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)
# if cTime - pTime != 0: (如有必要就加上)
fps = 1 / (cTime - pTime) # 这里的'1'代表'1秒', cTime-pTime 能够指代 while True 内整体代码循环一遍所用时间
pTime = cTime
print(f"FPS: {int(fps)}") # 打印fps帧率

3.将 2. 代入 1. ,即在 OpenCV获取的视频流上显示帧率:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import cv2  # 导入OpenCv库
import time # 导入时间模块

cap = cv2.VideoCapture(0) # 0为打开默认摄像头,1为打开你设备列表的第二个摄像头,以此类推;

pTime = 0
cTime = 0 # 用于计算帧率

while True: # 无限循环
ret, img = cap.read() # 读取摄像头的图像帧
img = cv2.flip(img, 1) # 对img图像进行水平翻转
if ret:
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将图像从BGR格式转换为RGB格式
imgHeight = img.shape[0] # 获取图像的高度,并将其赋值给变量imgHeight(其中[0]表示高度的维度)
imgWidth = img.shape[1] # 其中,img是一个图像对象,而shape[1]表示图像的宽度

cTime = time.time() # 获取当前时间
fps = 1 / (cTime - pTime) # 计算帧率
pTime = cTime # 更新上一帧的时间
cv2.putText(img, f"FPS : {int(fps)}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 3) # 在图像上显示帧率

cv2.imshow('img', img) # 显示处理后的图像

if cv2.waitKey(1) == ord('q'):
break # 如果按下 'q' 键,则退出循环

OpenCV实时视频流检测圆形