mediapipe绘画
时间: 2025-01-18 20:54:46 浏览: 121
### 使用MediaPipe实现绘画功能
为了使用MediaPipe库来创建一个基于手势控制的虚拟画板程序,可以结合`AiVirtualPainter.py`中的绘画逻辑以及`HandTrackingModule.py`的手势跟踪模块。具体来说,在捕捉到手的关键点之后,可以根据手指位置的变化在屏幕上绘制线条。
#### 图像预处理阶段
首先需要对获取自摄像头的画面做初步调整,比如翻转画面使其呈现镜像效果以便于用户操作,并把色彩空间由默认的BGR模式转变为适合MediaPipe处理的RGB格式[^3]:
```python
import cv2
import mediapipe as mp
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# Flip the image horizontally for a mirror effect.
flipped_frame = cv2.flip(frame, 1)
rgb_image = cv2.cvtColor(flipped_frame, cv2.COLOR_BGR2RGB)
```
#### 手指追踪与绘图逻辑集成
接下来定义主要的功能函数用于持续读取视频流并执行实际的绘图工作。这里引入了一个名为`draw_on_canvas()`的方法负责依据指尖坐标更新画布上的图案;当食指抬起时停止绘制新路径[^1][^4]:
```python
import numpy as np
class VirtualPainter(object):
def __init__(self):
self.previous_x = None
self.previous_y = None
def draw_on_canvas(self, canvas, finger_tip_position):
if not all([self.previous_x is None,
self.previous_y is None]):
cv2.line(canvas,
pt1=(int(self.previous_x), int(self.previous_y)),
pt2=finger_tip_position,
color=(0, 0, 255),
thickness=8)
self.previous_x, self.previous_y = finger_tip_position
if __name__ == '__main__':
painter = VirtualPainter()
while True:
success, img = cap.read()
results = hands.process(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
multi_hand_landmarks = results.multi_hand_landmarks
if multi_hand_landmarks:
hand_landmark_list = []
for single_hand in multi_hand_landmarks:
mp_draw.draw_landmarks(
img, single_hand, mp_hands.HAND_CONNECTIONS)
for id_, lm in enumerate(single_hand.landmark):
h, w, _ = img.shape
cx, cy = int(lm.x *w ), int(lm.y*h )
if id_==8:# Index Finger Tip ID
index_finger_pos = (cx,cy)
painter.draw_on_canvas(img,index_finger_pos)
cv2.imshow('Drawing Board',img)
key=cv2.waitKey(1)&0xFF
if key==ord('q'):
break
cv2.destroyAllWindows()
```
这段代码展示了如何利用MediaPipe对手部进行实时监测,并根据食指尖端的位置变化来进行连续性的绘图动作。每当检测到新的帧数据到来时就会调用一次`painter.draw_on_canvas()`方法完成对应时刻下的图形渲染任务。
阅读全文
相关推荐













