树莓派遇上 Java 05:摄像头篇

本文时间久远,部分内容可能过时,仅供参考。

制作遥控机器人会希望它能实时传输画面到控制器,而且为获得更大灵活性一般将摄像头固定在由舵机控制的两自由度云台上,使之可以横向竖向旋转拍摄各个方向的画面。

树莓派支持两种类型摄像头,普通 USB 摄像头和专用的 Pi Cam,都能在淘宝找到,后者某些型号具有红外夜视能力,价格高一些。

这里以树莓派专用的Pi Cam为例,介绍摄像头的基本使用方法。

树莓派 RaspberryPi 摄像头 Camera

Pi Cam 接在树莓派中部的 CSI 接口上,不需要额外供电。在马达篇提过,建议为树莓派使用独立电源通过 USB 口供电而不要从驱动马达的 L298N 取电,否则在摄像头开启瞬间树莓派可能会因为电压不稳重启。

这个项目只是玩具,使用一种简单方式传输图像,由 MJPG-Streamer 调用摄像头拍摄画面发送到指定端口,同一局域网中的浏览器访问树莓派 IP 即可显示实时画面。

首先在设置中开启摄像头:

sudo raspi-config

简单的拍照命令:

# 拍照并将照片旋转 180 度
raspistill -o image.jpg -rot 180

安装 MJPG-Streamer 依赖库:

sudo apt install libjpeg8-dev cmake

下载 MJPG-Streamer 并解压:

unzip mjpg-streamer-master.zip

切换到解压后的路径下编译安装:

cd  ~/mjpg-streamer-master/mjpg-streamer-experimental
make
sudo make install

将 MJPG-Streamer 加入环境变量,编辑/etc/profile在文件底部添加路径:

export LD_LIBRARY_PATH=/opt/mjpg-streamer-master/mjpg-streamer-experimental/

启动摄像,图像旋转 180 度、分辨率 320x240、30FPS、输出到 8080 端口:

# 如果是 USB 摄像头,将 input_raspicam.so 改为 input_uvc.so
mjpg_streamer -i "input_raspicam.so  -rot 180 -x 320 -y 240 -fps 30" -o "output_http.so –p 8080 -w /usr/local/www"

在浏览器中输入以下地址查看传输的图像:

# 静态图片
http://树莓派IP:8080/?action=snapshot
# 动态图像
http://树莓派IP:8080/?action=stream
# 动态图像
http://树莓派IP:8080/javascript_simple.html

以上是树莓派摄像头的基本操作方法,Android 控制端可内嵌 WebView 接受图像,同时监听触控事件,手指滑动时控制云台旋转让摄像头随之指向对应角度,是非常好的操控体验。

那么当摄像头正在工作时如何远程关掉它呢?比如 MJPG-Streamer 正在传输视频,现在要调用摄像头拍照,必须先使占用摄像头的程序释放,可使用 Linux 命令配合进程名终结 MJPG-Streamer 进程。

# 列出所有运行进程,找到所需进程名
ps -eo pid,comm,cmd

根据进程名终结指定进程:

killall [进程名]

摄像头传输的视频质量需结合实际网络状况定义,搭配合适的 FPS 和分辨率使画面流畅显示。若网络不佳出现断流,刷新浏览器即可。

arrow_upward