围绕从 mediapipe 手部地标检测返回的所有点创建一个矩形,就像 cv2.boundingrect 一样

Par*_*ain 5 python opencv mediapipe

我正在使用以下代码来使用 mediapipe 检测手部地标

import cv2
import mediapipe as mp

mphands = mp.solutions.hands
hands = mphands.Hands()
mp_drawing = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)

while True:
    _, frame = cap.read()
    framergb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(framergb)
    hand_landmarks = result.multi_hand_landmarks
    if hand_landmarks:
        for handLMs in hand_landmarks:
            mp_drawing.draw_landmarks(frame, handLMs, mphands.HAND_CONNECTIONS)
            print("\n\n\n")
    cv2.imshow("Frame", frame)

    cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)

我只想在探测器返回的所有点周围有一个矩形请告诉我是否有任何方法可以在 mediapipe 中内置或使用 opencv

Ann*_*Zen 5

  1. 在循环之前while,确定每个帧的宽度和高度:
_, frame = cap.read()

h, w, c = frame.shape
Run Code Online (Sandbox Code Playgroud)
  1. 对于每个检测到的,定义最小和坐标以及最大和坐标landLM的初始变量。前两个变量稍后将充当矩形的起点,最后两个变量稍后将充当矩形的最后一个点:xyxy
            x_max = 0
            y_max = 0
            x_min = w
            y_min = h
Run Code Online (Sandbox Code Playgroud)
  1. 循环遍历handLM变量,并找到手的每个点的x和坐标:y
            for lm in handLMs.landmark:
                x, y = int(lm.x * w), int(lm.y * h)
Run Code Online (Sandbox Code Playgroud)
  1. 当检测到新坐标时更新最小值和最大值x以及变量:y
                if x > x_max:
                    x_max = x
                if x < x_min:
                    x_min = x
                if y > y_max:
                    y_max = y
                if y < y_min:
                    y_min = y
Run Code Online (Sandbox Code Playgroud)
  1. 最后,用点绘制矩形:
            cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)
Run Code Online (Sandbox Code Playgroud)

共:

import cv2
import mediapipe as mp

mphands = mp.solutions.hands
hands = mphands.Hands()
mp_drawing = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)

_, frame = cap.read()

h, w, c = frame.shape

while True:
    _, frame = cap.read()
    framergb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(framergb)
    hand_landmarks = result.multi_hand_landmarks
    if hand_landmarks:
        for handLMs in hand_landmarks:
            x_max = 0
            y_max = 0
            x_min = w
            y_min = h
            for lm in handLMs.landmark:
                x, y = int(lm.x * w), int(lm.y * h)
                if x > x_max:
                    x_max = x
                if x < x_min:
                    x_min = x
                if y > y_max:
                    y_max = y
                if y < y_min:
                    y_min = y
            cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)
            mp_drawing.draw_landmarks(frame, handLMs, mphands.HAND_CONNECTIONS)
    cv2.imshow("Frame", frame)

    cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)

  • @user48956 嗯...您是否尝试过将面部标志绘制到脸上以确保它们能够正确检测?如果是这样,那么我不太确定。如果您仍然遇到问题,可以将其发布,我会找到答案。 (2认同)