环境
- windows 10 64bit
- python 3.8
- cvzone 1.5.6
简介
cvzone
是一个计算机视觉开源库,其核心是基于 opencv
和 mdiapipe
,使用它可以很方便地进行图像处理和一些 AI
功能的实现。
安装与使用
使用 pip
安装,执行命令
pip install cvzone
cvzone
有几个典型的应用,比如人脸检测、手部跟踪
人脸识别
cvzone
封装了人脸检测的模块 FaceDetectionModule
,它整合了 mediapipe
中的 face_detection
方案
from cvzone.FaceDetectionModule import FaceDetector
import cv2
cap = cv2.VideoCapture('test.mp4')
detector = FaceDetector()
while True:
success, img = cap.read()
# 返回的图像img包含了检测后的人脸框,bboxs是一个列表,包含图像中所有见到的人脸数据,每一组人脸的数据是id, 位置, 相似度, 中心点位置坐标
img, bboxs = detector.findFaces(img)
if bboxs:
# 获取中心点位置,这里就直接取id为0即第一个人的中心点坐标
center = bboxs[0]["center"]
cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)
cv2.imshow("Image", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
手部跟踪
mediapipe
手部21个关键点信息可以看下面这张图
接着来看具体的代码示例
from cvzone.HandTrackingModule import HandDetector
import cv2
cap = cv2.VideoCapture("test.mp4")
detector = HandDetector(detectionCon=0.8, maxHands=2)
while True:
success, img = cap.read()
# 获取手部的关键点信息,共21个点。findHands默认返回带手部关键点标识的图像;如果不想显示,可以在findHands方法中增加参数draw=False
hands, img = detector.findHands(img)
if hands:
# 第一只手
hand1 = hands[0]
# 21个关键点坐标
lmList1 = hand1["lmList"]
# 手部坐标
bbox1 = hand1["bbox"]
# 手部的中心点坐标
centerPoint1 = hand1['center']
# 左手还是右手
handType1 = hand1["type"]
# 获取打开手指的列表
fingers1 = detector.fingersUp(hand1)
if len(hands) == 2:
# 第二只手
hand2 = hands[1]
lmList2 = hand2["lmList"]
bbox2 = hand2["bbox"]
centerPoint2 = hand2['center']
handType2 = hand2["type"]
fingers2 = detector.fingersUp(hand2)
# 计算2只手对应手指的距离,比如这里的食指指尖关键点
# findDistance方法可不带img参数,返回值也相应的不带绘制后的img
# length, info = detector.findDistance(lmList1[8], lmList2[8])
length, info, img = detector.findDistance(lmList1[8], lmList2[8], img) # with draw
cv2.imshow("Image", img)
cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()
目前的最新版本,遇到两只手的情况就会报错
问题定位到文件 HandTrackingModule
的第 143 行,需要增加一个返回值,由于我们并没有使用到这个返回值,就用 _
代替
最后的测试结果
姿态估计
使用上和之前的模块非常相似,比较好懂
from cvzone.PoseModule import PoseDetector
import cv2
cap = cv2.VideoCapture("gusture_test.mp4")
detector = PoseDetector()
while True:
success, img = cap.read()
img = detector.findPose(img)
lmList, bboxInfo = detector.findPosition(img, bboxWithHands=False)
if bboxInfo:
center = bboxInfo["center"]
cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)
cv2.imshow("Image", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Python实用模块专题
更多有用的 python
模块,请移步