本帖最后由 gada888 于 2024-9-27 13:04 编辑
手势识别开关灯(带代码解读)
前言:完成这样一个项目有一定的挑战性,正是这一点才更吸引人。为了达成目的,需要更多更聪明的方式去吸收知识。
项目分别使用了python框架下的opencv,Mediapipe和pinpong函数库。
为了让大家对这个项目的核心内容有个快速的了解。这里发布一个教学视频。视频里有对核心代码部分的完整解释。旨在让更多人更快的熟悉python代码编程。因为不懂代码,永远不能对独立做出商业项目。
该呈现的内容都在视频里讲了。编程环境是用的pytharm
- import cv2
- import mediapipe as mp
-
- #########################Arduino Declaration##############
- import time
- from pinpong.board import Board,Pin
- Board("uno","COM6").begin()
- led = Pin(Pin.D7, Pin.OUT)
- #####################################
-
- # 初始化MediaPipe手部解决方案
- mp_hands = mp.solutions.hands
- hands = mp_hands.Hands()
- mp_drawing = mp.solutions.drawing_utils
-
- # 定义A矩形和B矩形的位置和大小
- rect_A = (100, 80, 100, 80)
- rect_B = (400, 80, 100, 80)
-
- # 打开摄像头
- cap = cv2.VideoCapture(0)
-
- while cap.isOpened():
- ret, frame = cap.read()
- if not ret:
- break
-
- # 将图像转换为RGB格式
- image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- results = hands.process(image_rgb)
-
- # 绘制矩形框
- cv2.rectangle(frame, rect_A, (255, 255, 0), -1)
- cv2.rectangle(frame, rect_B, (0, 255, 255), -1)
-
- # 如果检测到手部关键点
- if results.multi_hand_landmarks:
- for hand_landmarks in results.multi_hand_landmarks:
- for id, landmark in enumerate(hand_landmarks.landmark):
- x, y = int(landmark.x * frame.shape[1]), int(landmark.y * frame.shape[0])
-
- # 检查手部关键点是否与A矩形相交
- if rect_A[0] <= x <= rect_A[0] + rect_A[2] and rect_A[1] <= y <= rect_A[1] + rect_A[3]:
- cv2.rectangle(frame, rect_A, (0, 0, 255), 6) # 改变A矩形颜色为红色
- led.write_digital(1)
-
- # 检查手部关键点是否与B矩形相交
- if rect_B[0] <= x <= rect_B[0] + rect_B[2] and rect_B[1] <= y <= rect_B[1] + rect_B[3]:
- cv2.rectangle(frame, rect_B, (0, 0, 255), 6) # 改变B矩形颜色为红色
- led.write_digital(0)
-
- mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
-
- cv2.imshow('Frame', frame)
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
-
- cap.release()
- cv2.destroyAllWindows()
复制代码
下面是硬件连线图
下面是MOSFET管模块接线图
奇怪,这个教学视频在B站有很多的 播放。这本坛子播放量很低。看来它们分别吸引不同的人群。
|