树莓派与外部感知

Posted by Hsz on February 27, 2018

树莓派与外部感知

单单一台树莓派只是一个卡片电脑,但接上摄像头接上麦克风他就有了感知外部的能力,配合上喇叭也就有了和人交互的可能.所谓智能音响也是这么个思路的产物.

本文主要是为树莓派配置图像识别环境和语音识别环境的介绍.

图像识别环境

图像识别技术如今已经在很大程度上应用于工业界,而树莓派因为拥有linux环境,所以天然拥有大量相关工具,但无论如何,我们得先有块摄像头.

usb摄像头

随便买一个免驱的usb摄像头,插上后可以通过ls /dev |grep video0查看是否连接上,连上以后我们还需要安装一个包用于访问摄像头

sudo apt install fswebcam

接着就可以使用这个工具拍个照片试试了

排线摄像头(不推荐)

树莓派官方配件中有一颗支持1080p照相摄像的摄像头,某宝价钱大约在150块左右,当然了实际第三方的便宜许多,不过我已经买了也就不多说了.

虽然是低压电,但我们还是应该将电源拔去,然后再进行硬件的连接操作.

硬件安装方式:

  1. 找到网口和hdmi口之间的排线口
  2. 将排线口顶上的挡板提起来(注意不是卸下来,大力出不了奇迹)
  3. 将排线有字的一面朝向网口方向,在排线口朝向hdmi口的一端插下排线
  4. 压下排线口的挡板

设置摄像头:

插上电源后我们使用sudo raspi-config进入树莓派的设置页面,在interfacing options中找到p1 camera. 回车将其设置为enable,之后结束设置,系统会重启.

重启结束后我们可以使用vcgencmd get_camera 查看摄像头的连接状况,如果显示是supported=1 detected=1说明摄像头已经连上了.

我们可以使用raspistill -o keychain.jpg -t 2000来拍一张图试试.

软件环境

opencv是开源的计算机视觉工具,它提供了许多现成的已经在生产环境中实践过的算法,树莓派最常见的机器视觉环境就是基于opencv的. 而在python下另一个常见的图像处理工具是pillow,安装这两个工具对于有miniconda环境的我们来说非常简单,直接使用conda命令安装即可.

opencv安装还是比较复杂的,依赖有:

  • 安装时的工具

      sudo apt-get install build-essential git cmake pkg-config 
    
  • 图片工具包

      sudo apt-get install libjpeg8-dev
      sudo apt-get install libtiff5-dev
      sudo apt-get install libjasper-dev
      sudo apt-get install libpng12-dev
    
  • 视频io包

      sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    
  • 安装GTK

      sudo apt-get install libgtk2.0-dev
    
  • 优化函数的包

      sudo apt-get install libatlas-base-dev gfortran
    
  • 安装正体

      sudo apt-get install libcv-dev
      conda install opencv
    

通用的摄像头操作

使用opencv可以 控制摄像头拍照:

import cv2
cap = cv2.VideoCapture(0)
while(1):
    ret, frame = cap.read()
    name = input("input a name:")
    cv2.imwrite("{name}.jpeg".format(name=name), frame)
    break
cap.release()

上面的代码可以通过输入图片名字然后将当前的图片保存起来.VideoCapture可以获得摄像头的帧流,需要连续拍照可以用如下代码

import cv2
import time
cap = cv2.VideoCapture(0)
fps = 5
size = (
    int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
    int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
)

ret, frame = cap.read()
while ret and fps>0:
    cv2.imwrite("{name}.jpeg".format(name=fps), frame)
    time.sleep(1)
    ret, frame = cap.read()
    fps -= 1
cap.release()
  • *官方摄像头操作

使用官方摄像头的话操作摄像头可以使用picamera模块.比如要拍摄一张照片,可以用以下的python代码拍摄一张照片

from time import sleep
from picamera import PiCamera

with PiCamera() as camera:
    camera.resolution = (1024, 768)
    camera.start_preview()
    # Camera warm-up time
    sleep(2)
    camera.capture('foo.jpg')

更多的可以看官方例子.

音频环境

语音识别依靠麦克风(阵列),树莓派的声卡没有输入功能,因此我们要么买块带输入的声卡通过usb连接树莓派,要么直接买块带输入声卡的usb麦克风. 我在淘宝上10块买了个树莓派用的麦克风,还是可以使用的.

接上后可以使用lsusb查看usb设备,比没差时多出来的就是麦克风了.

而语音播放的话我们只要插个小喇叭就好,我们可以去raspi-config>Advanced Options>Audio路径下调整音量.

录音

有了麦克风就可以使用arecord来录音

sudo arecord -D "plughw:1,0" -d 5 temp.wav

音频解码依赖

最常见的音频格式就是mp3和wav了,

  • WAV

    wav是最通用的音频文件格式,可以安装omxplayer来进行播放

      sudo apt install omxplayer
    

    要播放可以

      omxplayer -o local temp.wav
    

    python的标准库就提供了读取和写入wav格式的模块wave.而scipy也提供了scipy.io.wavfile来读写wav格式的音频文件. 而操作wav格式的音频更好的方式是使用pygame,安装pygame需要安装如下依赖

      sudo apt install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev 
      sudo apt install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
      pip install pygame
    

    另一个python下的工具是pyaudio,需要安装依赖sudo apt-get install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev,之后就可以使用pip安装pyaudio了.这个库可以读可以放,中途也可以做处理.

  • MP3

    要播放mp3,需要安装mpg123来进行解码.

      sudo apt install mpg123
    

    要播放可以使用mpg123 -q "AKINO - 海色.mp3"这样的命令行指令来执行. 而通常python没有办法直接读取MP3,我们可以使用pydub将其转换为wav.

      from pydub import AudioSegment
    
      song = AudioSegment.from_mp3("original.mp3")
      song.export("final.wav", format="wav")