如何使用OpenCV+MediaPipe实现无背景仅显示手部关键点
手部检测去除实拍背景仅显示关键点方案
核心思路
你当前的代码是直接在摄像头拍摄的实拍帧上绘制关键点和骨骼连线,只要将绘制载体替换为新建的纯色空白画布,就可以去掉实拍背景,仅保留需要的手部标注内容,关键点检测的逻辑不需要做任何改动。
具体修改点
- 新增
numpy库导入,用于创建空白画布 - 每次读取实拍帧后,创建和实拍帧尺寸一致的纯色画布(示例用纯黑背景,可自行调整颜色)
- 所有绘制操作(关键点、骨骼连线、FPS文本)全部转移到空白画布上执行
- 最终显示空白画布而非原始实拍帧
完整修改后代码
#credits: https://github.com/kulin-patel/Hand-Tracking import cv2 import mediapipe as mp import time import numpy as np # 新增numpy导入 frameWidth = 1280 frameHeight = 720 cap = cv2.VideoCapture(0) cap.set(3, frameWidth) cap.set(4, frameHeight) mpHands=mp.solutions.hands hands=mpHands.Hands() mpDraw = mp.solutions.drawing_utils pTime = 0 cTime = 0 while True: success, img = cap.read() img= cv2.flip(img,1) # 新建纯黑空白画布,和实拍帧尺寸一致 bg = np.zeros_like(img) # 如果需要白色背景,替换为下面这行 # bg = np.ones_like(img) * 255 imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = hands.process(imgRGB) if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id, lm in enumerate(handLms.landmark): h, w, c =img.shape cx, cy = int(lm.x * w), int(lm.y * h) # 把关键点画在空白画布上,不是原来的实拍img上 mpDraw.draw_landmarks(bg, handLms, mpHands.HAND_CONNECTIONS) # FPS文本也画在空白画布上,颜色调整为绿色适配黑背景 cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(bg, "FPS= " + str(int(fps)), (10, 20), cv2.FONT_HERSHEY_PLAIN, 1,(0, 255, 0), 1) # 显示空白画布 cv2.imshow('image', bg) if cv2.waitKey(1)==27: break # 释放资源 cap.release() cv2.destroyAllWindows()
可选样式调整
如果需要修改关键点、骨骼线的颜色和粗细,可以给mpDraw.draw_landmarks增加样式参数,示例:
# 自定义关键点样式:绿色,半径5,实心 landmark_spec = mpDraw.DrawingSpec(color=(0,255,0), thickness=2, circle_radius=5) # 自定义连线样式:黄色,粗细2 connection_spec = mpDraw.DrawingSpec(color=(0,255,255), thickness=2) mpDraw.draw_landmarks(bg, handLms, mpHands.HAND_CONNECTIONS, landmark_spec, connection_spec)
内容的提问来源于stack exchange,提问作者Zero Agmashenebeli
相关产品推荐
相关产品推荐

