基于树莓派3B+ 官方摄像头 两个指示灯 以及基于目标检测SSD算法实现的树莓派口罩检测
项目演示: 链接
口罩检测项目地址
使用的口罩检测 项目是AIZOO团队实现的 使用的是目标检测常用的SSD算法。
该团队也提供了数据集,大家也可以自己去训练一下。
(由于疫情在家 连不上实验室的服务器我还无法训练)
项目GitHub链接
(最后那几帧是做GIF图的问题…)
AIZOO团队给出的 代码在Windows上很容易以跑通。安装opencv和kears比较容易。也不需要很复杂的更改代码。
下面重点讲在树莓派上的配置以及使用
树莓派配置
参考链接有很多基础配置
对树莓派进行换源 进行网络配置等等
1.配置环境
使用python版本是 python3 (我使用的是python3.5)
opencv以及kears 这两个库在树莓派上比较难以安装
参考我博客里面 都有两个的安装教程
树莓派上安装opencv以及各种采坑
opencv要耐心仔细装,容易出错!!!
树莓派安装kears
2. 树莓派摄像头
硬件安装 :
- 将摄像头排线露出金属的部分背对网孔和usb接口,即另一面的蓝色塑料封皮正对网孔和usb接口
- 小心地将接线板上的黑色塑料往上拉(请务必保证电源关闭,手指干燥)
- 将排线插入,黑色塑料往下压紧排线
摄像头启用以及测试
打开Raspberry Pi配置工具开启Camera
终端输入 ls /dev/ 进行验证
如果输出内容中有video0 跳过下一步
ls /dev/无 video0:
1、输入 sudo raspi-config
先在interfacing option里把camera接口打开(enable)。
2、如果使用的是树莓派官方摄像头,还需输入sudo modprobe bcm2835-v4l2
输入这行命令,发现/dev/下已经有摄像头的设备了。
这句话相当于加载驱动模块,每次开机都要开启,摄像头才能使用。
可以将这条命令放入 /etc/rc.local 文件中,让其自启动。
树莓派摄像头Camera的使用
python调用摄像头
from picamera import PiCamera
from time import sleep
camera = PiCamera()
# Rotate by 180 degrees when the camera is upside-down
camera.rotation = 180
camera.start_preview(alpha=200) # Make the camera preview see-through by setting an alpha level from 0 to 255
sleep(5)
camera.stop_preview()
上述代码实现打开摄像头预览5秒钟再关闭的功能。但是如果这个程序仅在Raspberry Pi接入了显示器才有效,SSH或是VNC访问是无效的。
Raspberry Pi 摄像头模块入门
opencv调用摄像头
- 使用opencv直接打开摄像头
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):
# get a frame
ret, frame = cap.read()
# show a frame
cv2.imshow("capture", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
如果打不开摄像头 去上面看是不是没有video0
- 树莓派获取到视频流给opencv
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
camera.hflip = True
camera.vflip = True
rawCapture = PiRGBArray(camera, size=(640, 480))
# allow the camera to warmup
time.sleep(0.1)
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
# grab the raw NumPy array representing the image, then initialize the timestamp
# and occupied/unoccupied text
image = frame.array
# show the frame
cv2.imshow("Frame", image)
key = cv2.waitKey(1) & 0xFF
# clear the stream in preparation for the next frame
rawCapture.truncate(0)
# if the `q` key was pressed, break from the loop
if key == ord("q"):
break
推荐使用第一种方式 简单
参考链接Raspberry调用picamera库控制自带的摄像头
python控制树莓派GPIO
要用到两个led灯 所以要在代码里面控制GPIO
安装库
sudo apt-get install python-rpi.gpio
示例代码
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD编号方式,基于插座引脚编号
GPIO.setmode(GPIO.BOARD)
# 输出模式
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
GPIO.output(13, GPIO.HIGH)
time.sleep(1)
GPIO.output(13, GPIO.LOW)
time.sleep(1)
GPIO.output(15, GPIO.HIGH)
time.sleep(1)
GPIO.output(15, GPIO.LOW)
time.sleep(1)
两个led灯一个 接两个普通输出引脚就行。另外记得接地。
我用的是一个13 一个是15
更改代码、完善代码
现在环境配置好了
可以调用摄像头 可以控制GPIO了
只需要:
- 根据上面的口罩检测的项目放到树莓派上
- 改动代码增加GPIO的部分
- 改动输入参数部分
- 根据运行情况更改检测帧率
我改好的代码(pi_cam.py)会放到下面。
运行报错out of memory
树莓派性能不行 跑起来还是有点费劲
1.增加可用内存量(减少分配给GPU的内存)
- sudo raspi-congfig 启动树莓派配置程序, advanced options->memory split
- 分给GPU的内存量设为32(如果设为16或0,系统会默认分配64M,就不能做到内存占用最少)。
- 需要注意的是如果启用摄像头,则GPU会自动被分配128M内存。
2.关掉图形化界面
sudo raspi-config
不再报出out of memory
但是卡顿的情况依然存在
再改代码:
- 增加检测帧数
- 简化代码将opencv无用部分删除(这样看不到画面了只能通过灯珠变化和终端 判断情况)
项目演示: 链接
else
根据上面的教程大家可以自己写打开树莓派摄像头检测并控制灯,也可以看我写好的。
大家对物联网 计算机视觉的应用感兴趣的可以关注我,我博客内有相关文章,后续也会发一下类似的应用型文章(可以用来学习以及参加比赛或者做毕设)
使用方法: 将前面提到的AIZOO团队提供的项目下载下来。以及我写的pi_cam.py下载下来。放入同一目录下,上传到树莓派中(按照上面步骤 配置好环境 )。
命令行进入目录直接调用就可以,
python pi_cam.py
(如果python默认是python2.7 则要使用python3 pi_cam.py)
命令行中关掉 运行程序
ps -ef |grep pi_cam.py
有什么问题可以评论交流。
感觉有用的或者帮助到你的可以收藏 点赞 关注。