家庭燃气表微信抄表识别系统

1.背景需求

目前家里燃气度数的读数上报,每个月在社区微信群里面将手机拍摄的燃气表读数截图(加住址信息水印),发到群里给抄表员。

2.总体设计

在这里插入图片描述
在这里插入图片描述

设计目标
功能一:手机上随时可以远程采集读数图片(自动加住址信息水印),在微信上发送给社区抄表员。
功能二:每小时采集一次,统计燃气每日使用状况,对使用情况进行分析和预警(由于OCR还需要进一步提升识别能力,暂不实现)。
功能三:燃气漏气检测(因测试有一定危险,暂不实现)。

3.采集系统

使用树莓派,部署Docker环境。

3.1 功能描述

接收管理服务器实时采集请求,实现燃气表拍照的采集上报,摄像头采集之前要自动打开小夜灯照明,厨柜内较黑拍不清楚。

3.2 容器环境配置

3.2.1 Dockerfile文件

FROM ubuntu:latest
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractiveRUN apt-get update
RUN apt install -y openssh-client openssh-server
RUN apt-get install -y wget curl git telnet vim make gcc 
RUN apt-get install -y python3 python3-pip libpcre3 libpcre3-dev python3-opencvRUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN echo "Port 8422" >> /etc/ssh/sshd_config
RUN echo 'root:cw' | chpasswd
RUN mkdir /var/run/sshdEXPOSE 8422RUN apt clean \&& rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp* \
RUN apt autoremoveWORKDIR /tmp
RUN apt-get update
RUN apt-get upgrade -y
RUN apt install -y libusb-1.0-0-dev
RUN git clone https://github.com/mvp/uhubctl
WORKDIR /tmp/uhubctl
RUN make && make installRUN pip3 install paho-mqtt pytest-shutil requests -i https://pypi.mirrors.ustc.edu.cn/simple/ WORKDIR /home
CMD ["/usr/sbin/sshd","-D"]

3.2.2 docker-compose.yaml文件

version: "3.0"
services:#燃气采集设备端#docker exec -it gas_meter_reading_t /bin/bashgas_meter_reading_t:build: .image: gas_meter_reading:v1container_name: gas_meter_reading_tworking_dir: /home
#    devices:
#      - /dev/video0:/dev/video0ports:- 8422:8422volumes:- ./home:/homerestart: alwaystty: trueprivileged: true

3.3 代码样例

3.3.1 控制USB小夜灯代码样例

#uhubctl 控制 usb 的供电情况,然后控制灯的状态
#控制命令:sudo uhubctl -l location -p port -a off
#location是USB集线起的位置,port是USB编号,off关闭,on打开;
uhubctl --help
uhubctl -l 2 -p 1 -a off
uhubctl -l 2 -p 1 -a on

3.3.2 摄像头拍摄代码样例

import cv2 as cv
cap = cv.VideoCapture(0)
if cap.isOpened():_, frame = cap.read()farm = cv.resize(frame, dsize = (1080,1080) )cv.imwrite(r"/20231020/220301.jpg",farm)

4.管理系统

系统环境要求:LINUX系统,支持Docker环境。

4.1 容器环境配置

4.1.1 Dockerfile文件

FROM ubuntu
RUN apt update
RUN apt upgrade -y
RUN apt install -y wget libgl1 libglib2.0-dev python3 pip curl inetutils-ping graphicsmagick# Install nvm
RUN apt install -y git
RUN git clone http://github.com/creationix/nvm.git /root/.nvm;
RUN chmod -R 777 /root/.nvm/;
RUN bash /root/.nvm/install.sh;
RUN export NVM_DIR="$HOME/.nvm";
RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc;RUN bash -i -c 'nvm install 16'
RUN bash -i -c 'npm install -g pnpm'CMD ["/bin/bash"]

4.1.2 Dockerfile_OCR

FROM ubuntu
RUN apt update
RUN apt upgrade -y
RUN apt install -y wget libgl1 libglib2.0-dev python3 pip curl inetutils-ping graphicsmagick# Install nvm
RUN apt install -y git
RUN git clone http://github.com/creationix/nvm.git /root/.nvm;
RUN chmod -R 777 /root/.nvm/;
RUN bash /root/.nvm/install.sh;
RUN export NVM_DIR="$HOME/.nvm";
RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc;RUN bash -i -c 'nvm install 16'
RUN bash -i -c 'npm install -g pnpm'CMD ["/bin/bash"]

4.1.3 docker-compose.yaml

version: '3.3'
services:#Gas meter reading platform:燃气采集平台#docker exec -it gmrplat_t /bin/bashgmrplat_t:build: .image: gmrplat:v1volumes:- ./home:/homecontainer_name: gmrplat_tports:- 8477:8477- 8488:8488restart: alwayscommand: /bin/bashtty: truenetworks:back_net:ipv4_address: 172.77.1.5#百度AI/图像识别#docker exec -it paddle_ocr_t /bin/bash  paddle_ocr_t:container_name: paddle_ocr_tbuild:context: ./dockerfile: Dockerfile-OCRimage: gmr_paddle_ocrvolumes:- ./PaddleOCR:/PaddleOCRtty: trueprivileged: truerestart: alwayscommand: /bin/bashnetworks:back_net:ipv4_address: 172.77.1.6#开源物联网MQTT服务器(https://www.emqx.com/)#初始用户名密码:admin/public#docker exec -it emq_t /bin/bashemq_t:container_name: emq_timage: emqx/emqx:5.3.0ports:- 1883:1883- 8083:8083- 8084:8084- 8883:8883- 18083:18083restart: alwaystty: truenetworks:back_net:ipv4_address: 172.77.1.7#开源数据库,兼容MYSQLmariadb_t:container_name: mariadb_timage: mariadbenvironment:- MYSQL_ROOT_PASSWORD=cjy- MYSQL_DATABASE=gmrplat- MYSQL_USER=cjy- MYSQL_PASSWORD=cjyrestart: alwaysnetworks:back_net:ipv4_address: 172.77.1.8#数据库WEB后台管理phpmyadmin_t:container_name: phpmyadmin_timage: phpmyadmin:5.2-apacheports:- 4090:80environment:- PMA_ARBITRARY=1- PMA_HOST=172.77.1.8- PMA_PORT=3306- PMA_USER=root- PMA_PASSWORD=cjyrestart: alwaysnetworks:back_net:ipv4_address: 172.77.1.9#自定义容器网络
networks:back_net:ipam:driver: defaultconfig:- subnet: 172.77.1.0/24

4.2 图像识别系统

百度开源AI:https://github.com/PaddlePaddle/PaddleOCR
在这里插入图片描述照片OCR识别样例代码

from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR(use_angle_cls=True, lang="en")
img_path = './ppocr_img/imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]for line in res:print(line)

4.3 远程抄表前台系统

主要代码,不是全部。

<script setup>
import { ref } from 'vue'
import 'weui';
import axios from 'axios';async function get_gmr_img() {console.log('get_gmr_img')try{let res = await axios.get('/api/gmr_img_now');console.log(res);let result = res.data;console.log(result);res = await axios.get('/api/gmr_get_last_img');console.log(res);result = res.data[0];console.log(result.img_name);const imgUrl = 'http://58.212.21.66:8488/images/mask_' + result.img_name;document.getElementById('gmr_img').src = imgUrl}catch{console.log('请求失败');}
}
</script><template><img id="gmr_img" src="/favicon.ico" class=gmr_img><button class="weui-btn weui-btn_primary" @click="get_gmr_img">立即更新</button><div style="text-align:center;" id="actionsheet1" class="weui_actionsheet_cell">长按燃气表图片2秒转发给抄表员</div>
</template><style scoped>
.gmr_img {width:  100vw;height: 80vh;
}
</style>

4.4 远程抄表后台系统

CREATE TABLE `gmrinfo` (`id` bigint(12) NOT NULL,`gather_time` datetime NOT NULL DEFAULT current_timestamp(),`img_name` varchar(30) NOT NULL,`img_ocr` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
const {promises:fs} = require("fs");
const moment = require('moment');
const Koa    = require('koa');
const Router = require('koa-router');
const koa_static  = require('koa-static');
const bodyParser  = require('koa-bodyparser');
const mqtt        = require('mqtt');
const axios       = require('axios');
const knex   = require('knex'); //https://knexjs.org/
const gm     = require('gm');const OCR_SERVER_IP    = '172.77.1.6'
const OCR_SERVER_PORT  = 8466const MQTT_SERVER_IP   = '172.77.1.7'
const MQTT_SERVER_PORT = 1883const DB_SERVER_IP     = '172.77.1.8'
const DB_USER          = 'cjy'
const DB_PWD           = 'cjy'
const DB_NAME          = 'gmrplat'const GMRPLAT_SERVER_PORT = 8488const db = knex({client: "mysql2",connection: {host: DB_SERVER_IP,port: 3306,user: DB_USER,password: DB_PWD,database: DB_NAME,},
});const WWWROOT = __dirname + '/public'
const IMGDIR  = WWWROOT + '/images/'//图像识别
const GMRToOCR = async (imgfile) => {const url = "http://" + OCR_SERVER_IP + ":" + OCR_SERVER_PORT + "/GMROCR"const bitmap = await fs.readFile(imgfile);const adata = {request_id: '001',img_base64: ''}adata['img_base64'] = Buffer.from(bitmap).toString('base64');const res = await axios.post(url, adata);console.log(res.data)console.log(res.data.ocr_res)return res.data
}const client = mqtt.connect("mqtt://" + MQTT_SERVER_IP + ":" + MQTT_SERVER_PORT);
client.subscribe("gmrdev/fixedtime")client.on('message', async (topic, payload) => {console.log('Received Message:', topic);const base64EncodedfileData = payload.toString();const fileDataDecoded = Buffer.from(base64EncodedfileData,'base64');const img_name = moment(Date.now()).format('YYYYMMDDHHmmss');fs.writeFile(IMGDIR + img_name + ".jpg", fileDataDecoded, err => {})await gmr_add_img(img_name + ".jpg")gm(IMGDIR + img_name + ".jpg").stroke("blue") //字体外围颜色.fill("blue")   //字体内围颜色(不设置默认为黑色).font("./AlibabaPuHuiTi-3-65-Medium.ttf", 60) //字库所在文件夹和字体大小.drawText(50,50, img_name + "\nXX街道X小区X幢X室").write(IMGDIR + "mask_" + img_name + ".jpg", function (err) {if (!err) console.log('gm_ok');else console.log(err);});//const ocr_res = await GMRToOCR(IMGDIR + img_name + ".jpg");
});const app_http   = new Koa()
app_http.use(bodyParser());app_http.use(async (ctx, next) =>{await next();ctx.set("Access-Control-Allow-Origin", "*");ctx.set("Access-Control-Allow-Headers", "Content-Type");ctx.set("Access-Control-Allow-Methods", "*");
});app_http.use(koa_static(WWWROOT, {index: true, hidden: false,defer: true
}))const gmr_add_img = async (img_name) => {console.log('gmr_add_img:' + img_name)await db('gmrinfo').insert({img_name: img_name})
}const gmr_img_now = async (ctx) => {console.log('gmr_img_now')client.publish('gmrplat/nowtime', 'now')ctx.body = 'OK'
}const gmr_get_last_img = async (ctx) => {let result = await db("gmrinfo").select(["id", "gather_time","img_name","img_ocr"]).orderBy('id', 'desc').limit(1)console.log(result)ctx.body = result
}const router  = new Router();
router.get('/api/gmr_img_now', gmr_img_now);
router.get('/api/gmr_get_last_img', gmr_get_last_img);app_http.use(router.routes());app_http.listen(GMRPLAT_SERVER_PORT, '0.0.0.0', () => {console.log(`服务启动:http://58.212.21.66:${GMRPLAT_SERVER_PORT}`);
})

5.系统演示

配套代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uniapp 酷炫钱包页面模板 直接引用

使用教程 直接引用Vue页面 即可 <template><view><TCqianbao></TCqianbao></view> </template> <script>import TCqianbao from /uni_modules/TC-qianbao/pages/index.vueexport default {components:{TCqianbao},} </script&…

云服务器搭建Hadoop分布式

文章目录 1.服务器配置2.Java环境3. 安装Hadoop4. 集群配置5. 编写集群的启动脚本 1.服务器配置 服务器主机名配置115.157.197.82s110核115.157.197.84s210核115.157.197.109s310核115.157.197.31s410核115.157.197.60gracal10核 所有的软件安装在/opt/module下&#xff0c;软…

GIL全局解释器锁

文章目录 GIL全局解释器锁一、引入&#xff1a;二、常用的Python解释器种类有哪些&#xff1f;1、CPython2、IPython3、PyPy4、Jython5、IronPython 三、GIL介绍四、GIL与Lock五、GIL与多线程总结 GIL全局解释器锁 一、引入&#xff1a; 首先要明白&#xff0c;GIL并不是Pyth…

工作中几个问题的思考

对于需要并行多公司并行处理的任务&#xff0c;方案是什么&#xff1f; 多线程、并行流、并发库&#xff08;ExecutorService、Futrue、Callable&#xff09;&#xff0c;分布式计算&#xff08;1&#xff09;按照公司ID分片 &#xff08;2&#xff09;按照业务类型分片 处理…

【驱动开发】创建设备节点、ioctl函数的使用

一、控制三盏灯的亮灭 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #def…

Apache Jmeter测压工具快速入门

Jmeter测压工具快速入门 一、Jmeter介绍二、Jmeter On Mac2.1 下载2.2 安装2.2.1 环境配置2.2.2 初始化设置 2.3 测试2.3.1 创建JDBC Connection Configuration2.3.2 创建线程组2.3.3 创建JDBC Request2.3.4 创建结果监控2.3.5 运行结果 2.4 问题记录2.4.1 VM option UseG1GC异…

Power BI 傻瓜入门 5. 准备数据源

本章内容将介绍&#xff1a; 定义Power BI支持的数据源类型探索如何在Power BI中连接和配置数据源了解选择数据源的最佳做法 现代组织有很多数据。因此&#xff0c;不用说&#xff0c;微软等企业软件供应商已经构建了数据源连接器&#xff0c;以帮助组织将数据导入Power BI等…

PAM从入门到精通(二十)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十九&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 七、PAM-API各函数源码详解 前边的文章讲解了各PAM-API函…

图像信号处理板设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678&#xff0c;1片Xilinx FPGA XC7K420T-1FFG1156&#xff0c;1片X…

Linux进程(四)--进程地址空间(一)

前言&#xff1a;在Linux中&#xff0c;每个正在运行的进程都有自己独立的虚拟地址空间&#xff0c;该虚拟地址空间是逻辑上的抽象&#xff0c;用于在进程间提供隔离和保护。它将进程的内存分配和访问从物理内存中分离出来&#xff0c;为每个进程提供了一个独立的地址空间。这究…

零基础搭建个人网站详细流程

最近两天&#xff0c;为了给自己的工具类APP备案&#xff0c;买了阿里云ECS和域名。虽然很想说离线工具APP不用联网&#xff0c;但是现实就很无语。言归正传&#xff0c;既然买了总不能将它们闲置着&#xff0c;就诞生了建站的想法&#xff0c;至少还能放个用户协议和隐私协议。…

FFmpeg和rtsp服务器搭建视频直播流服务

下面使用的是ubuntu的&#xff0c;window系统可以参考&#xff1a; 通过rtsp-simple-server和ffmpeg实现录屏并发布视频直播_rtsp simple server_病毒宇宇的博客-CSDN博客 一、安装rtsp-simple-server &#xff08;1&#xff09;下载rtsp-simple-server 下载地址&#xff1a;R…