Hoody's Blog
树莓派3B+ 搭建摄像头服务 简介

背景

想给家里做个监控,方便网络监控 正好树莓派的摄像头又便宜.只要几十块 于是买了个这 摄像头图

安装 摄像头

图就用了买的店铺图

安装图

启用摄像头

树莓派专用摄像头已经内置了驱动.
所以只需要从配置中启用就可以了

1.从命令行启动raspi-config

sudo raspi-config

2.选择Interface Options

raspiconfig.PNG

3.选择Camera

camera.PNG

4.启用

enable

然后选择Finish,重启树莓派即可

使用 命令行 对摄像头进行控制

官方文档参考raspicam commands
raspistill命令
raspivid命令

raspistill 命令进行拍照

拍摄照片,并在当前目录保存为cam.jpg

raspistill -o cam.jpg

垂直翻转和水平翻转

将相机倒置放置后,图像必须旋转180°才能正确显示。纠正这种情况的方法是通过传入-vf和-hf标志来应用垂直和水平翻转:

raspistill -vf -hf -o cam2.jpg

设置图片尺寸

通过-h-w 设置拍照尺寸

raspistill -w 600 -h 800 -o cam3.jpg

使用raspivid命令进行摄像

拍摄视频,并保存为文件vid.h264

raspivid -o vid.h264

这将将5秒视频文件保存到此处给出的路径vid.h264(默认时间长度)。

指定视频时间长度

要指定所拍摄视频的长度,请-t使用毫秒数传递该标志。 例如:

raspivid -o video.h264 -t 10000

这将保存一个10秒的视频 到video.h264文件

水平翻转 / 垂直翻转 视频

使用-hf-vf参数调整

raspivid -hf -o vid.h264

MP4视频格式

树莓派默认将图像录制为原始H264视频流。
许多媒体播放器不支持播放,或者以不正确的速度播放.
所以需要用包装格式保存比如MP4
从raspivid命令获取MP4文件的最简单方法是使用MP4Box

1.安装MP4Box

sudo apt-get install -y gpac

2.将视频包装成MP4格式

# 拍摄 30s的视频,画面640x480 比特率 150kB/s并保存文件名 pivideo.h264 
raspivid -t 30000 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o pivideo.h264 

# 包装视频到mp4格式 
MP4Box -add pivideo.h264 pivideo.mp4

使用Python控制树莓派摄像头

使用Python库 Picamera

注意:不能使用picamera.py作为文件名,很重要

1.拍照

  • 设置分辨率 1024 x 768
  • 保存图片到当前目录: foo.jpg
  • 图像旋转180度

camera.py

from picamera import PiCamera
from time import sleep

camera = PiCamera() #得到摄像头实例

camera.resolution = (1024, 768) # 设置分辨率
camera.rotation = 180 # 控制摄像头旋转180度
ccamera.capture('foo.jpg') 拍摄并保存图片到当前目录 

2.拍摄视频

  • 拍摄60秒
  • 分辨率 640 x 480
  • 保存文件名my_video.h26
from picamera import PiCamera
from time import sleep

camera = PiCamera() #得到摄像头实例
camera.resolution = (640, 480)
   camera.start_recording('my_video.h264')
   camera.wait_recording(60)
   camera.stop_recording()

搭建一个Web服务,收到请求后拍照并返回图像

由于不会Python,所以将就看吧
能够正常运行

server.py 源码

from http.server import BaseHTTPRequestHandler
from urllib import parse
import sys
import os
import time
import picamera

# web请求处理对象
class GetHandler(BaseHTTPRequestHandler):
    # 处理所有get请求
    def do_GET(self):

    # 启动相机,并预热2秒,然后拍照,保存为 foo.jpg
        with picamera.PiCamera() as camera:
            camera.resolution = (1920, 1080)
            camera.start_preview()
            time.sleep(2)
            camera.capture("foo.jpg")

    # 获取当前目录,并且获取图片文件
        full_path = os.getcwd() + "/foo.jpg"
        img = open(full_path, "rb") # rb 以文件流打开文件
    content = img.read() # 读取流到变量

    #响应码200
        self.send_response(200)
    #设置返回媒体类型
        self.send_header('Content-Type', 'image/jpeg')
    #指定响应文件名
        self.send_header('Content-Disposition', 'attachment; filename="foo.jpg"')
        self.end_headers()
    # 响应中写入文件流
        self.wfile.write(content)


if __name__ == '__main__':
    from http.server import HTTPServer
    port = 80 # 监听端口
    server = HTTPServer(('0.0.0.0', port), GetHandler)
    print("listen on " + str(port))
    print('Starting server, use <Ctrl-C> to stop')
    server.serve_forever()

启动服务

sudo python server.py

listen on 80
Starting server, use <Ctrl-C> to stop

现在即可访问 http://your-raspi-IP:80
随后得到拍摄的照片文件

添加新评论,支持Markdown格式