16、基于Raspberry Pi的智能控制与计算机视觉应用

基于Raspberry Pi的智能控制与计算机视觉应用

1. 扩展Jasper功能

要扩展Jasper的功能,可以添加Python模块来完成所需的工作,例如控制智能开关。这需要实现一个Python模块,通过MQTT协议与ESP模块进行数据的发布和订阅。Jasper使用Mosquitto MQTT代理和paho - mqtt库,所以需要在Raspberry Pi上安装这些。

2. 创建Jasper模块

创建新的Jasper模块是一个相对简单的过程,主要有以下三个关键步骤:
- 确定关键词列表 :需要检测用户输入命令中的关键词,将这些关键词定义为一个全局的字符串列表 WORDS 。为了提高检测速度和准确性,应尽量保持语音到文本字典的简洁。例如,若要打开灯, WORDS 字典可以定义为:

WORDS = ["TURN","ON","LIGHT","ONE"]

也可以分别定义不同的实体,然后组合起来,如下所示:

NUMBERS = ["ONE", "TWO", "THREE", "FOUR"]
DEVICES = ["ROOM", "LIGHT", "SENSOR", "DOOR"]
PAYLOADS = ["ON", "OFF","TRUE", "FALSE", "OPEN", "CLOSE", "STATUS"]
WORDS = DEVICES + NUMBERS + PAYLOADS
  • 验证输入有效性 :使用 isValid(input) 函数检查模块是否接受输入文本。该函数返回 True 表示输入有效,返回 False 则表示无效。示例代码如下:
import re
def isValid(text):
    return bool(re.search(r'\bturn on light\b', text, re.IGNORECASE))

或者使用定义好的字符串变量来编写:

def isValid(text):
    regex = "(" + "|".join(NUMBERS) + ") (" + "|".join(DEVICES) + ") (" + "|".join(EXTRAS) + ")"
    return bool(re.search(regex, text, re.IGNORECASE))

要确保 isValid 函数中使用的单词包含在 WORDS 字典中。
- 实现处理函数 handle(input, mic, profile) 函数是模块的核心,用于执行请求的操作。 input 是解析后的语音, mic 是麦克风对象,用于与用户交互, profile 是用户配置文件。示例代码如下:

def handle(text, mic, profile):
    words = text.split(' ')
    if words[0] not in DEVICES:
        return mic.say(words[0]+" not found in the list of devices")
    # publish or subscribe function
    mic.say("Done")

如果用户输入被多个模块接受,需要为模块分配优先级。通过定义一个可选的整数属性 PRIORITY ,优先级高的模块将优先处理输入。例如,风扇速度调节模块的 PRIORITY = 4 ,而电器开关模块的 PRIORITY = 3

3. 使用Jasper MQTT模块控制ESP模块

一些第三方的Jasper模块,如Google Calendar、Twitter、Raspberry Pi重启和关机以及MQTT模块,可以在Jasper文档网站上找到。要使用MQTT模块,需要在 .jasper 文件夹中的 profile.yml 文件中添加以下内容:

mqtt:
  hostname: 'Raspberry pi IP address'
  port: 1883
  protocol: 'MQTTv31'

确保Raspberry Pi上安装了Mosquitto代理,并输入Raspberry Pi的IP地址作为主机名。使用以下命令安装 paho - mqtt 库:

sudo pip install paho - mqtt

克隆MQTT模块并将其复制到Jasper的模块文件夹中:

git clone https://github.com/ArtBIT/jasper - module - mqtt.git
cp jasper - module - mqtt/Mqtt.py usr/local/lib/jasper/client/modules/

接下来创建三个模块:
- 控制电器开关 :首先导入所需的库:

import paho.mqtt.publish as publish
import re

定义设备、负载、房间等可能的名称,并设置模块的优先级:

DEVICES = ["FAN","LIGHT", "LIGHTS"]
PAYLOADS = ["ON","OFF"]
ROOMS = ["BEDROOM","LIVINGROOM","DRAWINGROOM"]
EXTRAS = ["THE","THAT"]
STARTS = ["SWITCH", "TURN"]
WORDS = STARTS + DEVICES + EXTRAS + PAYLOADS + ROOMS
PRIORITY = 4

实现 handle 函数:

def handle(text, mic, profile):
    words = text.split(' ')
    payload = words[1]
    device = words[4]
    room = words[3]
    if words[4] not in DEVICES:
        return mic.say(words[4]+" not found in the list of devices")
    print("payload->"+payload)
    print("Device ->"+device)
    print("Room ->" +room)
    top = [ room, device, payload]
    topic = '/'.join(['/feeds']+top)
    publish.single(topic.lower(),payload = payload.lower(),hostname="Raspberry pi IP address")
    print(topic.lower())
    mic.say("Done")

实现 isValid 函数:

def isValid(text):
    regex = "(" + "|".join(STARTS) + ") ("+ "|".join(PAYLOADS) + ") (" + "|".join(DEVICES) + ")"
    return bool(re.search(regex, text, re.IGNORECASE))
  • 控制灯光亮度和风扇速度 :只需在 PAYLOADS 字典中添加更多表示亮度和速度级别的单词,如:
PAYLOADS = ["ONE","TWO", "THREE", "FOUR", "DIM","SOFT", "BRIGHT"]

除了 PAYLOADS ,其他代码基本保持不变。
- 获取温度和湿度数据 :导入所需的库:

import re
import paho.mqtt.subscribe as subscribe

定义 WORDS

WORDS = ["TEMPERATURE", "HUMIDITY"]

实现 handle 函数:

def handle(text, mic, profile):
    broker_address = "Raspberry Pi IP address"
    topic = ['/feeds/temperature']
    print("temperature")
    m = subscribe.simple(topic, hostname = broker_address, retained = False)
    msg = "It is " + m.payload + "degree celsius"
    mic.say(msg)

实现 isValid 函数:

def isValid(text):
    return bool(re.search(r'\bwhat is the temperature\b', text, re.IGNORECASE))

将该模块保存为不同的文件名,如 Mqtt_temp.py ,编译脚本并重启Raspberry Pi。

4. 编写ESP模块的MQTT代码

需要为ESP模块编写MQTT代码,使其能够订阅和发布消息。可以使用之前编写的基于Adafruit MQTT库的代码,只需更改主题名称和MQTT代理的IP地址。
设置订阅和发布的主题:

Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Subscribe Light1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/bedroom/light");
Adafruit_MQTT_Subscribe Fan = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/bedroom/fan");
Adafruit_MQTT_Subscribe speed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/fan/speed");

检查订阅元素的消息并读取数据:

Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(20000))) {
    if (subscription == &Light1) {
        Serial.print(F("Got: "));
        Serial.println((char *)Light1.lastread);
        if (strcmp((char *)Light1.lastread, "on") == 0)
            digitalWrite(light, HIGH);
        if (strcmp((char *)Light1.lastread, "off") == 0)
            digitalWrite(light, LOW);
    }
}

假设使用DHT11传感器测量房间的温度和湿度,可以使用以下代码将温度发布到Jasper MQTT模块:

float t = dht.readTemperature();
if (! Temperature.publish(t)) {
    Serial.println(F("Failed"));
} else {
    Serial.println(F("OK!"));
}

编译ESP程序并将其烧录到开发板,确保Raspberry Pi和ESP模块使用相同的WiFi网络。之后就可以向Jasper发出指令,如“Jasper, turn on bedroom light”或询问温度“Jasper, what is the temperature?”。

5. 计算机视觉与OpenCV简介

计算机视觉是一组算法的集合,使计算机能够“看到”周围的世界,分析图像并提取有用信息。它是人工智能和机器学习的一个子领域,广泛应用于社交媒体的面部识别、机器人导航、物体检测和避免碰撞以及物流公司的包裹跟踪等领域。

计算机视觉的第一步是特征提取,即计算机分析图像以识别线条、角点和大面积的颜色。提取的特征可以与存储在XML文件中的面部特征数据进行比较,从而实现面部识别,同样的技术也可用于物体识别。此外,计算机视觉还可以实现运动跟踪,通过比较相机的连续帧来检测运动。

计算机视觉与图像处理不同,图像处理主要是从现有图像创建新图像,不关注图像内容的理解,例如裁剪、旋转和改变图像的颜色对比度等操作属于图像处理任务。

6. OpenCV概述

OpenCV是一个流行的跨平台计算机视觉库,用于开发实时计算机视觉应用程序。它包含2500个应用程序的实现,可免费用于商业和学术目的。要在Raspberry Pi上使用OpenCV,需要先安装相机,可以选择Pi相机或USB网络摄像头。Pi相机通过CSI端口直接连接到开发板,速度比USB相机略快。

安装相机后,需要从官方网站下载OpenCV的源代码,并进行编译安装。由于编译过程耗时较长,建议使用较新的Raspberry Pi型号。对于创建智能门锁的应用场景,Pi相机搭配Pi Zero是一个不错的选择,因为便于设计外壳。接下来将详细介绍如何在Raspberry Pi上安装OpenCV。

以下是创建Jasper模块的流程:

graph TD
    A[确定关键词列表] --> B[验证输入有效性]
    B --> C[实现处理函数]
    C --> D[设置模块优先级]
    D --> E[完成模块创建]

以下是使用Jasper MQTT模块控制ESP模块的步骤表格:
|步骤|操作|
|----|----|
|1|在 profile.yml 中添加MQTT配置|
|2|安装 paho - mqtt 库|
|3|克隆MQTT模块并复制到Jasper模块文件夹|
|4|创建不同功能的模块|
|5|编写ESP模块的MQTT代码|
|6|编译并烧录ESP程序|
|7|使用相同WiFi网络并测试|

基于Raspberry Pi的智能控制与计算机视觉应用

7. 在Raspberry Pi上安装OpenCV

在Raspberry Pi上安装OpenCV之前,要确保已经安装了相机。若使用Pi相机,直接连接到CSI端口,之后从 raspi-config 菜单中启用相机接口,然后重启Raspberry Pi使更改生效。

安装OpenCV的具体步骤如下:
1. 更新系统 :打开终端,执行以下命令更新系统软件包列表和已安装的软件包。

sudo apt-get update
sudo apt-get upgrade
  1. 安装依赖库 :安装编译OpenCV所需的依赖库。
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python2.7-dev python3-dev
  1. 下载OpenCV源代码 :从OpenCV官方网站下载源代码,也可以使用以下命令下载。
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip
unzip opencv_contrib.zip
  1. 创建虚拟环境(可选但推荐) :使用 virtualenv virtualenvwrapper 创建Python虚拟环境。
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bashrc
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
source ~/.bashrc
mkvirtualenv cv -p python3
workon cv
  1. 安装Python依赖库 :在虚拟环境中安装Python依赖库。
pip install numpy
  1. 配置和编译OpenCV :进入OpenCV源代码目录,创建并进入构建目录,然后使用 cmake 进行配置。
cd opencv-4.5.5
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.5.5/modules \
    -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
    -D BUILD_EXAMPLES=ON ..

配置完成后,使用 make 命令进行编译,由于编译过程耗时较长,可以使用 -j 参数指定并行编译的线程数。

make -j4
  1. 安装OpenCV :编译完成后,执行以下命令进行安装。
sudo make install
sudo ldconfig
  1. 验证安装 :在Python虚拟环境中验证OpenCV是否安装成功。
import cv2
print(cv2.__version__)
8. 基于OpenCV的应用开发

安装好OpenCV后,可以开发多种基于计算机视觉的应用,以下是一些常见应用的示例:

8.1 智能门锁系统

智能门锁系统可以使用面部识别技术来控制门锁的开关。以下是一个简单的面部识别示例代码:

import cv2

# 加载预训练的面部检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        break

    # 将图像转换为灰度图
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测面部
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 在检测到的面部周围绘制矩形
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # 显示图像
    cv2.imshow('Face Detection', frame)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
8.2 手势控制家电

可以使用OpenCV进行手势识别,从而实现通过手势控制家电的开关。以下是一个简单的手势识别示例代码:

import cv2
import numpy as np

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        break

    # 定义感兴趣区域(ROI)
    roi = frame[100:300, 100:300]

    # 转换为灰度图
    gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)

    # 高斯模糊
    blur = cv2.GaussianBlur(gray, (5, 5), 0)

    # 二值化处理
    _, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

    # 查找轮廓
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    if len(contours) > 0:
        # 找到最大的轮廓
        cnt = max(contours, key=cv2.contourArea)

        # 计算凸包
        hull = cv2.convexHull(cnt)

        # 绘制轮廓和凸包
        cv2.drawContours(roi, [cnt], 0, (0, 255, 0), 2)
        cv2.drawContours(roi, [hull], 0, (0, 0, 255), 2)

    # 显示图像
    cv2.imshow('Gesture Detection', frame)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
9. 总结

通过以上步骤,我们可以在Raspberry Pi上实现基于Jasper的智能语音控制和基于OpenCV的计算机视觉应用。具体总结如下:
- Jasper模块开发 :通过添加Python模块,利用MQTT协议实现了对ESP模块连接的家电的控制,包括开关控制、亮度和速度调节以及温度湿度数据获取。
- OpenCV安装与应用 :在Raspberry Pi上安装了OpenCV库,并开发了智能门锁和手势控制家电等应用,展示了计算机视觉在智能家居中的应用潜力。

以下是OpenCV安装流程的mermaid流程图:

graph TD
    A[更新系统] --> B[安装依赖库]
    B --> C[下载OpenCV源代码]
    C --> D[创建虚拟环境]
    D --> E[安装Python依赖库]
    E --> F[配置和编译OpenCV]
    F --> G[安装OpenCV]
    G --> H[验证安装]

以下是基于OpenCV的应用开发列表:
- 智能门锁系统:使用面部识别技术控制门锁开关。
- 手势控制家电:通过手势识别实现家电的开关控制。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值