手势开关灯

太久没水,那可不行。今日又来写一段专业程序员看了也皱眉的垃圾全屋智能雏形代码。应该是笑掉大牙级别吧。下面进入正题。首先思路就是通过cvzone那个手势识别,判断开关灯指令。接下来是通过mqtt局域网里发布一下(注意打开防火墙)。最后是另一台机器订阅获得这个消息,解析出开关灯指令,然后执行动作。

手势识别与消息发布端:

import time
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector
from paho.mqtt import client as mqtt_client

broker = '192.168.0.107'
port = 1883
topic = "/mqtt/lamp"

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client()
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
    
def publish(client,msg_cmd):
    msg = f"messages: {msg_cmd}"
    result = client.publish(topic, msg)
    status = result[0]
    if status == 0:
        print(f"Send `{msg}` to topic `{topic}`")
    else:
        print(f"Failed to send message to topic {topic}")

cap = cv2.VideoCapture(1)
hand_detector = HandDetector(maxHands=1,detectionCon=0.75)
client = connect_mqtt()
client.loop_start()

while True:
    length_open = 0
    length_close = 0
    flag,img = cap.read()
    img = cv2.flip(img,1)
    if flag:
        hands,img = hand_detector.findHands(img,flipType=False)
        if hands:
            lmlist=hands[0]['lmList']
           # 食指与无名指碰撞开灯,
           # 大拇指和小指碰撞关灯
           # https://blog.csdn.net/vivo01/article/details/135071340
            lmlist[8] = lmlist[8][:2] #index_finger
            lmlist[16] = lmlist[16][:2] #ring_finger
            lmlist[4] = lmlist[4][:2] #thumb
            lmlist[20] = lmlist[20][:2] #small finger
            length_open, _,img = hand_detector.findDistance(lmlist[8],lmlist[16],img)
            length_close,_,img = hand_detector.findDistance(lmlist[4],lmlist[20],img)
            if length_open * length_close == 0: #如果手部没有看完全等问题那么会重新循环读取。
                continue
        if length_open < 40 and length_close > 50:
            print("turn on")
            publish(client,"1")
            time.sleep(0.4)
        if length_close < 40 and length_open > 50:
            print("turn off")
            publish(client,"0")
            time.sleep(0.4)           
        cv2.imshow('img',img)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break
    else:
        print('Camera failed')
        break
cap.release()
cv2.destroyAllWindows()

消息获得与硬件灯泡打开执行端:

import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import time

broker = "192.168.0.107"
port = 1883
topic = "/mqtt/lamp"

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

LED=21
GPIO.setup(LED, GPIO.OUT)
GPIO.output(LED,GPIO.LOW)

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg,ledpin=LED):
  mypay = msg.payload.decode("utf-8")
  #print ("message received:",msg.topic,mypay)
  print(mypay)
  if mypay[-1]=="1":
    GPIO.output(ledpin,GPIO.HIGH)
  if mypay[-1]=="0":
    GPIO.output(ledpin,GPIO.LOW)

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(broker,port)
#client.loop_forever()
try:
    client.loop_forever()
except:
    GPIO.output(LED,GPIO.LOW)

手势识别控制小是一种基于人体手势识别技术的智能控系统,通过识别用户的手势动作来控制开关、亮度和颜色等功能。其总体设计包括以下几个方面: 1. 硬件设计:手势识别控制小的硬件主要包括摄像头、处理器、LED和电源等组件。摄像头用于捕捉用户的手势动作,处理器用于对手势进行分析和识别,LED用于显示不同的光效果,电源提供电能供给。 2. 手势识别算法:手势识别控制小需要使用一种有效的手势识别算法来对用户的手势进行分析和判断。常见的手势识别算法包括基于深度学习的卷积神经网络(CNN)和基于机器学习的支持向量机(SVM)等。 3. 功能设计:手势识别控制小可以实现多种功能,如开关控制、亮度调节和颜色变换等。用户可以通过不同的手势动作来触发相应的功能,例如握拳表示开关,上下移动手掌表示调节亮度,左右移动手掌表示切换颜色等。 4. 用户交互设计:手势识别控制小需要提供友好的用户交互界面,使用户能够方便地进行手势操作和设置的功能。可以采用触摸屏或手机APP等方式来实现用户与系统的交互。 5. 系统集成设计:手势识别控制小需要将硬件和软件进行有效的集成,确保系统的稳定性和可靠性。同时,还需要考虑系统的扩展性,以便将来可以添加更多的功能和模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取啥都被占用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值