基于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
- 安装依赖库 :安装编译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
- 下载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
-
创建虚拟环境(可选但推荐)
:使用
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
- 安装Python依赖库 :在虚拟环境中安装Python依赖库。
pip install numpy
-
配置和编译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
- 安装OpenCV :编译完成后,执行以下命令进行安装。
sudo make install
sudo ldconfig
- 验证安装 :在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的应用开发列表:
- 智能门锁系统:使用面部识别技术控制门锁开关。
- 手势控制家电:通过手势识别实现家电的开关控制。
超级会员免费看
936

被折叠的 条评论
为什么被折叠?



