1.设计目标
- 需求:家里燃气度数的读数上报,每个月需在社区微信群里将手机拍摄的燃气表读数截图(加住址信息水印),发到群里给抄表员
- 目标:手机上随时可以远程采集读数图片(自动加住址信息水印),在微信上发送给社区抄表员。
2.总体设计


3.燃气抄表采集端
使用树莓派(两点理由,第一支持Type-C供电且低功耗,可以加移动电源长期运行,第二支持GPIO,以后加传感器有扩展空间),部署Docker环境。
https://www.raspberrypi.com/software/

使用树莓派官网的系统安装工具完成系统安装,安装完成之后部属宝塔BT系统进行系统管理。
https://www.bt.cn/new/download.html

3.1 功能描述
接收管理服务器实时采集请求,实现燃气表拍照的采集上报,摄像头采集之前要自动打开小夜灯照明,厨柜内较黑拍不清楚。
3.2 容器配置
3.2.1 Dockerfile-GAS-ARM文件
FROM ubuntu:latest
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractive
RUN 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
RUN apt-get install -y python3-opencv
RUN apt clean \
&& rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp* \
RUN apt autoremove
WORKDIR /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 install
# Install opencv-python
RUN pip3 install --upgrade pip -i https://pypi.mirrors.ustc.edu.cn/simple/
RUN pip3 install paho-mqtt pytest-shutil requests -i https://pypi.mirrors.ustc.edu.cn/simple/
WORKDIR /home
CMD ["/bin/bash"]
3.2.2 docker-compose.yaml文件
version: "3.3"
services:
#燃气采集设备端
#docker exec -it gas_meter_reading_t /bin/bash
gas_meter_reading_t:
build:
context: ./
dockerfile: Dockerfile-GAS-ARM
image: gas_meter_reading:v1
container_name: gas_meter_reading_t
working_dir: /workspace
devices:
- /dev/video0:/dev/video0
volumes:
- ./workspace:/workspace
restart: always
tty: true
privileged: true
3.3 采集代码

#!/usr/bin/python3
import base64
import asyncio
import paho.mqtt.client as mqtt
import cv2
import subprocess
import datetime
import threading
import time
import json
import shutil
class GMRDevice:
def __init__(self, cam_simulate=False):
self.mqtt_server_ip = '58.212.21.66'
self.usbhub = '1'
self.hubport = '1'
self.client = mqtt.Client()
self.cam_simulate = cam_simulate
def get_img_path(self):
now = datetime.datetime.now()
img_name = "{:04d}{:02d}{:02d}{:02d}{:02d}{:02d}".format(
now.year,
now.month,
now.day,
now.hour,
now.minute,
now.second
)
print("当前时间:{}".format(img_name))
return './images/' + img_name + '.jpg'
#夜灯开关
def set_led(self, cmd):
try:
output = subprocess.check_output(
["uhubctl", "-l", self.usbhub, "-p", self.hubport, "-a", cmd],
stderr=subprocess.STDOUT)
print(output.decode("utf-8"))
except subprocess.CalledProcessError as e:
print("命令执行失败:", e.output.decode("utf-8"))
#摄像头拍照
def gas_meter_photography(self, imgPath):
if self.cam_simulate == True:
print('gas_meter_photography simulate(true)')
shutil.copyfile('./''simulate''.jpg', imgPath)
return True
print('gas_meter_photography simulate(false)')
self.set_led('on')
time.sleep(1)
isOK = False
cap = cv2.VideoCapture(0)
if cap.isOpened():
print('宽:', cap.get(cv2.CAP_PROP_FRAME_WIDTH) )
print('高:', cap.get(cv2.CAP_PROP_FRAME_HEIGHT) )
print('帧率:', cap.get(cv2.CAP_PROP_FPS) )
print('亮度:', cap.get(cv2.CAP_PROP_BRIGHTNESS) )
print('对比度:', cap.get(cv2.CAP_PROP_CONTRAST) )
print('饱和度:', cap.get(cv2.CAP_PROP_SATURATION) )
print('色调:', cap.get(cv2.CAP_PROP_HUE) )
print('曝光度:', cap.get(cv2.CAP_PROP_EXPOSURE) )
#cap.set(cv2.CAP_PROP_CONTRAST, 100)
#cap.set(cv2.CAP_PROP_EXPOSURE, 200)
#cap.set(cv2.CAP_PROP_BRIGHTNESS, 100)
__, frame = cap.read()
farm = cv2.resize(frame, dsize = (1600,

最低0.47元/天 解锁文章
5277

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



