手のリアルタイム追跡には、mediapipe ライブラリを使用します。mediapipe の概要については、Baidu にアクセスしてください。
Mediapipe の手の検出については、ここを参照してください。
MediaPipe Hands: オンデバイスのリアルタイム ハンド トラッキング 論文読書メモ - Zhihu論文アドレス: https://arxiv.org/abs/2006.10214v1Demo アドレス: https://hand.mediapipe.dev/ 研究機関: Google Research Conference : CVPR2020 の紹介を始める前に、システムアーキテクチャの全体的な概念を皆さんに理解していただくために、モデルのフローチャートを掲載します。Hands (手) _mediapipehands-CSDN ブログ記事は 1.2w 回読まれ、6 回いいね! され、66 回収集されました。1. 要約 さまざまな技術分野やプラットフォームにわたって、手の形状や動きを感知する機能は、ユーザー エクスペリエンスを向上させるための重要な要素です。たとえば、手話の理解やジェスチャー制御の基礎を形成したり、拡張現実の物理世界の上にデジタル コンテンツや情報を重ね合わせたりすることができます。人間にとっては自然なことではありますが、堅牢なリアルタイムの手認識は、コンピューター ビジョンの課題であることは間違いありません。これは、手自体または手同士が遮られることが多く (指/手のひらの遮蔽や握手など)、高コントラストのパターンが欠如しているためです。MediaPipe Hands は、忠実度の高い手と指の追跡ソリューションです。機械学習 (ML) を使用して、単一のフレームから手の 21 の 3D ランドマークを推測します。現在の最先端の手法は主に強力なデスクトップのrings_mediapipe handに依存していますhttps://blog.csdn.net/weixin_43229348/article/details/120530937
ハンド トラッキングを行う場合は、以下に示すように手のランドマークを理解する必要があります。
Mediapipe をインストールする必要があります。pip install mediapipe を使用するだけです。
mediapipe.solution.hands のコンストラクター パラメーターの簡単な説明は次のとおりです。
static_image_mode が True の場合は検出のみが行われることを意味し、False の場合は信頼度がしきい値より低い場合に検出が行われることを意味し、追跡信頼度が良好な場合は検出は行われず追跡のみが行われます。終わり。
max_num_hands パラメータは、検出される手の最大数を意味します。
min_detection_confidence 最小検出信頼度しきい値、この値より高いと検出が成功したことを意味します、デフォルトは 0.5
min_tracking_confidence 最小追跡信頼しきい値。この値より高いとハンド トラッキングが成功したことを示します。デフォルトは 0.5
コードは次のとおりです(参照のみ)。
import cv2 as cv
import mediapipe as mp
import time
class HandDetector():
def __init__(self, mode=False,
maxNumHands=2,
modelComplexity=1,
minDetectionConfidence=0.5,
minTrackingConfidence=0.5):
self.mode = mode
self.maxNumHands = maxNumHands
self.modelComplexity = modelComplexity
self.minDetectionConfidence = minDetectionConfidence
self.minTrackingConfidence = minTrackingConfidence
#创建mediapipe的solutions.hands对象
self.mpHands = mp.solutions.hands
self.handsDetector = self.mpHands.Hands(self.mode, self.maxNumHands, self.modelComplexity, self.minDetectionConfidence, self.minTrackingConfidence)
#创建mediapipe的绘画工具
self.mpDrawUtils = mp.solutions.drawing_utils
def findHands(self, img, drawOnImage=True):
#mediapipe手部检测器需要输入图像格式为RGB
#cv默认的格式是BGR,需要转换
imgRGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)
#调用手部检测器的process方法进行检测
self.results = self.handsDetector.process(imgRGB)
#print(results.multi_hand_landmarks)
#如果multi_hand_landmarks有值表示检测到了手
if self.results.multi_hand_landmarks:
#遍历每一只手的landmarks
for handLandmarks in self.results.multi_hand_landmarks:
if drawOnImage:
self.mpDrawUtils.draw_landmarks(img, handLandmarks, self.mpHands.HAND_CONNECTIONS)
return img;
#从结果中查询某只手的landmark list
def findHandPositions(self, img, handID=0, drawOnImage=True):
landmarkList = []
if self.results.multi_hand_landmarks:
handLandmarks = self.results.multi_hand_landmarks[handID]
for id,landmark in enumerate(handLandmarks.landmark):
#处理每一个landmark,将landmark里的X,Y(比例)转换为帧数据的XY坐标
h,w,c = img.shape
centerX,centerY = int(landmark.x * w), int(landmark.y * h)
landmarkList.append([id, centerX, centerY])
if (drawOnImage):
#将landmark绘制成圆
cv.circle(img, (centerX,centerY), 8, (0,255,0), cv.FILLED)
return landmarkList
def DisplayFPS(img, preTime):
curTime = time.time()
if (curTime - preTime == 0):
return curTime;
fps = 1 / (curTime - preTime)
cv.putText(img, "FPS:" + str(int(fps)), (10,70), cv.FONT_HERSHEY_PLAIN,
3, (0,255,0), 3)
return curTime
def main():
video = cv.VideoCapture('../../SampleVideos/hand.mp4')
#FPS显示
preTime = 0
handDetector = HandDetector()
while True:
ret,frame = video.read()
if ret == False:
break;
frame = handDetector.findHands(frame)
hand0Landmarks = handDetector.findHandPositions(frame)
#if len(hand0Landmarks) != 0:
#print(hand0Landmarks)
preTime = DisplayFPS(frame, preTime)
cv.imshow('Real Time Hand Detection', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break;
video.release()
cv.destroyAllWindows()
if __name__ == "__main__":
main()
実行結果:
Python Opencv の練習 - ハンド トラッキング