- 2024-11-01
-
加入了学习《基于树莓派5的工业智能网关视频》,观看 得捷2024大赛基于树莓派5的智能工业网关视频
- 2024-10-31
-
发表了主题帖:
【2024 DigiKey 创意大赛】基于树莓派的空巢老人监护系统
本帖最后由 空耳- 于 2024-11-1 04:33 编辑
一、项目简介
1、设计名称
基于树莓派的空巢老人监护系统
2、项目照片
环境监测部分:
跌倒监测部分:
3、项目用到的板卡
(1)Raspberry Pi 5
处理器:2.4GHz 4核 64位Cortex-A76
内存:4GB LPDDR4X-4267
通讯接口:Wi-Fi 6(802.11ac) 支持2.4GHz和5GHz频段
Bluetooth 5.2 支持低功耗蓝牙连接
1个2.5Gbps 1000M Ethernet
2个USB3.0
2个USB2.0
GPIO:标准40Pin GPIO插头
音视频接口:双micro HDMI接口,支持双4K@60fps视频输出
2-lane MIPI DSI
2-lane MIPI CSI
MicroSD卡槽:支持更高速的MicroSD卡
PCIe接口: PCIe 2.0 x1接口,支持高速外设连接
(2)esp32
(3)其他传感器,mq-2,mq-5,dht11,GSM模块
4、项目功能
背景:随着我国社会老龄化的加剧, 特别是空巢老年人群体的扩大, 已经引起了广泛关注。 根据最新的统计数据, 我国 60 岁及以上的老年人口比例已经达到 18.7%, 而 65岁及以上的老年人口比例则为 13.5%, 与上一次人口普查相比, 这两个年龄段的人口比例分别上升了 5.44%和 4.63%。 同时, 《中国空巢老人现状报告 2017》 预测, 到2030 年, 我国的老龄人口将接近 3 亿, 其中 90%将是空巢老人家庭。 随着城市化进程的快速推进, 越来越多的年轻人涌向城市, 导致农村空巢老人的数量日益增加。
随着社会老龄化的加剧, 空巢老人的生活安全问题越来越受到重视。 本项目旨在开发一种基于树莓派的空巢老人守护系统, 该系统通过实时监控老人的姿态和环境信息, 能够迅速识别天然气泄漏, 家中失火, 老人跌倒等危险情况, 并立即向子女发送警告通知, 从而提升空巢老人的安全保障和生活品质。 本项目将综合运用嵌入式技术、 深度学习算法和物联网技术, 探讨如何构建一个高效且可靠的监测系统,为空巢老人的家庭护理提供技术支持与保障。
二、系统框图
系统设计方案:
为满足特定研究主题的需求, 本系统需要一个全面的设计方案。 系统的主要作用是监测老年人居家环境以及是否出现跌倒情况。 基于这一目标, 系统主要包含两个部分: 一部分是通过物联网技术实施环境监控, 另一部分则是专门用于检测跌倒这一危险行为。 系统总体框图如下:
物联网环境监测系统设计框图
在系统中,传感器数据监测部分负责监测空巢老人的室内环境参数,并通过云平台将信息发送给手机应用程序。在危险环境下,系统会通过GSM进行报警。系统包括数据采集模块,主控模块,通信模块等部分。
硬件框图:
软件框图:物联网环境监测系统使用Arduino IDE进行程序设计,设计了ESP-32主程序,DHT11温湿度传感器检测程序、MQ-2和MQ-5气体传感器检测程序,以及GSM报警通知程序。通过点灯Blinker APP软件,可以实时显示采集到的环境数据,并在发现危险情况时进行报警。
跌倒行为监测系统系统设计框图:
本文选择的ARM硬件平台为:Raspberry Pi 5处理器:2.4GHz 4核 64位Cortex-A76内存:4GB LPDDR4X-4267通讯接口:Wi-Fi 6(802.11ac) 支持2.4GHz和5GHz频段 Bluetooth 5.2 支持低功耗蓝牙连接1个2.5Gbps 1000M Ethernet。主要使用到了一下外部接口。
三、各部分功能说明
应用软件分为2大块:
跌倒行为监测:通过树莓派实施对跌倒行为的监控,主要聚焦于目标检测算法的研究,并采用YOLOv5算法来实现对老人跌倒的检测。对数据集进行多次训练,直到模型的准确度达到预定的目标。然后,将这个模型部署到目标设备上,对老人的行为进行视频监测,判断是否跌倒。最后通过GSM模块的短信功能进行报警。
物联网环境监测:通过采用DHT11传感器来监测老人居家环境的温湿度,并将获取的数据上传到云端进行显示和存储。这有助于实时了解老人居家环境的温湿度情况。通过采用MQ-5传感器来监测可燃气体是否泄露,并将获取的数据上传到云端进行显示和存储。这有助于实时了解老人居家环境的危险因素,提醒老人或者家属做出相应措施。通过采用MQ-2烟雾传感器来监测家中是否失火,并将获取的数据上传到云端进行显示和存储。这有助于实时了解老人居家环境的危险因素,提醒老人或者家属做出相应措施。
四、作品源码
环境监测部分:
#define WAIBU1 35 //定义蜂鸣器引脚
#define WAIBU2 34 //定义蜂鸣器引脚
#define beep 25 //定义蜂鸣器引脚
#define MQ2_pin 33 //定义MQ-5传感器AO采样
#define MQ5_pin 32 //定义MQ-5传感器AO采样
//温湿度部分
#define DHTPIN 26 //定义DHT11模块连接stm32的管脚PB8
#define DHTTYPE DHT11 // 使用温度湿度模块的类型为DHT11
DHT dht(DHTPIN, DHTTYPE); //生成DHT对象,参数是引脚和DHT的类型
BlinkerNumber HUMI("humi"); //定义湿度数据键名
BlinkerNumber TEMP("temp"); //定义温度数据键名
BlinkerNumber MQ5("mq5"); //定义温度数据键名
BlinkerNumber MQ2("mq2"); //定义温度数据键名
BlinkerSlider Slider0("T"); //位置0-3 滑块 数据键名
BlinkerSlider Slider1("H"); //位置0-3 滑块 数据键名
BlinkerSlider Slider2("M"); //位置0-3 滑块 数据键名
BlinkerSlider Slider3("N"); //位置0-3 滑块 数据键名
//定义浮点型全局变量 储存传感器读取的数据
int humi_read = 0, temp_read = 0;
int ADC_MQ5=0;
int ADC_MQ2=0;
int temp_read_threshold=30; //默认值后面要用到
int humi_read_threshold=90; //默认值后面要用到
int ADC_MQ5_read_threshold=500; //默认值后面要用到
int ADC_MQ2_read_threshold=2200; //默认值后面要用到
//**********定义连接WiFi***********************************//
char auth[] = "************"; //设备Blinker注册码
char ssid[] = "6"; //家里路由器名称
char pswd[] = "12345678"; //家里路由器密码
//定义浮点型全局变量 储存定时时间的数据
uint32_t read_time = 0;
void sensor_work()
{
//每隔两秒钟进入判断获取温湿度和危险气体浓度数值
if (read_time == 0 || (millis() - read_time) >= 2000)
{
read_time = millis();
//温湿度检测
float h = dht.readHumidity();
float t = dht.readTemperature();
humi_read = h;
temp_read = t;
//串口打印数值
Serial.print("湿度:");
Serial.print(humi_read);
Serial.print(" 温度:");
Serial.print(temp_read);
//危险气体mq-5检测
ADC_MQ5=analogRead(MQ5_pin);
//串口打印数值
Serial.print(" 危险气体:");
Serial.println(ADC_MQ5);
//mq-2检测
ADC_MQ2=analogRead(MQ2_pin);
//串口打印数值
Serial.print(" 烟雾浓度:");
Serial.println(ADC_MQ2);
}
if(humi_read > humi_read_threshold )
{
Blinker.notify("当前湿度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if( temp_read > temp_read_threshold )
{
Blinker.notify("当前温度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(ADC_MQ5 >ADC_MQ5_read_threshold)
{
Blinker.notify("当前危险气体浓度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(ADC_MQ2 >ADC_MQ2_read_threshold)
{
Blinker.notify("当前烟雾浓度过高");
digitalWrite(beep,LOW);
sim800c1();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(digitalRead(WAIBU1) ==HIGH)
{
Blinker.notify("检测到老人摔倒!!");
digitalWrite(beep,LOW);
sim800c2();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
if(digitalRead(WAIBU2) ==HIGH)
{
Blinker.notify("检测到老人摔倒!!");
digitalWrite(beep,LOW);
sim800c2();
Blinker.delay(500);
digitalWrite(beep,HIGH);
}
}
String data="";
String num="15181147909";
void sim800c1()
{
Serial2.println("AT"); //Once the handshake test is successful, it will back to OK
delay(500);
Serial2.println("AT+CMGF=1"); // Configuring TEXT mode
delay(500);
data="";data+="AT+CMGS=";data+="\"";data+=num;data+="\"";
Serial2.println(data);
delay(500);
Serial2.print("danger"); //text content
delay(500);
Serial2.write(26);
}
String data2="";
void sim800c2()
{
Serial2.println("AT"); //Once the handshake test is successful, it will back to OK
delay(500);
Serial2.println("AT+CMGF=1"); // Configuring TEXT mode
delay(500);
data2="";data2+="AT+CMGS=";data2+="\"";data2+=num;data2+="\"";
Serial2.println(data2);
delay(500);
Serial2.print("fall"); //text content
delay(500);
// Serial2.write(26);
Serial2.write(0x1a);
}
//回传数据
void heartbeat()
{
if(humi_read>0)
{
HUMI.print(humi_read); //给blinkerapp回传湿度数据
}
if(temp_read>0)
{
TEMP.print(temp_read); //给blinkerapp回传温度数据
}
if(ADC_MQ5>0)
{
MQ5.print(ADC_MQ5); //给blinkerapp回传湿度数据
}
if(ADC_MQ2>0)
{
MQ2.print(ADC_MQ2); //给blinkerapp回传湿度数据
}
}
//图表
void dataStorage()//云存储温湿度数据函数
{
Blinker.dataStorage("tubiao", humi_read);//存储酒精度数
Blinker.dataStorage("tubiao1", temp_read);//存储酒精度数
Blinker.dataStorage("tubiao2", ADC_MQ5);//存储酒精度数
Blinker.dataStorage("tubiao3", ADC_MQ2);//存储酒精度数
}
//滑块任务0函数
void slider0_callback(int32_t value) //滑块0
{
//Slider0.color("#00FF00");
temp_read_threshold=value;
}
//滑块任务1函数
void slider1_callback(int32_t value) //滑块0
{
//Slider1.color("#00FF00");
humi_read_threshold=value;
}
//滑块任务2函数
void slider2_callback(int32_t value) //滑块0
{
//Slider2.color("#00FF00");
ADC_MQ5_read_threshold=value;
}
//滑块任务3函数
void slider3_callback(int32_t value) //滑块0
{
//Slider2.color("#00FF00");
ADC_MQ2_read_threshold=value;
}
void setup()
{
Serial.begin(115200);//初始化串口
Serial2.begin(115200);
BLINKER_DEBUG.debugAll(); //调试窗口
Blinker.begin(auth, ssid, pswd); //初始化ESP32设备连接网络
Blinker.attachHeartbeat(heartbeat);//注册回调函数
Blinker.attachDataStorage(dataStorage); //图表
Slider0.attach(slider0_callback);//关联滑动开关
Slider1.attach(slider1_callback);//关联滑动开关
Slider2.attach(slider2_callback);//关联滑动开关
Slider3.attach(slider3_callback);//关联滑动开关
//初始化DHT传感器IO工作
dht.begin();
//初始化MQ-5传感器
pinMode(MQ5_pin, INPUT);
//初始化MQ-2传感器
pinMode(MQ2_pin, INPUT);
//初始化蜂鸣器
pinMode(beep, OUTPUT);
digitalWrite(beep,HIGH);
//初始外部引脚1
pinMode(WAIBU1, INPUT);
digitalWrite(WAIBU1,LOW);
//初始化外部引脚2
pinMode(WAIBU2, INPUT);
digitalWrite(WAIBU2,LOW);
}
void loop() {
Blinker.run();
sensor_work();
}
跌倒监测部分:其实这一部分代码量没有多少,只有是数据集的标注,和环境的搭建,模型的训练比较复杂。
模型介绍:
YOLO系列算法自2015年推出以来,以其高精度、高效率和高实用性获得广泛应用。YOLOv1将整张图片输入网络,直接回归框的位置和类别,但存在对小物体检测效果不佳、长宽比不一致导致的识别问题以及定位误差。YOLOv2提高了定位准确度并增加了识别种类,但未完全解决YOLOv1的问题。YOLOv3在模型复杂度上提升,检测精度显著提高,但速度略有下降。YOLOv3使用单一网络评估,性能卓越,但小型物体检测能力有限,精度和召回率都低。YOLOv4适用于实际工作环境,检测速度达到实时级别,降低了训练门槛,实现了速度与精度的平衡。本文所选用的目标检测算法是 YOLOv5。
YOLOv5算法包含五个不同版本:YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l以及YOLOv5x。通常情况下,目标检测算法主要由四个部分构成:输入端、基准网络、Neck网络以及Head输出端。
输入端:接收尺寸为608*608的图片,并进行图像预处理。
基准网络:负责提取图像的通用特征,通常由一些高性能的分类器网络构成。
Neck网络:增强特征的多样性和鲁棒性。
Head输出端:输出目标检测的结果。
观察图像后,可以看到,在五个不同版本中。YOLOv5x的检测准确度最高,但检测速度最慢;而YOLOv5n的检测速度最快,但检测准确度最差。考虑到树莓派5的推理能力,这里选择了yolov5s模型。
数据据制作:在众多图片数据集标注工具中,本文选择LabelImg工具进行数据集标注。
在图片标注任务完成后,LabelImg会创建一个文件来记录标注后的图片详细信息。这个文件格式可以选择的,但是YOLO只支持txt文件格式的数据,
上图中,从左至右的信息分别为标注内容的类别,归一化[16]后的中心点x坐标,y坐标以及归一化后的目标识别框的宽度和高度。在正常情况下,txt文件中,目标类别的数量与文件中的信息行数是一致的。
模型训练:首先在data目录下创建一个fall_data.yaml的数据集配置文件,如下图所示:
接下来在models下建立一个fall_yolov5s.yaml的模型配置文件,内容如下:
最后,需要对train.py文件进行调整,设置所需的迭代次数,并选择合适的模型及其权重。完成这些设置后,就可以开始训练数据集了。训练过程中的所有输出和最终结果都将保存在runs文件夹中。
最终训练出来的结果精度还行,80%以上,勉强可以使用。
PR曲线如下:
跌倒监测数据集:
训练好的权重文件: best.pt
标注好的数据集:由于数据集压缩包大于300mb,有需要的朋友可以留下邮箱,我发你。
五、作品功能演示视频
点灯blinker APP,登入自己的账号进入软件监控界面,环境信息采集结果如图
GSM报警通知内容如下
跌倒测试:
稍后上传
六、项目总结
本次项目主要是用于守护空巢老人。系统由两部分组成:物联网环境监测部分和跌倒行为监测部分。环境监测部分采用ESP32系列微控制器作为核心,利用传感器来监测居住空间的温度、湿度和可燃气体浓度及烟雾浓度,并通过点灯blinker应用程序提供反馈。跌倒行为识别部分则采用YOLOv5目标检测算法,来识别老人是否跌倒,并在检测到跌倒时发出警报。
七,存在的问题及展望
1、由于时间关系,项目只是实现了部分功能,严格来讲原理样机的要求还达不到,后续还需要花时间进一步完善。
2、现有系统设计无法预测跌倒行为。为了提升系统的预警能力,我希望在未来的学习中整合人体姿态估计算法,并将其部署到嵌入式系统中,以便能够对老人的跌倒行为进行早期预测和及时干预。通过这些改进,系统可以更加有效地保障空巢老人的安全,减少潜在的安全风险。
3、树莓派的推理性能确实有点弱,只有10fps不到的样子,后续会考虑加装AI拓展板,或者更换主控。
-
加入了学习《【2024DigiKey创意大赛】基于AIOT的智能家居设备开发演示视频》,观看 【2024DigiKey创意大赛】基于AIOT的智能家居设备开发
- 2024-09-22
-
回复了主题帖:
【2024 DigiKey创意大赛】 物料开箱
很精致嘛
- 2024-09-14
-
加入了学习《DigiKey 应用说:Raspberry Pi 5 在视频直播中的应用》,观看 Raspberry Pi 5 在视频直播中的应用
- 2024-09-09
-
回复了主题帖:
【2024 DigiKey 创意大赛】物料开箱
空耳- 发表于 2024-9-5 10:40
8G不是不报销吗,活动只有4G啊
是我格局小了
- 2024-09-05
-
回复了主题帖:
【2024 DigiKey 创意大赛】物料开箱
8G不是不报销吗,活动只有4G啊
- 2024-08-13
-
回复了主题帖:
【2024 DigiKey 创意大赛】基于树莓派的空巢老人守护系统01-开箱贴
秦天qintian0303 发表于 2024-8-13 15:00
弄个可以移动的视频监控,避免看不到人着急
确实是个好主意,但是好难,哥
- 2024-08-12
-
回复了主题帖:
【2024 DigiKey 创意大赛】基于树莓派的空巢老人守护系统01-开箱贴
damiaa 发表于 2024-8-12 12:46
我手上的2G的树莓派4没敢下手自己焊接改造。
慢慢熟悉一下,还是可以焊的,8g全新120左右,咸鱼便宜点
-
回复了主题帖:
【2024 DigiKey 创意大赛】基于树莓派的空巢老人守护系统01-开箱贴
damiaa 发表于 2024-8-12 11:02
楼主这树莓派5内存是小了。搞个8G的爽点。
正有打算,差不多100快可以淘一个8g的
-
回复了主题帖:
【2024 DigiKey 创意大赛】基于树莓派的空巢老人守护系统01-开箱贴
wangerxian 发表于 2024-8-12 09:29
偷偷告诉你,得捷的箱子都很大~
目前看了很多网友的帖子,暂时发现我的是最大的
-
发表了主题帖:
【2024 DigiKey 创意大赛】基于树莓派的空巢老人守护系统01-开箱贴
本帖最后由 空耳- 于 2024-8-13 12:36 编辑
【2024 DigiKey 创意大赛】基于树莓派的空巢老人守护系统01-开箱贴
首先,很荣幸入围参加这次活动,在这里非常感谢EEWORLD论坛与得捷电子!
这次活动我选择了SC1111,NUCLEO-F411RE,ESP32-C6-DEVKITC-1-N8来参加本次活动。接下来就是开箱环节了。
这是我第一次在得捷购物,虽然是美国发货,但是速度还是很快的。包装也十分霸气,上档次。(我的这个包装箱,可能是本次活动中最大的)
图1 包装外观图
图2是我选择的三款物料,可以看出包装还是很精致的。
图2 物料独立包装
图3为树莓派5 4G版本,主要用于监控图像的采集和推流。后续可以考虑换一个8g的DDR。
图3 树莓派5
图4 为esp32c6主要采集老人的居住环境信息。
图4 esp32c6
图5 为stm32f411 主要采集老人的心率,血氧的身体参数,以及mpu6050辅助判断老人是否发生跌倒等危险情况。(如果时间充足的情况下,我想把这一部分从新规划pcb,做的小巧一点做成手表的形式,就是不知道符合活动要求吗?会不会被判断没有使用必选物料。)
图5 stm32f411
最后本次的开箱环节就到此结束了。再次感谢EEWORLD论坛与得捷电子!
- 2024-07-22
-
回复了主题帖:
【NUCLEO H533RE】基于读写接口实现标准输入输出
怀揣少年梦 发表于 2024-7-10 23:28
好的,可能是USB集线器的问题,现在好了
我也遇到过,typec线太差了
- 2024-07-16
-
回复了主题帖:
【NUCLEO H533RE】32位定时器高精度长时间PWM输出
原理图在哪啊
- 2024-07-08
-
回复了主题帖:
【正点原子i.MX93开发板】2.1 人脸识别考勤机环境搭建--opencv与opencv-contrib(2)
lugl4313820 发表于 2024-7-8 09:02
opencv的版本有什么讲究吗?我前面弄过,就是安装特麻烦。
没啥讲究,就是版本一定要对应
-
上传了资料:
imx93 opencv-4.8.0与opencv-contrib-4.8.0交叉编译的库文件
- 2024-07-01
-
回复了主题帖:
测评入围名单:STM32H5系列新品NUCLEO H533RE测评,追加2个
个人信息无误,确认可以完成测评分享计划
- 2024-06-27
-
回复了主题帖:
免费申请 | 最新一代树莓派(Raspberry Pi 5)!
lightxixi 发表于 2024-6-27 08:34
同时有两个必选物料,大赛最高报销600人民币,您可以根据自己情况来~
谢谢解答
- 2024-06-26
-
回复了主题帖:
免费申请 | 最新一代树莓派(Raspberry Pi 5)!
可以申请8G的版本吗
-
发表了主题帖:
【正点原子i.MX93开发板】2.1 人脸识别考勤机环境搭建--opencv与opencv-contrib(2)
本帖最后由 空耳- 于 2024-7-7 23:53 编辑
紧接上一期
ubuntu下编译
这一次我选择了cmake-gui
//任意目录下输入
cmake-gui
1.选择源码路径
2.选择新建的build文件夹路径
3.点击configure按钮
4.选择 unix makefiles作为目标文件
5.完成
6.再次点击configure按键
7.选择要添加的拓展(找到“opencv_extra_modules_path”这一项,填入contrib包对应的路径,精确到contrib的module文件夹)并且勾选“OPENCV_ENABLE_NONFREE”!;点击configure;再点击Generate;
最后就是编译和安装
make -j16
make install
上面这个问题是,权限不够 加上sudo,再次安装
sudo make install
以上证明安装完成。
交叉编译
本次交叉编译opencv与opencv-conturb遇到了很多问题,走了很多很多弯路。概述如下:
1.本次交叉编译无法直接使用cmake-gui工具,明明已经选择好了交叉编译链gcc和G++的绝对路径,但是cmake-gui就是找不到
2.cmake编译时一定记得启动交叉编译环境
source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux
3,cmake构建时会显示缺少libopenjp2.a的静态库,如下图
4.一定要去github上下载最新的opencv和opencv-conturb,并且切记二者必须版本必须匹配。我就是因为从几年前同步到gitee上下载的opencv,导致遇到了很多古怪的问题。如下:
、
5.虽然使用cmake-gui无法构建,但是我发现通过cmake构建成功后,就可以使用cmake-gui了,毕竟cmake-gui可以图形化选择那些编译那些不编译,比cmake指令编译便捷多了。
交叉编译详细记录过程
(opencv-4.8.0与opencv-contrib-4.8.0)
最后就是我详细编译的记录过程了(第四坑我踩了好久才解决,开始的解决思路是,哪个opencv-contrib子模块报错,我就在cmake-gui里面取消编译它,但是后面又陆续遇到了很多次这个同类型问题,发现不对劲,上网搜索也没遇到解救方法,最后通过在github重新下载源码解决此问题(初步判断是以前同步的库有bug,后续更新了,但是也不排除我没有匹配库版本的问题,所以以后交叉编译时一定要去官网同步最新版本))
1.交叉编译前,一定要先启动交叉编译工具链的环境:source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux(我有一次新开了窗口,忘记启动交叉编译环境,导致又编译了一次x86的,我却浑然不知,知道最后使用时报错,才发现)。
source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux
2.新建一个build文件与一个install文件
mkdir build-arm
mkdir install-arm
进入build目录下,设置cmake构建选项
cd build-linux
ctrl+t//重新开一个新的终端不要有交叉编译的环境
#设置cnake构建选项
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_EXTRA_MODULES_PATH=/home/alientek/opencv/4.8.0/opencv_contrib/modules \
-D CMAKE_INSTALL_PREFIX=/home/alientek/opencv/4.8.0/install-arm \
3,等待报错,内容如下
缺少静态库文件
下载源码
上述问题显示缺少libopenjp2.a的静态库,从github上下载源码,地址如下:Release OpenJPEG 2.4.0 · uclouvain/openjpeg (github.com)
交叉编译
#交叉编译前,一定要先启动交叉编译工具链的环境:
source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/alientek/opencv/openjpeg/openjpeg-2.4.0/install-arm \ ..
sudo make install 安装。
将生成的libopenhp2.a copy到相应的目录下面
sudo cp libopenjp2.a /opt/fsl-imx-xwayland/6.1-mickledore/sysroots/armv8a-poky-linux/usr/lib/
4.执行cmake发现没有报错,接下来就是交叉编译与安装
注意交叉编译的时候一定要把环境启动起来
source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux
make -j16
编译:这次编译罕见一个错误都没有,我都怀疑是不是自己没有开启交叉编译环境(source /opt/fsl-imx-xwayland/6.1-mickledore/environment-setup-armv8a-poky-linux),然后就是自己又花费半小时重新编译,证明确实编译没有错误。当时老呆也是秀逗了,直接查看库文件属性不就完事了,白白浪费半小时。
输入readelf -h 文件名 查看文件属性,确认文件架构不是x86的。
编译完成
make -j16
安装无误。
5.为了方便以后移植管理,我就把linux下的重新编译了一下
编译linux下使用的opencv与opencv-conturb文件
新建一个build文件与一个install文件
mkdir build-linux
mkdir install-linux
进入build目录下,设置cmake构建选项
cd build-linux
ctrl+t//重新开一个新的终端不要有交叉编译的环境
#设置cnake构建选项
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_EXTRA_MODULES_PATH=/home/alientek/opencv/4.8.0/opencv_contrib/modules \
-D CMAKE_INSTALL_PREFIX=/home/alientek/opencv/4.8.0/install-linux \
..
构建完成,输入make -j32进行编译
编译完成,没有报错
安装完成
6.整个构建好的opencv(opencv-4.8.0与opencv-contrib-4.8.0)夸克网盘链接:我用夸克网盘分享了「opencv.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/f73144556018
libopenjp2.a