树莓派摄像头远程拍照及传输
文章目录
- 树莓派摄像头远程拍照及传输
- 前言
- 一、如何调用树莓派摄像头
- 二、远程控制摄像头
- 1、mqtt介绍
- 2.使用mqtt
前言
树莓派是一种只有信用卡大小的微型电脑,携带方便。树莓派功能齐全,体积虽小,但是却有着齐全的功能:视频、音频等功能样样齐全。
树莓派因此得到很多人的喜欢(除了越来越贵之外),而给树莓派加摄像头,又使得它的应用场景非常广阔。
相比于stm32摄像头(一般像素在几十万)等,树莓派的摄像头像素高(一般都在500w)以上,树莓派摄像头应用范围更广,较为清晰的照片可以结合图像识别等技术,打造出各种各样的应用系统。
因此,下面来介绍树莓派摄像头的使用以及给出一个应用场景
一、如何调用树莓派摄像头
在使用摄像头之前,需要打开配置开启摄像头选项
方法如下:
//更新树莓派
sudo apt-get update
sudo apt-get upgrade
//打开配置界面
sudo raspi-config
找到Interfacing Option->Camera,按下回车,会问你是否确定,选择是便可。
使用摄像头拍照或者录视频有两种方法,一种是通过命令行调用摄像头,一种是使用树莓派picamera库。
第一种方法:
拍照 | 录视频 |
raspistill | raspivid |
例子:raspistill -o ./test.jpg | raspivid -o ./test.h264 |
在编写的py文件中想要用到该命令行,可以通过以下代码实现:
import os
os.system("sudo raspistill -o ./test.jpg (-w xxx -h xxx)")
#括号里的可要可不要,拍视频也是同理。
第二种方法:
可以当picamera官方查看该库的使用:
这是官方网址:
https://picamera.readthedocs.io/en/release-1.13/index.html# 使用picamera也非常简单
from time import sleep
from picamera import PiCamera
camera = PiCamera()
camera.resolution = (1024, 768)
camera.start_preview()
# Camera warm-up time
sleep(2)
camera.capture('foo.jpg')
#这是从官网拿的代码,camera.resolution是分辨率,start_preview是预览
要注意的是,start_preview()得树莓派连接屏幕才会有预览效果(也就是在拍照前先给你看摄像机所看到的),若是使用vnc viewer连接时,是没办法看到预览的(但可以调,这里不多介绍)。这是因为VNC的工作原理:VNC是指令传输,到达VNC客户端这边再进行渲染,并不是真正的画面
,因为这样节省了网络带宽。
二、远程控制摄像头
1、mqtt介绍
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。(源于百度百科)
简单举个例子,比如在抖音上你关注了一个美女主播,这相当于订阅了一个主题,而当主播主发布消息时,你订阅了这个主题,所以你就能收到消息。mqtt中有三个主要角色:代理(Broker)、发布者(Publish)、订阅者(Subscriber)。在上面这个例子中,抖音就是Broker,主播就是Publish,而你就是Subscriber。
2.使用mqtt
首先需要安装mqtt模块
pip install paho-mqtt
订阅者的demo:
import paho.mqtt.client as mqtt
#as是取别名,因为它太长了,as为mqtt方便操作
url ="xxxxxxxxxxxx"
PORT = 1883#端口号
def on_connect(client,userdata,flags,rc):
print("Connect with result code"+str(rc))
def on_message(client,userdata,msg):
print(msg.topic+" "+":"+str(msg.payload))
client=mqtt.Client()#创建一个客户端对象
client.on_connect = on_connect#连接时调用on_connect
client.on_message = on_message#收到消息时调用on_message
client.username_pw_set("xxx","xxx")#用户名和密码
client.connect(url,PORT,60)#连接
client.subscribe("xxx")#订阅主题
client.loop_forever()#循环
发布者的demo:
import paho.mqtt.client as mqtt
url ="xxxxxxxxxxxx"
PORT = 1883#端口号
def on_connect(client,userdata,flags,rc):
print("Connect with result code"+str(rc))
client=mqtt.Client()#创建一个客户端对象
client.on_connect = on_connect#连接时调用on_connect
client.username_pw_set("xxx","xxx")#用户名和密码
client.connect(url,PORT,60)#连接
client.publish("xxx(主题)","xxx(发布的内容)",1)
#publish最后一个参数是其服务级别Qos
#QoS 0:消息最多传递一次,如果 Receiver 不可用,则会丢失该消息,容易丢失信息
#QoS 1:消息传递至少 1 次,包含了简单的重发机制,Sender 发送消息之后等待接收者的 ACK,如果没收到 ACK 则重新发送消息。但无法保证消息不会重复发送
#QoS 2:消息仅传送一次,但耗费资源
#用1足够
client.loop_forever()#循环
而要实现远程控制摄像头,则可以这样:
当触发条件达到时,调用发布者这个demo,发布的内容可以是一个信号值,如1、2,1拍照、2录像等,而订阅者就让它一直开着,因为有client.loop_forever(),所以它一直等待着订阅主题的消息,一接收到消息,进行相应判断,进行拍照或者录像等。
拍完照后可将图片传到服务器,如下:
import requests
# 请求文件上传的接口
url = "xxxxxxxxxxxxxxxxxxxx"
# 上传的文件参数
files = { "file": ("test.jpg", open("xxx(图片路径)", "rb"), "image/jpg") }
# 其他的参数
data = { "tag": "nnnnn" }
# 发送请求
re = requests.post(url=url, picture=files, data=data)
# 打印结果
print(re.json())
这样,就完成了简单的拍照、传输了。